summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Whitton <spwhitton@spwhitton.name>2019-01-19 10:11:25 -0700
committerSean Whitton <spwhitton@spwhitton.name>2019-01-19 10:11:25 -0700
commita42399f1b9a25ac84f7e82f412780a4db9efc7c0 (patch)
tree6f6dbcea643ff61cd85b5b2e56217502ea4002ec
parent10d0759ed750019cd929be8abced39a139870173 (diff)
parentd418576cef206ea7d3015e9967c66ca26d07941d (diff)
Merge tag '5.6.0' into debian
tagging package propellor version 5.6.0
-rw-r--r--Makefile4
-rw-r--r--debian/changelog25
-rw-r--r--doc/README.mdwn6
-rw-r--r--doc/forum/Make_clean_fails_in_openbsd.mdwn25
-rw-r--r--doc/forum/Make_clean_fails_in_openbsd/comment_1_27faa3850b462e8930752209f41e2c2f._comment8
-rw-r--r--doc/forum/Make_clean_fails_in_openbsd/comment_2_be7daa63ed7b5689f3e626eedd2fb648._comment10
-rw-r--r--doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment4
-rw-r--r--doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__.mdwn21
-rw-r--r--doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_b3a31b1fb2fbe7ada648d758398686ca._comment7
-rw-r--r--doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd.mdwn6
-rw-r--r--doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_1_ccf181b032aad9134ff513878956d1b2._comment14
-rw-r--r--doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_2_b9f9c1903f1a54bad8d9021702056f41._comment17
-rw-r--r--doc/forum/compiling_5.5.0_fails_with_lts_13.0.mdwn74
-rw-r--r--doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_1_58051e973d4b4c269b1fa90517a3adc6._comment11
-rw-r--r--doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_2_c96da2520b700b2c39769d53febc3ae8._comment7
-rw-r--r--doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_3_431073c65fc258d3dcce8d9968c96daf._comment9
-rw-r--r--doc/forum/installing_apt_packages_without_running_new_services.mdwn3
-rw-r--r--doc/forum/installing_apt_packages_without_running_new_services/comment_1_7c64eb0d72d9f84ecc62136b0367ef3d._comment16
-rw-r--r--doc/news/version_5.3.4.mdwn8
-rw-r--r--doc/news/version_5.5.0.mdwn20
-rw-r--r--doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid.mdwn7
-rw-r--r--doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid/comment_1_dbb0a50414b1ac58cad8584a7c99078e._comment17
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_10_b48444a7ec6a69019a2fda927925cac1._comment40
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_11_feec29fe99528e66b0cbc0388793e10e._comment8
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_12_2a42bef328b8dc17754050e3cdb7e7d2._comment8
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_13_066d41df795b69e096487ae7334824d0._comment8
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_6_9c2792cec842dba7a8fabb24c2c33da0._comment14
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_7_246609ff0b30329fe64fe1c100b62c45._comment49
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_8_f7ceb2909d6884a9b13500b7c660469a._comment23
-rw-r--r--doc/todo/support_for_libvirt_KVM_VMs/comment_9_4ba83dedf873a1a70fc050f22fca343e._comment12
-rw-r--r--doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network.mdwn9
-rw-r--r--doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network/comment_1_9469ea9eaf70e57ba1b36891978725cf._comment11
-rw-r--r--joeyconfig.hs29
-rw-r--r--privdata/.joeyconfig/privdata.gpg3443
-rw-r--r--propellor.cabal10
-rw-r--r--src/Propellor/Bootstrap.hs4
-rw-r--r--src/Propellor/EnsureProperty.hs2
-rw-r--r--src/Propellor/Gpg.hs2
-rw-r--r--src/Propellor/Property.hs13
-rw-r--r--src/Propellor/Property/Borg.hs13
-rw-r--r--src/Propellor/Property/Cron.hs2
-rw-r--r--src/Propellor/Property/DiskImage.hs24
-rw-r--r--src/Propellor/Property/Firewall.hs1
-rw-r--r--src/Propellor/Property/Libvirt.hs210
-rw-r--r--src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs5
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs70
-rw-r--r--src/Propellor/Property/Systemd.hs19
-rw-r--r--src/Propellor/Property/User.hs2
-rw-r--r--src/Propellor/Ssh.hs2
-rw-r--r--src/Propellor/Types.hs1
-rw-r--r--src/Propellor/Types/OS.hs2
-rw-r--r--src/Propellor/Types/Singletons.hs2
-rw-r--r--src/Propellor/Utilities.hs8
-rw-r--r--src/Utility/Directory.hs114
-rw-r--r--src/Utility/Directory/Stream.hs130
-rw-r--r--src/Utility/Directory/TestDirectory.hs40
-rw-r--r--src/Utility/Env.hs24
-rw-r--r--src/Utility/Env/Basic.hs22
-rw-r--r--src/Utility/Env/Set.hs41
-rw-r--r--src/Utility/Exception.hs18
-rw-r--r--src/Utility/FileMode.hs5
-rw-r--r--src/Utility/FileSystemEncoding.hs20
-rw-r--r--src/Utility/Misc.hs21
-rw-r--r--src/Utility/PartialPrelude.hs8
-rw-r--r--src/Utility/Path.hs62
-rw-r--r--src/Utility/PosixFiles.hs42
-rw-r--r--src/Utility/Process.hs91
-rw-r--r--src/Utility/Process/Shim.hs5
-rw-r--r--src/Utility/Process/Transcript.hs83
-rw-r--r--src/Utility/SafeCommand.hs20
-rw-r--r--src/Utility/Scheduled.hs3
-rw-r--r--src/Utility/Split.hs4
-rw-r--r--src/Utility/ThreadScheduler.hs4
-rw-r--r--src/Utility/Tmp.hs55
-rw-r--r--src/Utility/Tmp/Dir.hs67
-rw-r--r--src/Utility/UserInfo.hs22
76 files changed, 3027 insertions, 2239 deletions
diff --git a/Makefile b/Makefile
index 84a92f0e..0e4b2ca3 100644
--- a/Makefile
+++ b/Makefile
@@ -30,8 +30,8 @@ install:
clean:
rm -rf dist Setup tags propellor propellor.1 privdata/local
- find -name \*.o -exec rm {} \;
- find -name \*.hi -exec rm {} \;
+ find . -name \*.o -exec rm {} \;
+ find . -name \*.hi -exec rm {} \;
# hothasktags chokes on some template haskell etc, so ignore errors
# duplicate tags with Propellor.Property. removed from the start, as we
diff --git a/debian/changelog b/debian/changelog
index 7ad23d87..933b6dbc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,28 @@
+propellor (5.6.0) unstable; urgency=medium
+
+ * withOS had a type level bug that allowed ensureProperty to be used inside
+ it with a Property that does not match the type of the withOS itself.
+ (API change)
+ The fix may cause some of your valid uses of withOS to no longer type
+ check; the best way to work around that is to use pickOS to pick between
+ several properties that are further specialized using withOS.
+ For an example of how to do that, see the source code to
+ Propellor.Property.Borg.installed
+ * Propellor.Property.Cron.runPropellor is a Property DebianLike; it was
+ incorrectly a Property UnixLike before and that wrong type was hidden by
+ the withOS bug.
+ * Some openbsd portability fixes. Thanks, rsiddharth.
+ * Added Libvirt module. Thanks, Sean Whitton.
+ * When bootstrapping on Debian, libghc-stm-dev may not be available,
+ as it's become part of ghc, so check before trying to install it.
+ * Fix build with ghc 8.6.3.
+ * Avoid exposing the constructor of OuterMetaTypesWitness, to avoid
+ the kind of mistake that led to the withOS bug.
+ * Merged Utility changes from git-annex.
+ * Fix --spin crash when ~/.ssh/ directory did not already exist.
+
+ -- Joey Hess <id@joeyh.name> Fri, 18 Jan 2019 12:11:53 -0400
+
propellor (5.5.0-2) unstable; urgency=medium
* Cherry pick upstream commit d2a526833f7178a04b00704890cf6ee8c1187618
diff --git a/doc/README.mdwn b/doc/README.mdwn
index 88726a6d..76d05255 100644
--- a/doc/README.mdwn
+++ b/doc/README.mdwn
@@ -37,11 +37,11 @@ see [configuration for the Haskell newbie](https://propellor.branchable.com/hask
## quick start
1. Get propellor installed on your development machine (ie, laptop).
- `cabal install propellor`
+ `apt-get install propellor`
or
- `stack install propellor`
+ `cabal install propellor`
or
- `apt-get install propellor`
+ `cabal unpack propellor; cd propellor-version; stack install`
2. Run `propellor --init` ; this will set up a `~/.propellor/` git
repository for you.
3. Edit `~/.propellor/config.hs`, and add a host you want to manage.
diff --git a/doc/forum/Make_clean_fails_in_openbsd.mdwn b/doc/forum/Make_clean_fails_in_openbsd.mdwn
new file mode 100644
index 00000000..0f73586a
--- /dev/null
+++ b/doc/forum/Make_clean_fails_in_openbsd.mdwn
@@ -0,0 +1,25 @@
+openbsd requires specifying the path for the [`find`][0] command. So this:
+
+ find -name \*.o
+ find: unknown option -- n
+ usage: find [-dHhLXx] [-f path] path ... [expression]
+
+
+fails.
+
+This works:
+
+
+ find . -name \*.o
+ ./dist/build/Utility/Applicative.o
+ ./dist/build/Utility/PosixFiles.o
+ ./dist/build/Utility/Split.o
+ ...
+
+
+as expected.
+
+Here's a patch for it: [0001-Makefile-Update-clean.patch][1].
+
+[0]: https://man.openbsd.org/find
+[1]: https://ricketyspace.net/patch/0001-Makefile-Update-clean.patch
diff --git a/doc/forum/Make_clean_fails_in_openbsd/comment_1_27faa3850b462e8930752209f41e2c2f._comment b/doc/forum/Make_clean_fails_in_openbsd/comment_1_27faa3850b462e8930752209f41e2c2f._comment
new file mode 100644
index 00000000..c7939851
--- /dev/null
+++ b/doc/forum/Make_clean_fails_in_openbsd/comment_1_27faa3850b462e8930752209f41e2c2f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-10-23T15:31:13Z"
+ content="""
+Thanks for the patch. The only thing you could have done better is post
+this in [[todo]].
+"""]]
diff --git a/doc/forum/Make_clean_fails_in_openbsd/comment_2_be7daa63ed7b5689f3e626eedd2fb648._comment b/doc/forum/Make_clean_fails_in_openbsd/comment_2_be7daa63ed7b5689f3e626eedd2fb648._comment
new file mode 100644
index 00000000..ca5c4c81
--- /dev/null
+++ b/doc/forum/Make_clean_fails_in_openbsd/comment_2_be7daa63ed7b5689f3e626eedd2fb648._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="s@aa9ff9ce06b08acfd2a93ebd342ce6879430fbdd"
+ nickname="s"
+ avatar="http://cdn.libravatar.org/avatar/81bf27f8b35011d1846711fa37a5588f"
+ subject="comment 2"
+ date="2018-10-28T19:43:55Z"
+ content="""
+Apologies for the haste. I'll post patches under [[/todo]] in<br/>
+the future
+"""]]
diff --git a/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
index 4869922e..84aad7f3 100644
--- a/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
+++ b/doc/forum/Supported_OS/comment_1_f324bed708305e2667bd00f80544dd90._comment
@@ -22,8 +22,8 @@ on multiple OS's:
upgraded :: Property (DebianLike + FreeBSD)
upgraded = Apt.upgraded `pickOS` Pkg.upgraded
-The `withOS` function lets a single property do different things for
-different OS versions as well as different OS's.
+The `pickOS` function lets a single property do different things for
+different OS's.
The ArchLinux and FreeBSD ports were done by propellor users,
and both are good examples of the scope of the changes involved in making
diff --git a/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__.mdwn b/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__.mdwn
new file mode 100644
index 00000000..c35d5ba3
--- /dev/null
+++ b/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__.mdwn
@@ -0,0 +1,21 @@
+Hello,
+
+while running propellor on a brand new installed machine.
+I got this error message
+
+
+ [master 4c06fcd] propellor spin
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+ Git commit ... done
+ Password for 'https://picca@salsa.debian.org':
+ To https://salsa.debian.org/picca/propellor.git
+ d8cfab0..4c06fcd master -> master
+ Push to central git repository ... done
+ propellor: /home/picca/.ssh/propellor: createDirectory: does not exist (No such file or directory)
+
+
+so it seems that propellor does not create the .ssh directory if it does not exists.
+
+cheers
+
+Frederic
diff --git a/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_b3a31b1fb2fbe7ada648d758398686ca._comment b/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_b3a31b1fb2fbe7ada648d758398686ca._comment
new file mode 100644
index 00000000..c961763d
--- /dev/null
+++ b/doc/forum/__126____47__.ssh__47__propellor:_createDirectory:_does_not_exist___40__No_such_file_or_directory__41__/comment_1_b3a31b1fb2fbe7ada648d758398686ca._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2019-01-18T16:11:19Z"
+ content="""
+Think I've fixed this now.
+"""]]
diff --git a/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd.mdwn b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd.mdwn
new file mode 100644
index 00000000..c66bbc23
--- /dev/null
+++ b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd.mdwn
@@ -0,0 +1,6 @@
+The `-a` option is unfortunately [not available in openbsd's version][1] of the `cp` command.
+
+Here's a patch for it [0001-src-Update-Propellor.Bootstrap.cabalBuild.patch][2].
+
+[1]: https://man.openbsd.org/cp
+[2]: https://ricketyspace.net/patch/0001-src-Update-Propellor.Bootstrap.cabalBuild.patch
diff --git a/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_1_ccf181b032aad9134ff513878956d1b2._comment b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_1_ccf181b032aad9134ff513878956d1b2._comment
new file mode 100644
index 00000000..f5ac7ae0
--- /dev/null
+++ b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_1_ccf181b032aad9134ff513878956d1b2._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-10-23T15:34:56Z"
+ content="""
+Thanks for the patch. I've applied it. I suspect it would be sufficient to
+use -p?<Down>
+
+If you're going to be posting a bunch of openbsd porting patches,
+which I hope you are, please use [[todo]] so they don't flood the forum
+and so it's obvious which have been applied and which not.
+
+Also, see [[contributing]] for some other useful things to do.
+"""]]
diff --git a/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_2_b9f9c1903f1a54bad8d9021702056f41._comment b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_2_b9f9c1903f1a54bad8d9021702056f41._comment
new file mode 100644
index 00000000..09a5b01e
--- /dev/null
+++ b/doc/forum/__96__Propellor.Bootstrap.cabalBuild__96___fails_in_openbsd/comment_2_b9f9c1903f1a54bad8d9021702056f41._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="s@aa9ff9ce06b08acfd2a93ebd342ce6879430fbdd"
+ nickname="s"
+ avatar="http://cdn.libravatar.org/avatar/81bf27f8b35011d1846711fa37a5588f"
+ subject="comment 2"
+ date="2018-10-28T19:43:21Z"
+ content="""
+> ...I suspect it would be sufficient to use -p?
+
+I think you're right, `-pf` should be sufficient.
+
+> If you're going to be posting a bunch of openbsd porting patches, which I hope you are, please use [[/todo]] so they don't flood the forum and so it's obvious which have been applied and which not.
+
+Apologies for the haste. I'll post patches under [[/todo]] in<br/>
+the future and take a look at [[/contributing]]. Thanks for<br/>
+pointing out.
+"""]]
diff --git a/doc/forum/compiling_5.5.0_fails_with_lts_13.0.mdwn b/doc/forum/compiling_5.5.0_fails_with_lts_13.0.mdwn
new file mode 100644
index 00000000..7b543f7f
--- /dev/null
+++ b/doc/forum/compiling_5.5.0_fails_with_lts_13.0.mdwn
@@ -0,0 +1,74 @@
+Running `stack install propellor` today fails in two ways:
+
+First up:
+
+ In the dependencies for propellor-5.5.0:
+ IfElse needed, but the stack configuration has no specified version (latest
+ matching version is 0.85) needed since propellor is a build target.
+
+ Some different approaches to resolving this:
+
+ * Consider trying 'stack solver', which uses the cabal-install solver to
+ attempt to find some working build configuration. This can be convenient
+ when dealing with many complicated constraint errors, but results may be
+ unpredictable.
+
+ * Recommended action: try adding the following to your extra-deps
+ in /Users/thom/.stack/global-project/stack.yaml:
+
+ IfElse-0.85@sha256:6939b94acc6a55f545f63a168a349dd2fbe4b9a7cca73bf60282db5cc6aa47d2
+
+
+Once that's added, propellor fails to compile with:
+
+
+ [ 39 of 174] Compiling Propellor.Types ( src/Propellor/Types.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Propellor/Types.o )
+
+ /private/var/folders/0v/w1nt655j39q9954g7y_2_jlh0000gn/T/stack8634/propellor-5.5.0/src/Propellor/Types.hs:187:10: error:
+ • Illegal nested constraint ‘SingI (Combine x y)’
+ (Use UndecidableInstances to permit this)
+ • In the instance declaration for
+ ‘Combines (Property (MetaTypes x)) (Property (MetaTypes y))’
+ |
+ 187 | instance (CheckCombinable x y ~ 'CanCombine, SingI (Combine x y)) => Combines (Property (MetaTypes x)) (Property (MetaTypes y)) where
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ /private/var/folders/0v/w1nt655j39q9954g7y_2_jlh0000gn/T/stack8634/propellor-5.5.0/src/Propellor/Types.hs:190:10: error:
+ • Illegal nested constraint ‘SingI (Combine x y)’
+ (Use UndecidableInstances to permit this)
+ • In the instance declaration for
+ ‘Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (RevertableProperty (MetaTypes y) (MetaTypes y'))’
+ |
+ 190 | instance (CheckCombinable x y ~ 'CanCombine, CheckCombinable x' y' ~ 'CanCombine, SingI (Combine x y), SingI (Combine x' y')) => Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (RevertableProperty (MetaTypes y) (MetaTypes y')) where
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ /private/var/folders/0v/w1nt655j39q9954g7y_2_jlh0000gn/T/stack8634/propellor-5.5.0/src/Propellor/Types.hs:190:10: error:
+ • Illegal nested constraint ‘SingI (Combine x' y')’
+ (Use UndecidableInstances to permit this)
+ • In the instance declaration for
+ ‘Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (RevertableProperty (MetaTypes y) (MetaTypes y'))’
+ |
+ 190 | instance (CheckCombinable x y ~ 'CanCombine, CheckCombinable x' y' ~ 'CanCombine, SingI (Combine x y), SingI (Combine x' y')) => Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (RevertableProperty (MetaTypes y) (MetaTypes y')) where
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ /private/var/folders/0v/w1nt655j39q9954g7y_2_jlh0000gn/T/stack8634/propellor-5.5.0/src/Propellor/Types.hs:195:10: error:
+ • Illegal nested constraint ‘SingI (Combine x y)’
+ (Use UndecidableInstances to permit this)
+ • In the instance declaration for
+ ‘Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (Property (MetaTypes y))’
+ |
+ 195 | instance (CheckCombinable x y ~ 'CanCombine, SingI (Combine x y)) => Combines (RevertableProperty (MetaTypes x) (MetaTypes x')) (Property (MetaTypes y)) where
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ /private/var/folders/0v/w1nt655j39q9954g7y_2_jlh0000gn/T/stack8634/propellor-5.5.0/src/Propellor/Types.hs:197:10: error:
+ • Illegal nested constraint ‘SingI (Combine x y)’
+ (Use UndecidableInstances to permit this)
+ • In the instance declaration for
+ ‘Combines (Property (MetaTypes x)) (RevertableProperty (MetaTypes y) (MetaTypes y'))’
+ |
+ 197 | instance (CheckCombinable x y ~ 'CanCombine, SingI (Combine x y)) => Combines (Property (MetaTypes x)) (RevertableProperty (MetaTypes y) (MetaTypes y')) where
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+
+I can reproduce this by bumping the lts version to 13.0 in master's stack.yaml and uttering `stack build`.
diff --git a/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_1_58051e973d4b4c269b1fa90517a3adc6._comment b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_1_58051e973d4b4c269b1fa90517a3adc6._comment
new file mode 100644
index 00000000..5227cf3d
--- /dev/null
+++ b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_1_58051e973d4b4c269b1fa90517a3adc6._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-12-30T17:10:47Z"
+ content="""
+Unfortunately `stack install propellor` ignores the working stack.yaml
+shipped with propellor, and tries to use the default resolver and package
+set.
+
+I've adjusted the README to not suggest using that broken command.
+"""]]
diff --git a/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_2_c96da2520b700b2c39769d53febc3ae8._comment b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_2_c96da2520b700b2c39769d53febc3ae8._comment
new file mode 100644
index 00000000..f02ef69b
--- /dev/null
+++ b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_2_c96da2520b700b2c39769d53febc3ae8._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2018-12-30T18:38:51Z"
+ content="""
+I've made the necessary changes to support ghc 8.6.3.
+"""]]
diff --git a/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_3_431073c65fc258d3dcce8d9968c96daf._comment b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_3_431073c65fc258d3dcce8d9968c96daf._comment
new file mode 100644
index 00000000..451bb21f
--- /dev/null
+++ b/doc/forum/compiling_5.5.0_fails_with_lts_13.0/comment_3_431073c65fc258d3dcce8d9968c96daf._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="thom@386bbca5d0520f44e47909c31e6b0138a4c493b8"
+ nickname="thom"
+ avatar="http://cdn.libravatar.org/avatar/326b70d806eee1cec938adf3efa8809b"
+ subject="comment 3"
+ date="2018-12-31T13:00:53Z"
+ content="""
+Thanks Joey!
+"""]]
diff --git a/doc/forum/installing_apt_packages_without_running_new_services.mdwn b/doc/forum/installing_apt_packages_without_running_new_services.mdwn
new file mode 100644
index 00000000..d044ef05
--- /dev/null
+++ b/doc/forum/installing_apt_packages_without_running_new_services.mdwn
@@ -0,0 +1,3 @@
+How would one create a Property that installs a package without starting the corresponding service?
+
+I'm asking because sometimes the default config is broken, so you need to fix it before starting the service.
diff --git a/doc/forum/installing_apt_packages_without_running_new_services/comment_1_7c64eb0d72d9f84ecc62136b0367ef3d._comment b/doc/forum/installing_apt_packages_without_running_new_services/comment_1_7c64eb0d72d9f84ecc62136b0367ef3d._comment
new file mode 100644
index 00000000..41fa4078
--- /dev/null
+++ b/doc/forum/installing_apt_packages_without_running_new_services/comment_1_7c64eb0d72d9f84ecc62136b0367ef3d._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-12-01T21:39:14Z"
+ content="""
+One way is to enable Propellor.Property.Service.noServices
+during the install and revert it afterwards, but that does prevent any
+services being started while it's enabled.
+
+I don't know of a very good way to do this on a Debian system. If you can
+find one, I'm sure propellor can use it.
+
+It might be possible, when systemd is used, to first apply
+Propellor.Property.Systemd.disabled on the service that has not been
+installed yet. I have not checked if that works.
+"""]]
diff --git a/doc/news/version_5.3.4.mdwn b/doc/news/version_5.3.4.mdwn
deleted file mode 100644
index 09358138..00000000
--- a/doc/news/version_5.3.4.mdwn
+++ /dev/null
@@ -1,8 +0,0 @@
-propellor 5.3.4 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
- * Apt.trustsKey: Use apt-key to add key rather than manually driving gpg,
- which seems to not work anymore.
- Thanks, Russell Sim.
- * Firewall: Reorder iptables parameters that are order
- dependant to make --to-dest and --to-source work.
- Thanks, Russell Sim"""]] \ No newline at end of file
diff --git a/doc/news/version_5.5.0.mdwn b/doc/news/version_5.5.0.mdwn
new file mode 100644
index 00000000..360a5314
--- /dev/null
+++ b/doc/news/version_5.5.0.mdwn
@@ -0,0 +1,20 @@
+propellor 5.5.0 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+ * letsencrypt': Pass --expand to support expanding the list of domains
+ * Split mailname property out of Hostname.sane, since bad mailname
+ guesses can lead to ugly surprises. (API change)
+ * Removed HostingProvider.CloudatCost module as it lacks a maintainer.
+ (If anyone would like to maintain it, send a patch adding it back.)
+ (API change)
+ * Added Systemd.escapePath helper function useful when creating mount
+ units.
+ * Added Sudo.sudoersDFile property.
+ * Sudo.enabledFor: Write to /etc/sudoers.d/000users rather than to
+ /etc/sudoers. (Any old lines it wrote to /etc/sudoers will be removed.)
+ This fixes a potential ordering problem; the property used to append
+ the line to /etc/sudoers, but that would override more specific lines
+ in the include directory.
+ * Borg: Added UsesEnvVar.
+ * Added DiskImage.noBootloader, useful for eg, direct booting with
+ qemu. Thanks, David Bremner.
+ * Added Apt.backportInstalledMin."""]] \ No newline at end of file
diff --git a/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid.mdwn b/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid.mdwn
new file mode 100644
index 00000000..4305e396
--- /dev/null
+++ b/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid.mdwn
@@ -0,0 +1,7 @@
+haskell-stm is included with ghc and won't be shipped as an installable package in Debian buster.
+
+Propellor needs to stop trying to install haskell-stm on Debian buster or newer (and it should also be dropped from debian/control of course, but that can happen on the Debian side).
+
+--spwhitton
+
+> [[done]] --[[Joey]]
diff --git a/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid/comment_1_dbb0a50414b1ac58cad8584a7c99078e._comment b/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid/comment_1_dbb0a50414b1ac58cad8584a7c99078e._comment
new file mode 100644
index 00000000..a53a144a
--- /dev/null
+++ b/doc/todo/haskell-stm_now_bundled_with_ghc_in_Debian_sid/comment_1_dbb0a50414b1ac58cad8584a7c99078e._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-12-04T18:58:48Z"
+ content="""
+Bootstrap's package installation ignores errors, so if the package is not
+available, it will at worst display an error message and continue.
+
+However, I went ahead and made it check with apt-cache if the package is
+available, to avoid the user seeing an apt error here.
+
+I suppose users of Arch and FreeBSD may want to make similar changes, if
+their package managers also display errors; I don't know if they do or even
+if this change is going to affect those distributions.
+Probably better to let those users deal with it if similar changes are made
+to those distributions, so I'm going to close this.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_10_b48444a7ec6a69019a2fda927925cac1._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_10_b48444a7ec6a69019a2fda927925cac1._comment
new file mode 100644
index 00000000..9b142dcd
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_10_b48444a7ec6a69019a2fda927925cac1._comment
@@ -0,0 +1,40 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""code review"""
+ date="2018-11-06T14:59:06Z"
+ content="""
+Let's comment out the QCow2 constructor until that case is handled.
+
+With NumVCPUs and MiBMemory both Int, and used in the same property, they
+could get mixed up. Recommend newtypes.
+
+Would it make sense for defaultNetworkAutostarted
+to itself run the virsh net-start? It would simplify the example.
+
+It's named kvmDefined; is it actually guaranteed to use kvm and not some other VM?
+
+What happens when osVariant is Nothing and no --os-variant is passed?
+When osType is Nothing? Is it still likely to work?
+
+Please make osType not have a default case and define it for all the
+current constructors. That way, the next person to
+add an Linux distro to propellor won't forget to update it.
+
+The chroot nuking code depends on some implementation details in DiskImage,
+so I'd be inclined to move it to that module. (Which probably has similar
+code that can be factored out.)
+
+The "defined" scriptProperty uses a lot of values that are unlikely to
+contain spaces or other script unsafe stuff, but it would still be good to
+shellEscape them. (Or it could be rewritten to run virt-install w/o a
+shell, read its output, and write the file.)
+
+The "started" scriptProperty also needs some escaping. (Although I'd be
+inclined to parse virsh list in haskell, but up to you.)
+
+Minor: The `& Libvirt.defaultNetworkAutostarted` example line is currently
+indented by spaces while the other lines use tabs.
+
+Minor: I'd use `$` in some of the places where you have a parenthesized
+do block or other multiline block of code.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_11_feec29fe99528e66b0cbc0388793e10e._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_11_feec29fe99528e66b0cbc0388793e10e._comment
new file mode 100644
index 00000000..97467c3b
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_11_feec29fe99528e66b0cbc0388793e10e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="comment 11"
+ date="2018-11-10T23:17:52Z"
+ content="""
+All done, I think. Thank you for a useful review. Commit messages and comments should explain my changes.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_12_2a42bef328b8dc17754050e3cdb7e7d2._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_12_2a42bef328b8dc17754050e3cdb7e7d2._comment
new file mode 100644
index 00000000..84fa1ada
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_12_2a42bef328b8dc17754050e3cdb7e7d2._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="comment 12"
+ date="2018-11-10T23:29:35Z"
+ content="""
+(Hmm, here on Debian stretch, passing `--autostart` does not actually cause the VM to be marked for autostarting. This is a bug in virt-install, though, as we're using the command line interface as documented -- I confirmed this using `PROPELLOR_DEBUG=1`.)
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_13_066d41df795b69e096487ae7334824d0._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_13_066d41df795b69e096487ae7334824d0._comment
new file mode 100644
index 00000000..07b32566
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_13_066d41df795b69e096487ae7334824d0._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 13"""
+ date="2018-11-11T20:58:35Z"
+ content="""
+I've merged the branch, unsure if this should remain open for anything
+discussed above, so leaving it for now.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_6_9c2792cec842dba7a8fabb24c2c33da0._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_6_9c2792cec842dba7a8fabb24c2c33da0._comment
new file mode 100644
index 00000000..931b21fe
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_6_9c2792cec842dba7a8fabb24c2c33da0._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="creating the libvirt VM"
+ date="2018-11-04T01:03:06Z"
+ content="""
+I've now an adhoc, proof-of-concept libvirt VM provisioned by my config.hs, just using a raw disk image. It turns out that propellor should not be writing the XML configuration file in /etc, but having libvirt generate it. This is because the config is not meant to be directly edited. So, propellor should call virt-install(1) to setup and boot the VM.
+
+My code uses virt-install's --import option, also passing it the location of the disk image generated by propellor. The main problem is that the invocation of virt-install won't return until after the VM first shuts down; the idea is that you are running the OS installer and then you reboot. Possibly using --boot instead of --import will help here; not sure.
+
+We will need the user to specify how much RAM and how many vCPUs to assign to the VM. All the other parameters to virt-install can be determined by looking at the properties of the VM `Host`.
+
+Otherwise, the user will need to set an IP property on the VM so that it can be conducted. I think we will need to leave the user to do this, as there are so many possible network configurations for libvirt VMs. But we could probably provide helper properties. In particular, the standard setup will be to use `Network.static`, though I'm not sure about how to do that with indeterministic interface names.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_7_246609ff0b30329fe64fe1c100b62c45._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_7_246609ff0b30329fe64fe1c100b62c45._comment
new file mode 100644
index 00000000..1aa82a09
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_7_246609ff0b30329fe64fe1c100b62c45._comment
@@ -0,0 +1,49 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="New design: requesting feedback"
+ date="2018-11-04T17:39:51Z"
+ content="""
+Having slept on it, and also looked at some more of virt-install(1), I have a new design. I'd be grateful for feedback on this, before implementation.
+
+We have two properties: `Libvirt.kvmRunning` and `Libvirt.kvmRunningConducted`, where
+
+ kvmRunningConnected host = conducts host `requires` kvmRunning host
+
+The basic reason for separating these two properties is that for the conducting to work, various network things have to be set up, and there isn't a configuration that it would be sensible to have as a default. More generally, libvirt isn't at all suited to declarative configuration. What propellor can do well is build an image and have libvirt generate a barebones XML configuration file to boot the image. This is what `Libvirt.kvmRunning` will do. After that, we're going to have to leave it up to the user. I suspect that outside of the very simplest cases, they are going to have to make a series of virsh(1) calls, using `flagFile` to ensure that it only happens once.
+
+`Libvirt.kvmRunning` will work like this:
+
+1. ensure libvirt etc. are installed
+2. build the image if it doesn't exist
+3. nuke the chroot used to build the image
+3. if VM config does not exist,
+ 1. `virt-install -n vm-hostname --description \"vm-hostname VM\" --os-type=Linux --os-variant=debian9 --ram=1024 --vcpus=2 --autostart --disk path=/var/lib/libvirt/images/vm-hostname.img,device=disk,bus=virtio --import --print-xml >/tmp/foo`
+ 2. `virsh define /tmp/foo`
+ - `virt-install --print-xml` and then `virsh define` avoids the problem of virt-install not exiting until after the VM has been shutdown at least once/the virt-viewer instance launched by virt-install has been closed
+ 3. `virsh start vm-hostname`
+
+Sample usage:
+
+ laptop :: Host
+ laptop = host \"iris.silentflame.com\" $ props
+ & osDebian (Stable \"stretch\") X86_64
+ & Libvirt.kvmRunning Raw 1GB 2 develacc -- specification of image type, RAM and vCPUs to assign
+
+ develacc :: Host
+ develacc = host \"develacc.iris.silentflame.com\" $ props
+ & osDebian Unstable X86_64
+ & hasPartition
+ ( partition EXT4
+ `mountedAt` \"/\"
+ `addFreeSpace` MegaBytes 10240
+ )
+ & Apt.installed [\"linux-image-amd64\"]
+ & Grub.installed PC
+
+ & ipv4 \"192.168.122.31\"
+ & Network.static \"ens3\" (IPv4 \"192.168.122.31\")
+ (Just (Network.Gateway (IPv4 \"192.168.122.1\")))
+ `requires` Network.cleanInterfacesFile
+ & Hostname.sane
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_8_f7ceb2909d6884a9b13500b7c660469a._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_8_f7ceb2909d6884a9b13500b7c660469a._comment
new file mode 100644
index 00000000..0af0baaa
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_8_f7ceb2909d6884a9b13500b7c660469a._comment
@@ -0,0 +1,23 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 8"""
+ date="2018-11-05T16:40:57Z"
+ content="""
+Seems that kvmRunning would need a warning that changes to the propellor
+configuration of the VM's Host won't affect the VM. Because it's unusual for
+propellor to only be able to set something up and not change it afterwards.
+
+But kvmRunning is certianly a useful low level property, and combining with
+other properties like that is good.
+
+Hmm, it's actually possible to mount a qcow2 image using libguestfs-tools.
+<http://ask.xmodulo.com/mount-qcow2-disk-image-linux.html>
+So, propellor could temporarily take down the VM and run inside the qcow2
+to update it! Although doing that every time propellor is run seems
+suboptimal. It could keep the chroot around and only update the qcow2 image
+if the chroot needed to be updated. I am not sure how I feel about that
+idea.
+
+We could also make conducting easier to set up, perhaps not needing `main`
+to be modified to use it.
+"""]]
diff --git a/doc/todo/support_for_libvirt_KVM_VMs/comment_9_4ba83dedf873a1a70fc050f22fca343e._comment b/doc/todo/support_for_libvirt_KVM_VMs/comment_9_4ba83dedf873a1a70fc050f22fca343e._comment
new file mode 100644
index 00000000..94f2ef9b
--- /dev/null
+++ b/doc/todo/support_for_libvirt_KVM_VMs/comment_9_4ba83dedf873a1a70fc050f22fca343e._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="spwhitton"
+ avatar="http://cdn.libravatar.org/avatar/9c3f08f80e67733fd506c353239569eb"
+ subject="comment 9"
+ date="2018-11-06T03:12:26Z"
+ content="""
+Thanks. I've now implemented enough of this to support my usecase in the libvirt branch of <https://git.spwhitton.name/propellor>.
+
+There are TODOs, but now seems as good a time as any for someone to implement the qcow2 support . . .
+
+With regard to your idea, taking down the VM and running propellor on the qcow2 file seems like it will not be useful to very many people. ISTM that treating the VM as a host and spinning it is right.
+"""]]
diff --git a/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network.mdwn b/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network.mdwn
new file mode 100644
index 00000000..831dc1e0
--- /dev/null
+++ b/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network.mdwn
@@ -0,0 +1,9 @@
+I don't have `Cron.runPropellor` on my laptop because it is often offline. But I would like a cronjob that tries to spin the host if it's online. Mainly to keep sbuild chroots up-to-date.
+
+I was wondering what the cleanest way to implement this would be. `Cron.runPropellor` could be split into `Cron.runPropellor` and `Cron.runPropellorWhenOnline`, the latter of which does `wget http://google.com >/dev/null` and exits if that command fails.
+
+Or there could be some kind of property which, when set on a host, causes all spins to abort if the host if offline.
+
+And is wgetting Google's homepage the right way to check that we have Internet access?
+
+--spwhitton
diff --git a/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network/comment_1_9469ea9eaf70e57ba1b36891978725cf._comment b/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network/comment_1_9469ea9eaf70e57ba1b36891978725cf._comment
new file mode 100644
index 00000000..638a8d6b
--- /dev/null
+++ b/doc/todo/want_Cron.runPropellor_that_does_nothing_if_no_network/comment_1_9469ea9eaf70e57ba1b36891978725cf._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 1"""
+ date="2018-12-08T16:15:43Z"
+ content="""
+Perhaps runPropellor could be parameterized in some way, so
+you can provide whatever check you decide you want.
+
+This is where [[todo/integrate_shell-monad]] would come in handy, to
+build up and manipulate the shell script for the cron job.
+"""]]
diff --git a/joeyconfig.hs b/joeyconfig.hs
index 20c53ff7..d22c393c 100644
--- a/joeyconfig.hs
+++ b/joeyconfig.hs
@@ -27,6 +27,7 @@ import qualified Propellor.Property.Locale as Locale
import qualified Propellor.Property.Grub as Grub
import qualified Propellor.Property.Borg as Borg
import qualified Propellor.Property.Gpg as Gpg
+import qualified Propellor.Property.OpenId as OpenId
import qualified Propellor.Property.Systemd as Systemd
import qualified Propellor.Property.Journald as Journald
import qualified Propellor.Property.Fail2Ban as Fail2Ban
@@ -97,7 +98,7 @@ clam :: Host
clam = host "clam.kitenet.net" $ props
& standardSystem (Stable "stretch") X86_64
["Unreliable server. Anything here may be lost at any time!" ]
- & ipv4 "167.114.76.178"
+ & ipv4 "178.33.208.168"
& User.hasPassword (User "root")
& Ssh.hostKeys hostContext
@@ -155,6 +156,9 @@ orca = host "orca.kitenet.net" $ props
& Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
GitAnnexBuilder.stackAutoBuilder
(Stable "jessie") X86_32 (Just "ancient") (Cron.Times "45 * * * *") "2h")
+ & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
+ GitAnnexBuilder.standardAutoBuilder
+ Testing ARM64 Nothing (Cron.Times "1 * * * *") "4h")
banana :: Host
banana = host "banana.kitenet.net" $ props
@@ -181,11 +185,7 @@ honeybee = host "honeybee.kitenet.net" $ props
)
& JoeySites.cubieTruckOneWire
- & Apt.installed ["firmware-misc-nonfree"]
- & Apt.installed ["firmware-brcm80211"]
- -- Workaround for https://bugs.debian.org/844056
- `requires` File.hasPrivContent "/lib/firmware/brcm/brcmfmac43362-sdio.txt" anyContext
- `requires` File.dirExists "/lib/firmware/brcm"
+ & Apt.installed ["firmware-atheros"]
& Apt.serviceInstalledRunning "ntp" -- no hardware clock
& bootstrappedFrom GitRepoOutsideChroot
& Ssh.hostKeys hostContext
@@ -203,16 +203,12 @@ honeybee = host "honeybee.kitenet.net" $ props
& Postfix.satellite
& check (not <$> inChroot) (setupRevertableProperty autobuilder)
- & check (not <$> inChroot) (undoRevertableProperty ancientautobuilder)
-- In case compiler needs more than available ram
& Apt.serviceInstalledRunning "swapspace"
where
autobuilder = Systemd.nspawned $ GitAnnexBuilder.autoBuilderContainer
(GitAnnexBuilder.armAutoBuilder GitAnnexBuilder.standardAutoBuilder)
- Unstable ARMEL Nothing (Cron.Times "15 15 * * *") "10h"
- ancientautobuilder = Systemd.nspawned $ GitAnnexBuilder.autoBuilderContainer
- (GitAnnexBuilder.armAutoBuilder GitAnnexBuilder.stackAutoBuilder)
- (Stable "jessie") ARMEL (Just "ancient") (Cron.Times "5 15 * * *") "10h"
+ Testing ARMEL Nothing (Cron.Times "15 15 * * *") "10h"
-- This is not a complete description of kite, since it's a
-- multiuser system with eg, user passwords that are not deployed
@@ -309,6 +305,7 @@ kite = host "kite.kitenet.net" $ props
& JoeySites.kgbServer
& Systemd.nspawned ancientKitenet
+ & Systemd.nspawned openidProvider
& alias "podcatcher.kitenet.net"
& JoeySites.podcatcher
@@ -487,6 +484,16 @@ oldusenetShellBox = Systemd.debContainer "oldusenet-shellbox" $ props
& alias "shell.olduse.net"
& JoeySites.oldUseNetShellBox
+-- My own openid provider. Uses php, so containerized for security
+-- and administrative sanity.
+openidProvider :: Systemd.Container
+openidProvider = Systemd.debContainer "openid-provider" $ props
+ & standardContainer (Stable "stretch")
+ & alias hn
+ & OpenId.providerFor [User "joey", User "liw"] hn (Just (Port 8086))
+ where
+ hn = "openid.kitenet.net"
+
type Motd = [String]
-- This is my standard system setup.
diff --git a/privdata/.joeyconfig/privdata.gpg b/privdata/.joeyconfig/privdata.gpg
index 9fa1e17d..be24db2d 100644
--- a/privdata/.joeyconfig/privdata.gpg
+++ b/privdata/.joeyconfig/privdata.gpg
@@ -1,1724 +1,1725 @@
-----BEGIN PGP MESSAGE-----
-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
-UKcxd6ZKkJTTMmymkZbDPftO/LcVYCsvNJIPPAELkVp/bhdNfrOZUOfvG6y6eiuS
-Xmm5wuIUtLN2ScqZUKNR0eId9hP8d6yxogLFWVnPQQ69yOHdBIfWnz4GS2NMTcjj
-FsaafnGamItI2dv8JZjBqT2ZXgdP7S748iXEe6kjcJwpGmxmcXeUzmkQbTol3yUM
-GQxDkE9SqtyVKb/RKa6H6rKF/meI8twDYPO2O+Lhdv3c6HzzVKeEue/7Yjm9V33l
-omTLN+CNcq10W0qwoRxGyyeADCwOyYZMzpJZAAkCR6Emb6tsfVTvkx8HmfQOaavo
-FIw3bdLRLf5857u6mCfTUtJX32la3QbWSJMydwtq7+CdiR1nrV0ic4ZPqyqTTy1v
-188UTXAMiPvYeqWaRG4u52stPjITT+XgnJ3edqrv5kad0P4NokXQoL2PSIs6Eddh
-kDP5WkvOPnaCFvYp9oF388KiGgASQ/PwzdQpkgyESjMJkLA10ucpkhc6Vpv/BCT9
-sUJrCrrHqRWa5Z8yvQwop1cwr2zjZUx5LMdhtaa4uFlYWnXC4fQIwrjEXWgMC+SH
-UIVLI8AK0KAxRiYYvnOdIWfgyDy+8Yur7rkhnlO/+AukYIf57ZHkl+FZ0lyzKMyd
-YzLqqhy89iRBPFAa+C1G8qmQ9I6NA6NpsaPAxrfVl+OLW5Y9N6qZjWFd/YxCN9dy
-m0mtG+lp1+vLhlVdVD86DYCeyqvc+UFh7/1i+VqSxFvhD0We+3Zy8yqwJjdlIOAh
-CoslsNXvdQQsstwi3khUOShlH36nujjnYwYYBaaGSw5+ksWDM0wKVBf/JKWNiLXR
-d9txj0RE7EoycQ68ULQV3/Tb/b3wXOB6Kkin/K/s9Gf/5cfGbLK/zOeIuRVp4iFs
-MCa66WK5d6B8qbwGbp/4eqXu2FiH6LdwvFwX4L+eJ3Qp5J77ytjsFpdwJLJGy6Hh
-3JzKdfvHx0lELCqKQSpBB3dm0T1duf1VvNxigxh9jRPv8txwVOUElsn+8kBD3dUx
-20/o/JUfl+TFwDy8+2idkHi5uGrBql62T866Iq3yK2ex47sJMN18cNleEXPS7Vl8
-J6KOhr9FpdzCVIiavCROpOkA5jX2tccuEKMwLlRSeRJEI3+a+eNB4B8QMmmfmT5g
-I3CzVdUBLvMiyz8S9SMB7LY52kJ1ggHPX8pk2T7IKpGHxtitwXPwoeaF/fLxLT1A
-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
-=lY86
+hQIMA7ODiaEXBlRZAQ/+OZVe+8ps+GBzAjmyzvHVZh7kq0R7O+IW+kIKXIMsmu0Q
+8DJoIz3k2dKyQgaBSZmpWAP64fVfd2FxkbDSC1+nToiHRrZCyQ8vpueqcreYmyea
+QfvvXbztnZdXFMBwsMmnzIMa/nsEkHXHpfk1+QgM+rb31/IEQzs8CTe7EE8zdhdK
+QuDxi8Lbk4wuuHiUFghEENJUaIE91pX/7DsZ7rYRJz6hXmAypQYzd13coJhQ+NNo
+fGI/d1DfTdPH84Y1b+doHkk9yw6U6CxPVh6KfcOvfICp7a0lXn4rbVffVxL/Jln5
++TL/fa4ghNkI7MrvFXg9h0eph64nOLMGEFKNiuRcgoTRje5PKC7b9+fd65wfhyPt
+xGasptY4onabBqavK80ZAxHpxiOILdJ+8DXV2sX41eBmLhYBS/UqbXxWweyISHGI
+fuPKY+b2hdHBcrSb9bQPFVcT9roCNi3X1Xk93A1p28/NUkOLEOaug2TBEDz+HBqh
+WVGL9GsVYJ8gKLKD69zAJmi/jQYMfLmFkKdKVtaycXZS6HhAhpWbW1p6uRIUI+hy
+Ql2JsqAgXzO0gX92DTLq+0IwyRkz/sr/dtCkZ2s864ZIcEQx/4WCYz2d9MuYse+j
+PxP7fA/IDDAYubJrLAypT3J0UkfZlOMQSi8vVBztu+9XPMRT54PpBt32JtT6CCXS
+7QHFSk5Wg06SzDfdNn5U/DZs+59l00SJWax5lS7AQSgQtHmu9lXJghVUsRsH60n3
+UT+5lArel19ZAQ/TBDdh7Cf5fr8k9bsVMKlQXmwVJjUXomerV/AVWO6yzTJ3c/h4
+7lj/6OWnNjYTGkjKvkAOSvOnv5ELYwUxA/ALTDzbp0yBQiELxBHxLQx3M9sjllpK
+1tGXjsB1Dt7dAu4rkvtFbMi+6kl3fYIYRGluQQv5tsk47eMM0I4A1+YHWBCnWpFQ
+3kluhpEdvHNHJW4Sy8iGgIW2ECL8Q0N7vwfOTXqX86VCVjiIEp8Gl+nuP4767VJD
+54KRo32YBR564Oayj6m2tMgddtb9hRsmL0QH1dc93RoGRvvcKDtCROgQrhrf6HeF
+ISa+TsZ7jxzwXwB5PpYOa+l90d5Uyt3nSQ/iFT77kmJicSKQGf0bSoqOg4O/PPwO
+jlZ2TCohA0OuYSaZBxoXEdbhZmE0tqhO7AfWJ9Y4xnYWFD8d7cUlcM3i5PJxeer4
+rrQGKrLoh8TkA6hRdFMwV2bynqa0QwqzIo/OQvLfryFceoodVLS/RpRYgFMi0xTP
+KeviNXGFVk6S7b4ztSHpNKdeHo2lX7ditQi2FkGqqrJwFQcde1a/6U5YZ8otRrK7
+1YEK6gruRxyWXkQ4SnEDwyfThaxzYMJG05QMP0NJGp2/aDIsf6H07Tx40MR+FVLU
+hfcHRk7mXPKfQG3tKo8Phjk077je8EzK4CbwrnYoyUStQ8ZF1/HFk6N8UlCJrJhy
+Bmv5MSvbp49W3ghjc+vvBagrnA+U7zWA2DtyNJ7KKr1wxyKvfgdX6V1fFLYQX2sJ
+yXPCRnl4BLNSxU+ZBtt/OFQlitrSG5d4YrsMOtI+3UAlrFO5YrN1Bqq8rwOItQpB
+8MckNyKYL6lt8xsMUDxRON6JqPHhrlAqNtXc1aqsCgaLXgSMNwhqYMENb5cvzORg
+pXIrkBJlhKGVmifWQpxOMSm72ZBuaqSADcLNOHXfafQE4lmGGxZ9YmKLNxDd/6QW
+NuXDh4FgE8KWkquJUTa27Vhu4v5hosjk5eZL44nvI8vsSLtHghStjDbe81RvrRek
+YNt/sjf5e7T6YQOoqwNcJ9mEP6nlUqicTOtX6Ft+8T9xNeX2jxlMEP+TRHY09oaq
+ABNNG+vUBC/PWe44MeaVv13fggQ3KQ3YRc6duzJf/zLfccl+lrbzWSp2vLa9QhTW
+f5OHlHx35kS68weXVjcNZH+BQ3Be3+MpS7u4fbYd5dzIoGP2zF0om7eLyn84qB+c
+nbvP5t5hWg6F19QnLsqSwB8S8Ydjk0Ym/gaIhksHhsKzfI1bPxAUyy2Nc0tTRe0c
+BpjsV4ITLhutXF1nQerpX7+E7xJF2kkolTLey1ynxKWPdACG/+SgVsYRsxUt8hOK
+YBVI4e8Zxwol+jvZLTHhRVpS8Bzcq86HjTkYhmNEOi1Nvuo8xB0YcBjGU5pEdNCq
+Eq45hIcxyI07ypLaLBZbWhHmRlud7au8HGnW60Bc8lPQj3kuiI+8s/2peCLECepK
+DrC+xTkeV3teB/nfO/mkFeSMsc5Y4sXLLETHyrhQ/3Zr96g5qXQ7AqdSp+IPzHYF
+QkX0UBlne3NHYRTIT4urP8LhFbEoX5gqi6mkjUe79lCg8WgxAUVAPI1ZhwR342ju
+Nh87gFffRFbC2BIMK6ckLLE5TyGtfj+zjRhToZ3a8mE4qzaFyLBajqcMvTpqXygf
+W+qHZloWAjEb+E5IRpNZlBhgMw5GE6X94GKlYYcl0LpgwEnyMk11xx8af77t/+Pc
+n7bUvyZQm7yhuznzpJxml+N4CzWe/55eRCW9dA0Y3xhxycX21TBjcH6hJvBJh8Fa
+dQ9tcyh/MEGGddS6D0xv/78w0zrL8YWlC3a3YirywpmvW3sVD2hLcr8FSInfEpkb
+VYEuAyPrbLK7GZrvpMzk9X0nf43ozWGM4i1rn+uiOtKVxObUCM6m/IXHI+bSiLhh
+zv+c9gYDx7DLY7LImjM2ODtyJ8CHxxZx0LN0mP1tz4jfEI+y0hTpkaYMfv4ad/6w
+j426TltcBLzd/7qb/TQEmJgWVXS2IxOyKF7O6bPr+lJMbSBM0SW+TdSqFg16qpdb
+uAzmmki/WkX7Z/+PN2uuBByZwav5o+emFxTBK4bN8IXAzuM79GlWhVvC/ZX+Hr2a
+JQC0Q2SQpZsCQrc2n/k2uqW4uSdl0CkzA9njRLKXWp1Fn0XeO0rjrYf1qnwC5gos
+BiYbqaegNPdGZRdfveixtA2+vnm0pqjv/M1qvI91FzJCVFEtfcze7G2Sw7XJptH6
+AgJJPQpESOg+SpebzxcZsBOX5gFv+DXzvXcZ6r1gQWMMpKEpLBxeGiF9XqJQEobP
+Ykd9yEpwl3GdEz6mNtMQGu8Yl18FTK4Uce1AaHgTONhEKqDxZZc6NtJnCV9s6VWU
+DXz4xzcENoc3nk+XqW0o2Nr9w2ymBIgsmcDyiRZNEKloUPbPViP6PFuOStUTO82f
+X2R7iSemheDs9hfh3sqJKHWpmNYQAfVDBzmfL/bfUIVcaRURbfTRuMKD99TWdufW
+JBRfy/Xo/NYhbQS8ksdMVUk5ZECJk2vZEFFgwsIhPEGM6XvBPvLYxu7kwGtw0MLu
+pP24H1U0Tzt0sysS1reVFaShkrC4TPhiUIDztLaqVMoIRCEFx7ZuWBl86+jFHIFq
+OM9hVgL/i+byfrLjZ2XkPqSEGV3tc7PzNmQ/yu9NxjFhbPcMF6/EnyAVlJM2yBUw
+r5AvtSsY5XNhvBbP/wUCyoMTFkRBmKlKETBYe11+prtrjQu9sWYgshiY7J7r5e1T
+qA1ciGDJ9IlmJLjsf4cJqcpvNDMyJiaZHXjv0PjnRinQYibvG2y0i+tweAeLPfJ4
+McbwDVQ4vn0vkuiWCIKap9854nvoYz4ipnftcw8YsorSXwSEUcHe6IQvzdGoTSjl
+HRKzIG+wi8qcj9c38bxHL2/fhKr5zSG6aMFyqrPIOGgH0Ro6SWa3ytLKDG5hw///
+WtbcDAEDm+aaLmf4YOzTeDl3mdWVOih+FBDzyJuUSJy4DZ+ZknlyIEKNZKei1qSl
+fxKVVtfyzmk5q104nfVEuGsnjrWhfYBisMKv5O4aCBcI9GRllL2ltzp4uixbRmO9
+sBTO6aBaVqaYz7aqXZ9UjzM7J6RpswOVdaWwe7zP2Ff6JWJbde8YcvYgQQ7i2v4B
+l/BSwzy6A/VewRzN/fYjYzscFg3fbrjvVfmfO3RIzYqlW+YUG9POhfFjPjIZNkxy
+hVU35VeR0YDAojfWKsRyuQVYCPeW0cE5KRWwRCUpsjmAk+gHrkit84C7QVwXYl1g
+BzqwClnUvTgEXBWs/eHRQNtVRfDAos8PYNbW28DmruaGpNkHZ+hFl7e3Qta/eb6o
+4k8e7+ebZvGf6P9lJ/+0Vdnpv86C6g8+rOtspFwcLXyinvlSXDWcOI8fGJJbkAyY
+srk/9LNuTtGxvP0kh+dFb93PvY/h65UQfyE3EGKbOfk/3vjlLS+s/wfDnUuFBrtm
+d+KdWhrI7hheNLVTaGjkBTZb1YaFEUXHPmlNSuvB3UvA2igjicCRE2QBBpxv3oYh
+BfPjeY5bvFY2HGUK4MHZCnFN6TZu854Ovv7w3MvPGdaPQyQ1tCE+LNgKPBrbTNsF
+3J1XGWJEjxHipdTZMLtu34qJaD2yw4Gkl7SmQfOuVcBW2vvR8HyyR5DrhnDaxE1o
+ii8JteYDWBqABfjufZUWz5C7hD08YZUw9Uo54BkfrFsF3y2ao63WH3RocT8h91NG
+jlm8AqocjsqnTI1iw/eCh8Xkfj5cx3Ew+PZ7Co+Rj2lc4kFgcts2D1YNgcIU4UEb
+ls+4806NysPJTwr34//a35tNwtyWHAd4Kepux6KbS3XZXmtKbpvYou2Dmu9kiw3A
+1rEJOgokyaCWdD9l0rGb1PIZLyzj7CuZZgl9mW+q/yB5VuO3ni29oR0CgwKQnaVw
+u5eHxygQiuF/69/M22UFAYKTXmzTDz9S4FrhpiHRMpDjNR3i5U9KmxLO9SpayC1e
+zqWGtmMf3EjNwHmRx8yq68l952ZhwoQIPZp0U+Dv3tr0aVW7lqiEc9POZCeIbExp
+aMAAAJnxZJHNlEuHopBZZHRy8lfw3QGOGV2uWNvGVpSI/NnGiS6tTTKJa/FEGjIJ
+OtlPI6hPjd3ezz2L/BlFkuXYso19MRphE8+HjswPDq7Qb5PGKgdouoyQbvsISD5o
+0TfxSbCwwI4RK79PLdn0vBVFD6WU8ogWpOr4C41pHdbAI7GTPddGbXC37dR3ybCe
+4Jup68fvfPYCRvy6Z+ZA+K7hu+gp03SCh467eujEVRmengPqocZ6+BnFhiwrTKCS
+muaMIaEExxar8B+TtxK+3l4CGHen9uFxZjGnLSc7KA3/pR5QxgQX6re4A14OqrPn
+YUbfHc/Ko6ljtcB1OCZmeGAhhoymxExjevJMrpksq+Jh21NhVpPIga1Xe38+2odR
+hZ8lPlGuCBCQgKrWwUbI6uM8aEHER32vF9QaP/0R/v5zMUwHHhPKGUDGydOdyctl
+4yS1rOMyC42UlxhVPpffSWL7n7Tq2+oTgWLMt37dC/1MY5p0WH8yZyyHRHhE3fNk
+l8Ya302vqbVcbzX4V21FqjmNT03w+JOKfXMvnd22IyMAUGXaFHhciyuGL3gi/OHV
+cAemWwJOebce4bay77/OkBVdv1CxACPVKcmN+4qPPWq+NRWU6Rbo0y4zy3FlJtvc
++2x7CrtXX2U2GbJM0aZ3vbaqdn9HSdUNygx9H2vB1d/vUMqpKocBN7BhWjod+7jD
+wBagQOvY6nOUg+wxz3buFAFm78n0LTQ8C3pOZ3o1y2ZLJ13YjDhNcIK4qFboga5T
+g4g3OnJIIJFXxw4C/RQNtTctDiL3HE8E7tLHh/Gd38VrcI/GpIHx188onpKhtxa1
+NLXp9jxFGkEArx0TbXUjTFPSo+qNIuzwD33iQ4/JGBuRPdKW379weNhapWoGANfj
+VlKxlE2HpEldHKudDOXx5hO20+lEHA/L6BQj98NP4T3FrRJT36FwBhnLV7alraDg
+QA1B9LSs4mtX4xh3PxzU22kImfWnJUuQ8Go/1vXl4x6NiM/oCO9gR2SpOryX01vf
+p7R2Ynh9nySekmJmiohm6gquh/r/iVZlmDOy7Jkki8wZLwDHqAD1QZQh4NLb4gYs
+XOBF7GcpfZWYY3Cq1uKKRABEqr+9hAnSx2tLAIfqQNZIu4Ed4Mmb+783URJuOCG3
+S3wI2H6v0UMjmUe7TapDeHsMRnyTFuQllkjt2A23vwIHGeHOMBQ/q8f6r9LYFgSj
+7vAHuQYPuDrOnGbYlPCorz/EM1KWuYA+qqfi3vP6HsDSExq2nlwyV+G4IbkaHsym
+zwlUX0uO2VmWJKEYodTQaLgQWJ7Kv2yX486FOAc5FoIt48rXsyBJY7vCqfO00N58
+Pf4RuKd+ZUn/EKXB6bKB5bSFAJj15pueGDj2GIDohw3poid/MvZ5XZWQqVepswcJ
+TP8HfexDX2bUdXmuQtEqZ70tDrjhIlYSkzLEoQv86y2e5eqdFr+H49wcEhyV6nEs
+/Ib+MCRt5+od6PqEsVc42RNx9JWyJyZm2t6soDLFnKJ9fxsSDnWDgyfI7A+D+egB
+hgqR0qJ3ZgVotWx6sW5xcGGVVC/UIeEp9bIG06MINe0FDpOru1Z6YQn+vTEn0JFs
+69o1Ji9zUC0B4ecBpycndsgOJ7aOsfW5a4fT3ISbDqUMUPLq6sMpJc1iGqaFpy2I
+fOP8Q9xp8g1aF9XjSXyjfyQQyj4lrqY9YOPlPL/fSJx8KoCU3tITFEDM2McjptRX
+GkTHwi5g4/xPiAI6yJ+Ryy+XPI7mf3d/bhE9brMOYcD+SqYBLTcLs6hiG+dKc9qI
+SbY9pDugix6oXn7rmCJqIhpIQmdvPvtbgMnlZ46MQzxi8frCMQmypFRvxf0SXgeR
+thTdCkOVyKbYJj2QbdW/8M1Ss7sN+Dpq+XdKu617IEUyzREsRNrNc2xL1UpvfA9G
+jZMdQd7fA3SuC+dZxNNut84nM0sIM/GPf7nluk5/Rwc4O+ck3P8WSHaaRl0uhn3s
+Xr/Bg35dRwbTT4yCCZ1Oey55aOT0Txsz4osL5AjtLM/u9DqQjX6vuxmkHxxjPMa6
++zMgFXZK/8/rP1qeEXoBi0F7OXbWxn4+hqkRBV35QwigJFkyEj/RmVs3KP49vP10
+TP1mT+t5BmshidO9Dq5LSXJ2s6xIsuZ/HkJIxvJmFlJIyLGPRboF6maGyF8/g506
+ZAOy7P4zMtNEXdzy9rW6WPXFaRjK2HwfKrzE1e9IfRL4fYywrg+Gq27wdCBkVlNp
+/b7e3xwo1gOv0lI4TYAXHbOmYKQmx5+6/gWRVXaaGSYkb8oOnAVLo0e9WKE09kSp
+wQgNASsHbEX5F7TClDOtMNoOP93msdk2wPUtO/Jf8XWF2EWraYE4JX4aq2nA5wbC
+g+1cvJxwZuZd2YWa0MNOIsS03OZJYJZANFN8zmYw9mKU1xbgUK1AlE6ER/VI3hU3
+kYjwfCgo0Vvoymr1oSWoqw7JvaTQAoBSMOqcAVLQ6+3/BHxNOdm4kvlqFd57W6L6
+s305TcqN4t20WVksCpRRD0HXAlJEds0Tn5KI1GEqh0Clfv54zTAVxkF84TS0SL7v
+f5BqW9obiWsehO9DvyAw8Mv1EdlMxQ9hR5RaVlVLk7E/3pDoyGnBBibsQCJIBbPu
+CXLS5o5KgOCLHAPCnLqbkAXG7xvP0SJdFzvtbRQSXIyhSOnSmpGkTh39TcQ0EJbo
+5248wkFGbYni4f0YcqrDQ0WNrA4JYO7Gs2++/BH4tvmel8kUVmlx2dLgmxdB/Ozi
+rIgmuhjR4YwqODiItPKyeqhUXuwYZ48f897o3aMAYrPKYntopdV77/geq5eH+gGa
+yvAKz4Ynk7kINJBSsrqQViC+tvGELTB3dzBhbmMGFh/tm91ck5fwdhhQOrr+wuyV
+1u09B1eg1Lh8e+d63k4ER+S3zRStgZlCjFNmxPTjx+I/H2TCbtIqCfwbkdzITK8x
+vNqwW3sgHwj+5nQuvdOvdy8NFlFLUfZO8E25DKK9xUkt44pElS1uivBatYOPZDcA
+WHh46JbSj2aeqhsvhWGGCqas9UdhC6jcJNoTLEXe+9Yx6N7tqym9y7W0x4qFKj4L
+vBjXBU7XprDCEKtM7cdEno/03H+Vk/9utHwJ6G0fmxof6X5oU6wij38v2gxl532d
+8EMdxo96b228O+Y4SrW8Y23TqtjJs6GLo5GbW2ScKlY9Hb1mDDfj2pUeojP8OMM7
+DtSsY2GDwC/g3nMS/+rDaIO8+nRqCmBy7yBxJU7KuQgOul/sY1dyIWijkQKS8pB+
+oNhXcxIlulZMxmQbhnZXJSyoIcTqsHS87SJCTlYzTfSuHEa8/GTQu3JU43GpZSwF
+RciB320jAOOJXCCcwzaBTjA4MshOIMTggxt9GxdeVTpjbTNx4B08WQycF6AtlLPp
+3RWqNoWLz1CnJBg85DEmqMup6JESnyux1al9cgHGODwNvjWPZTiVb/nMFWsCxXyZ
+otH6HtN2urFJMOXimlc2QgHAwQ46zbBBOmlAYSMPnIp4FIN5FW2omvDnbLIIX6km
+ccVUY+TBKd/0L6Z98sTVrmG2wJYcHNeBkcLc7Q92cLeZi9XjeFCcMa1F+MOO6PFo
+BLAmrQUCPcdHFT+C4nFJvrkxEP4sbUPD3E/UiKsfDbiqodpM8GHE1SoWCmsVqbOl
+1rBjcfU+cq4AU5d1NP39Bi7xEAdzgTnEh31GLTriJOQD+qZEYLS8zWpGKqnfi28b
+w6cdXOay/YLBQbUGSLr0syEyPF04MexlIYuqslYou5TKlkARm6DKeq4jT0lN6xMG
+0T0NM80FuImrnn8vToNVFqqMqYcehGclKbxo2bDwMU6JtgAPR4xKLPtJH1lF3guQ
+SjRSsbgh0vogcCSTznPUFtuuy/pOTJt9rY8udamggx38dyA5gUC1DXHZpND3IKLO
+m7bcv+knUTrrsf1a9WbjXQCfqswvFKquZ9DfZGeOKW1Bt7vMA82TdG/+5hFFWixR
+bUHYRKfOuKiEoWLmw9NBEpSQ9FHTIWzxvc5FKL6zo6VTnATIlxqd/8+lgmInB17u
+IOQgg6fi9U64tssmlDvnY61DlgxYaTig+iYoC8wkjV0Qm6Mg7RCqlz7uehcln1/R
+VDCXtplKvZcJ+rxRM5IqAnGwrLt/1FvUl8dCLZ1TV+OuGEZFX8qOAGBqGnkmfHL3
+wZydo49WiXAbTPIpk5xmuB3IjT4BEStlots8kJ+9MBLXbgCX5AugpEI+bZJC8cak
+WqlQF0cEQVuS/iZbPIysDYkaViPN7FRZ275NsvAVOOxZvagRbsfiJ6KyNO400DG+
+9Ee0Jp4Uz4CAhJ7jmOrirCiDaIqDpDPZnU5umo8Xy9Mpsd1QP0JV8ZurzZucJICU
+20gIqw1huxYYfbu1L6N7s2fkyKw5eUMBb0jOY6QCON22B/H62fmeFw3eoLle1KIs
+oQA8K7W5C3s0Krs3Em+m/sTpDJRwW/g+l7ZGeOA0fvuDyiK0G7uBnhXJwQFGJ0AE
+jNQax8wBvErwonPmLTG3ishnNuCJGjAQXJ+oEAGY+34kqqPkJuAeUVCXGr9y1i0I
+HYe8LbHfyZj40FL8ZIWA8yS8AIrcQxgMh1qYC4gVTXggEIoXnHzxx4u7opoZn7Gt
+RzlkWisjKAZZtsL4RIM8cM1OQjcg8BtIigVY9kgk9W+kiVlRC/tHv6KIEoYHxx+J
+WS7kkMmlseH1Glu6qcA7t/iC7hVRQoXHuSB/vpmI9MQn81lC8/+4BtMhz7/POSMy
+DU+IrSBdqzx0RYugrxmfbYiRckAiH9lZw3j2dOFVoh0so7Vk6ACZld03jUgeuSi3
+r3o2LoShK5XLLnsfG24NHeeBBma3gV2LwZPGrXAkpNdWKjfkaZoL1s6RNc8l3Aa6
+PFgD4s5xWpJuAXQY0MUmDo/+pquNJm1iDvlPJvZQF7H2triuCTp1coBA/tdf6P+4
+JZIzejUehL/xVxWv4SAZPvh3kixmEQTUIYqfr6yFkGaiO9PWUcUtWoXe/ypStuS5
+SlbGPntUSRDBPvkg8EsUydBaoin6yjj63ZcF55le9alWec2oGi8HO7t6cB6gcKe+
+HZiuSqdTlwSpRYJb8Snqz56d6p0jr3m1gIECio/GF9nRUi+6F90TSBwLLijhltBq
+9zpEqokFnYTb5lTq0q8zUiGwu9qh7Dh+iASeqv47kIQgJwMYeykj8qCwPzgxb6XA
+xXfOhgDUNThaaiyQew/QwNDkWzxIscm9Hq89oLyggzsJZsqWVnl10Aywkxk5UBgx
+goaRi0nzGZUAv2ce/JisQY/IT0POYz9y+LlJbAQzql6kednRaT0ZLyaghZDGxs8s
+OpnxYD1CXxSrREBfCIXuyTuh7Qd4vA19RsBZomL3RYcNLm3huScqGUM9yJlC3tbD
+bDC0H9qift5C7OhJGLkt6lsTEa2ktGAX63DxT8hLzXbJP5LMn4i2nVu0ahcmnhPT
+sqGsQDhJ/hbFlY7KDu4B2S7htGD/8+CVHwBvbpm6RJO2TDR56qHuHnI39OU10Zxi
+rK4nKrQYk7c4LkDpwLGe9vWLHs3V8CBWLRKXBhOh6fWHgPvErlXpARmB42/HoX6l
+fGqnReTa45vfh+3yBz7AlVZiWudzNYEhkqzrDV7cIpS6pqKMDq/1na9f7p19vXys
+DRAuycDpeg0gDQxeNwIl9XPBwgg3ZJ321JYkUjP5QnMZPPxmHIQ3Vodn/XNdToRP
+9XqhyO34edBxFnf5XtcRS7YNIDeAD1jCMuLPMNUqpWwwnIvRpASHr4Bn8mNLIUtR
+pEkPaC+MYnhSxEiTKBiFFPe5B3cMK5I1XIcByjNUceDFctlmXfsvmK7Kwn457SQ3
+pwYaVV/ehldFKeZtoFu9Vc/wa2tZ7/I222XgRiKRQ+7zIou7+Iw1Xja4l9MM4dl1
+8I3KLPEabNoQOFnVyDK2cgQrTaSOxkOK/YgRSMdbPC/56EQwfBDYtH4URJZlDR3o
+2wZUGDpRzWqf+eC81dtVJSK2l7dspFbnNL9hpI64FmnmP5tMlaV+PG8R7EAolAqj
+auIqGfhiUlt74D4lomeE9DPJwPCD6MP2u421f6aE4CiZQIcehpQMJ16MCzpTbhst
+LRCF7TuopZF6zJWbLBkT0su9ZHXUqCCPVnecJG8YmmEg5IZfHv8tzs3FslzJP2kU
+SAlEMXT4PBqqI7FThSNBvoPXaYTo22r2SPQV+jw/FT9kiXGhsDlvT71jTD73px7k
+1xqNqbPwysdqGv1YhDrwsvG2tbH8XZzk3CE/TCkjGr2qqgYUuyIVDKm90ASS3N6C
+u8Mw/Ym4tuUQOz1iSjFLN1lUsPzLYyl/YUQXqDTYgVQdtST9rAGkQq1r17OHzIiN
+gPM4W7LQ0+cv0rXmnTqRERrfxtSU9xrckLdDjqh/Xh2a2jUxuNQeH24morb7FVjF
+8zhxhljBreRVceijUxwrNUZotJ7oBoSeZmUFyQJb9UJASywjXTACAmefar7u2Fku
+Iz8GASMoj58x+eCgAKuUxEjMCjeXo0fKaGOG5bOuuapXRE90f3jtdTBkH5bRwQss
+Tq9k+7ZoR1K7qguM9u9rhqGkN4GDi71RlGFKC6pFhlcBAQS1Z1Nv4gDfRgdbquFL
+XZao7vIX6TecgF4xhE9gObRHceE9fdQFqE92ASGlCrpkA77ZGPvIjEy7NI3tCEQL
+lvpOEumlOxYTnG8WHX5O99BFIXrKNvVlav/iGndud05Nv94gg/t371IHnlb+RCO1
+ezWZP/heDZqRtZujMDnfolCbMKWXwB5RlPWJpqp0iN1/3F6+QPcRVqv2NmCTanUS
+sEbnb5KbdE8S54LAwwvdgZ+6+tgY0VdQmge/YcDkj87w7QdOZ4ajCVQ6nseiWWdQ
+6bOiXAAE2Xdls0krtP3Zy9Of4rNYplRajC45hBmrjm1fTdEs5rAR2gQLqkC5mT0j
+nKfjd4P26/dw3FQZRW+4yiyQZwgcOl9gT32kiqRIeiIvFBz+acyme15sUJkrRQCe
+DZl6c5k5+tVVH+XrmByHkHo0MtMhsJXm5dXAfTNl6CannXr0FCDn3FjdC8T+9Gfb
+3x7zx65Hwr2m43YHF6ITkHt4n7BuSK/Xmb0jxfJp0Zw+U0mniO2cwkq6cWqO5dtL
+xUGqSuqcYbJeSb4GipQJ7nZSR+moUfoGRd/sUolMV5TXxemwBEhPT38N+AxG82Tf
+a4fnCfx4OiHkgZ3chp78PsHRcRwzSh+xIr32P1PN5CxCvM5s6Djm22ieGwbarE1U
+JgmUcqyKohrsX7YNNO9iEZt3YUzbh5wfFG1+KmfGQBNFNqSh0KUsQXg1W5uds6EL
+YzZ9P9HEHSE6yTIQur75ux2XLxmcHSdZKJJDNnIGnAKqPnO6/VXsGAy65igpXoWx
+GhZLOtAKgcsI3vh8c6ZRBpaBJeieW1Gff4/MvNiFsfCTbhydaU1CAGc0XL1h8MLH
+yc3UaBpKnyWB5NsQVCe+XifNm1UdK0kjjbHuY1WJVWtRhf8rjv6iBsj4Z71HqCeg
+WLvSzC/zV/XqkjEotdaYa16uNfM8qnpgHadXGmKGOWMFg5n2fsqRGQIyQZw6jePX
+goDCnSbcfrhpQo7bbtajHKex9Q2GCw4nfyDA5d4d3xFKp9qVlEXvb0y8BKqu8bcY
+dHGTGppvU10APPgcHrcJCohOJcSAwQlXwloogyLKzNCabAPSpQqvbfkAPLCqZO9h
+GdsYz7t8+15hA84TdYS+OPwS0wxo6K6xOXRUqDmwQA4vCVHAYTSNJLmW0W6R6Xch
+sFBe7iaM3akiy4nZe3hcXkUcHeyzFx0bMRxs+HuG7neko+4n9HzL55FgcA1I+Txx
+SXXZQeH56j55B4pXrn4pPwP0xxo7ArkNxFN1yrBak71gvi/vkNisjth/5P4rrSUw
+x6I2i/qRXw0Ivgno08CmXn0s1T1KhbN6nYz8csyqSHMSO2jFRZrToOVvHOsVkmac
+aqebNh1wuv4EyTQViuSF5nwGyp4U0gj54QlJBqMFChMhPCygPVsreQfLOR3upgKX
+8w89TxZaUzrBXYKkPa0d44cGVpqaa5TDH/6zEfsMHLggq6zs3doRp0XO1038EAFZ
+QF2txI9ThYMIJVZXfJgq38qt5GG8lUgbjkANJIlX50KnKOngGWeAzjsbmvB2z1Fp
+LmLle01mRqWGSudmCCr7hsdZuADAFUHuA27pW2Sh/kXiDEMGR/ITYmk+SokRS8Zv
+N2/KOdSkrkwu9LBo+Go0nzLhKJ3utrZrShyX167Vz0PX9N/CRz4t+iLMNmaLYcAr
+jM7bOODK03WSZKsWeJSMgzkMSBVXKqlaksrSCEdyTx7HDtuO8G5p2wND9w+hevoM
+cXywoaKlS5arDHeSi7c3S21gwxGZMswmvn1ugIO+4okFIEAMP05EXCUJvdU9fJwG
+eaqOwAeXQy2z6Vwi/VdbNZrVE7caH23s0x9z9Gp5fXqrFs+jCf/y+OUy0MzD7J6V
+S4zlpUIwkQinNeSHVIyBL2soh662S0cchchtUuXKbwdu9dwr37ertungon1FJJRP
+PsgBcD3eu5V2TP4LRWSOd3BhPq559ZBflg3tWb0rw8b5tbJH0+iWal3Umk+ESEv2
+DYS1wmcLB7sRBOCHEjij7YyjH5uyX1wzO7Mdy3QvS6u0UoJdEBkmrJuNhjxbf01m
+eA7CKVQTqy7ENIKTfDIHSn9aISQGQBHrg7gHXRvEkMz4Azh3s39jb6NbKaQbuAu6
+FP0+TEf0lxduobBcL0jjCUdrAmO2f3E89rcA9avu9hwmjJMehn61NK+YnXLtr0HV
+poi6amH6S+sNgDo4wXkvsc/CtEarHvbF8FSCGHdZzk1komZQ7gdF8N6PMjb0fIiG
+iBYieq/WlvdkYIUvYxGfHDEMazLZnb1jGHzO9Z05+4E+3WYqS+IcUIiw9zvrD9z/
++jIhSa19VhQj/gUUU4I3jygPrOTQdR87WXuGvaQkrPeuQoof6tXuvp8UA69dBI8S
+6SfV6AG4O5hU1EeazSzkY1YfLMFr985xhiZF0pfDcyrbrT1IaqDM+AdX69ycm38s
+nSZdm4+QghlCmwEQt+EGf039GODIufI3KDAgQkEEhaNn8t3rZz2Oq1VwB6o2ezXg
+UJHDvG0m3b+Y3+oALBLYkf5Hcimwuvg9BVfELdEmogWTg7I6LChxJkRZvoMBvdah
+IYyTFTiO23ETmNYlMQ0ID6FR2JPv2pYQEDy+9OXkCFtN6G275vkUVJ999auyYIH6
+9GRa5gf5OAIkdeQtzxPdjDF9UTfPUaoZyB9ZBeCwvQnTZgRq38xFsako0ARayA8q
+1TumYezl1EEVSoHLFo20eg/8p79qRGDlSduhEGHQwDMpdTF2ewniUEaFRALRlktp
+YmdYV2wT6KUw58BOi6pokjkfW9n/rhlB2YBtPGyhJDbZkhWXR7uUJTzG0UEKwLyy
+qDMHxm8vlKtKG9F6gYLLkdxYtbRRYUE1pbhg3embxMtaN3C/paDo0tvkNN2ECbVi
+rerJ0JGnacyvuzb1soySajVvsNL5pqCPe5U5Tz1/JyHj78VvtdFRmV1mcEKDa2Ry
+Dz9RcvQFr7/4fvUk1KSAIvUJRxH7J75ytwcoWIPG1zWKyGRZRluOhwe8HAm5cTl9
+dASA05+uX1IT6fMwJRz4bBI1B5fo6f8/TZi6IQgngrUUEQIsrqAkxyJdJjgn8aJz
+SUlwtb7KJSWtlkOuQrofI3DZ43fGS+s6IwYLxwTuJZAfMzO6Mr404j51IHG8ZM9P
+JFq93+t34UDkLqYST7NNyNp3r4T0imPVJFkcC7MwQXoSwQwjEvb615hVuV2rmtOK
+8mQenISqSh+2VKmXNSZzioQSWAwmT1+NbMMyL6fNpabsmKvAdIKmosFnvqRiSf3i
+k5nHzLmukf8+L8bxx0wtqSaR/EtIOADBhMvZSdlh+mK5OX9iqDk99wIUDsB8EoUO
+QUX9du4punADMTD5BLMUbyGCiDWy0L5jO3Y/naub2uYIoF44GAdCOd30+NUINAih
++TnqrfrYPFF3M8oaekBjeqzsBrfvc5WA+ISmjs2ta/8MdT8Hb+A94+XNqmV9dY0R
+XVoXzXnFYF2bX4TfFfSLfXHbef3ztcwngRG7LC7d4vz+IfSKXvCvmpRuZOfkYscp
+cybVnLfUi5d71yx1cbo7lrymPM9LdA1mnd4eBkwWiI+tQmg4Z+HXECCbDhXYbVe1
+1ku65t0AeZJHn6sNl5pHkjxKQq6T+Au8T1Gy6x3uNnrVvZ3RxdNaWgnD8mcHONQR
+kfJW0U71dnYdKy68dW8ipRVU9gDgKWyRDvtz8MWEU71QM462hlS8VxHvsPp87Ldq
+uL4/Ot4s4c4vTRywNYJ+WdyFDwx6bXXRv7Jlsy+E1rYUoXIR/VMNhysDlgBnoA3C
+FrQswKGhDi12CJewgHiyO4/m8Q7YhvgLFM+dcMNUDA8HbwfEbvd7n9hbHztQh98p
+vPQriirzdEst/tV6eHrifopr4/fHd487NpdzWm5A/S2ZAevoX42XFfpyQ5M5Ul7U
+lDXpfojykTiIfUGGGyHh16BGHYj04EyqkfM9BCDTBZ3E70gNKoD294fjfZxigO9n
+EWzu8IVdxHCn0JUlAObbEth76EAUfgGQXzosBelH1uoxo9xfxWNZQHvl+OnfDxVW
+aI5kgyzygAzOL0Rtkzet1IHBMeH48jMfUXdK9o3vk7SABs/PorywBcp1o9sis9Y+
+i0EPtT9bQlkjL51W1dL/Kxth2/rUKQtKqZz4NWFUVLgRXJpojE+UMDOsg/eNSCY8
+BZJTW568oE+sDwVnlfEaKCqglvbxCPVncqM7UixzqnaXsgERhlrVQDx2ZV5+cM6A
+INi4CCWu49vV7CcJQZjcDSTjJgNDbhv7rkB5M2VMAJUz/OmRHBpm/vRlXjiVe3sg
+F/YsDvHxmMuzM8QDq+OUVwq8jaBT8el6Q+WJFB/uvZDRp2oYfJ5aNz/QXJ6TNqQ3
+mQoDGjeOnCCiJ81ZpD8vTaSv8DGZI4m9BQ2Fn++LsE0B3YJZQvHwE330tddKW4zm
+ILz6NCjpi/Fr6mRQYx4PEzRn5gl/pVT26Hin2sY2cDJu400tBxH5zigwK1FZlPyO
+lH1DLfSv3gq4OMlpIcfsaI3q2kqWw1xdbDIZY02GpNAgDLiZh5n9LTj3ap+D1IiG
+cyG30Kp5iBB0MURr3hVSRDxlgT06A87/lLns6/W7n+OoGEvZpWQaDLKRuNOoYZLc
+GmSj8xqOqWcTp0QsilVIsC/F6ISO2O3c0fBtLcWGkJMHnTv1Ed8vfssrDhK/zROJ
+/tiVkmqIZ9Otwxr/EksJF+8C2a+oJrBTuHM4mS2fl29kdE8RENQ2DnHSP+BIY7AS
+7JckRx9pZUdE0Kc2ItsDqav0Cps3yYylkqnsYQpbPBwMbtD5gdX8KYKhzejrPJxa
+3Bet0qOQZNhqjgRRrh8cU+wvVK/KX/JlZOyNhDWxIfKV10Nv4ifvjzureFXQlL+d
+zIdoMHeJXKfEcOHPmbrz1VKcph5q46wabJikvrcWwMyZMtQjY3EpP7aOn3mwHevx
+5wIxJMS30GGdvsXRlaFVuFOhRxWUxDvP2JXTJUUfh/AbjFcUFx2L+dt1l0rPz36F
++3h+gc1MZwGcpW8ALyOc1P8hyAzsttdngatRi/AqSx/tjzR5/gqM3cPKrLdekbRG
+S9dUkjp/ZTOcb2u9wY8LP5PeeDGQURL17FZjOZOj6ziYDWdo8PoztRxgoQQRNcyj
+N3Q1WJossxpYcI454vkOoh9TZQPfE3AX/CgkaLSp9IyO0QV/9CWw5DWBBiBW8y9U
+Ae8U8B7mFRsqVXo1yxvoPxPxX6GywX7eo7/0B91O+kYfP2NnRIKhf7gV4bBfeuEE
+ymCzP6RkY/XZIjjWah0lLPf2PWc5IoEP0prN4DIsBFql6EHsJsByXo7j5Q7J9tT3
+u92ZK6+yeFwdEkOKGi8no6mVQYOC0elOZzJIU7EC9G2vPiuTtOFSbaMkD4kfg9gJ
+duCtYwiR724C/6g61NsezdBCxJRbkfKHBmc7CmvyQLivlL7wy76HpNp8RKAptNMb
+cAas6e5AZRHR5V7ETpaUr5ehGpTzjkdiIcP8OEAAriGFWRaHnGyLZW1dRGvYSuV3
+Zvl6dT1OgvjSp1zQG5IQrpm4uBPubWN0ZGjZF05LLn7HrcOgiFrUnAXaNZGF85zc
+NBMgONdvE9q4QJANJVn8Fkp6Av2fFddPq5CdeKh6OFx9mZ7t9eM2LMqpREriaRS3
+pPfaxCjmch+2LuGr4kugXz5HSVC21LiBDfNcaRiDggYHncA26SFzm6/4FylpRCCX
+xr65VBAqb1V1Cmr3t484BEfZ6jJAejL4DMu5BkiWIhRT0W4Ir2swRf3tGwg9RW4r
+8fyI5SthVCZOi551IaWQLuFdOio6muGHF7e7tB9sp9MHxcZHhUCaZaJt8yhFGRG0
+RCjcuabbG5jGseZNxPdpPsZBBOEr3zC+cZOtRkeIs+o5GD19ZBK4PoecfWhYAIrr
+Av2VyE0MkqvVq920npDhA25ZfdpAFVG/cXhWbfgo+KviaY8vXH6iLUZUd0PNHmr5
+Cm0L6vacTlEksVe14PdvfslfjM7fHFfmJscqvw6rZ8pAJjwrA4FlIGoj9X0mJ+Y2
+vszdC/nWO1rXpcdqqaGmJW1B7B7GVbsnT+TnRIDJHh2mFaMc59Dz/iFIy7QXxSxL
+IvPKT+cXpRlL4YwGtV5MIDMRQlhkRr+NB1V0uUKEk6Vd7jA/i7yOqvsIeQ/GfDC2
+9EuoWxQ4s2xE/1eFW1wkmyYvDEnnseWkOfWhbF0u1YOXJqRtzuEFMfWEnkvn09x4
+Ml2fKL/6UkQDo4BOY/v4ortL0rpGD7iwSxCpo+oO0jAJ+Ce2obwFA/f1NgPF8hfF
+gv3NIFJDb1S5XP5izMAUfvupUN6ZGXTD8sSOrkAnV77h3UE0NPSwaxYTWjl4TK9j
+lfs87m3F0rks8q6LKo+R2h6BUyKkUKDVneZ/ry9wJ5YNRcqUtZL6qutWZ+CeJjCk
+4AJ8TpOpbX2YJvbha39EqD2e1JW8/XeL2o4y+fSd0T8yjXG5XA47+eKafnefrp0v
+bTaorNdrsrRuQOWvTlGFvzmxZfoLqqOqauQq88FZ8aQxHkvKbOxN9yKzqITayW2z
+zlV8EzXSWofj4YSmblknFEtoQisR41vJBniiBeJIJFyfZnL/m/64TviBqEn2rufD
+ECv7qFhO7M/O6q6QLwd4pnhfz1+84w9X5UTEFjdwCsyazjNUIRjfL4hhfgSj6R+f
+Euyxvi5RtNWp53cdORtz7uI8aW1mxe1vV2XTc1UrXAiBghYW4fnQTmq9/Su/nJtG
+vfpQAm016djAIOtHzItRY9ptYGN5kD/pncFm/VSq+w0GEmZv8VXPv03x2uPNFGOw
+FCY/jPmVkWfgx+tdICSv5frjSuvua1EzwfJ+Rkou2NFOaORGv64tLpwf15cX80vs
+j+xntU8KZSTqIWkJI4dXNtFf1EgiZVxucLA1fCykPAWNagyhQbq8hzZW+McvQZZ4
+aDgZMhOGQiWNTKAYes4zP3jzH5hq/LARU8Iss/GEvoiDMvbqo/0JaRB4CVR5c7Zv
+9/vBfe/WIdJYY5/Y2AvvuAGYbAcB3uWvMq4mKWS3xiulaOFU0sy3wlo7gzH900BZ
+q8kbQzyBrROe7eJdKczUCSTR3+qlokbDzn7zbEdnkmopphphpb0tmXcdp1z76vTm
+SoudPQK1RPiuftgEo7anx4O/s2Fdn+PBDZfNOe4KprACHn31KqC/H9twfb4SOqQ3
+Iq6DRyIbxFgB0gK0jNb7qI63JWeaNWxLIGbIyIDn5/jY8P3Zr0uienAGbj0vjmpt
+h300+ujxBSir5JVF4IfhN6Bq1b9JrXpNMo52OZkuEb7qWqaNRPQg66bJ0X4ypTVe
+KPbeQ16zvZA7F1dokpHcNGerVdVLZs1uJOCYk/3r1TnPUfqfy7IRk1S9gYeF/nTk
+joaPK6wwmkUQJv8/x4Fu9mK02RXwLGcMNSYu0G4UlgTyIdrL9XBbEetEj11xuD6O
+WmHq8xpddbMe9SgdLN1OLgreZl3U4vOBX32QwBwPNwjHWwgfgESjjTs8TOzYsQV6
+ykyAh7JEqYlQ4Ll5OlLFITNtQa6kO+kFS8EIY3lV8ELzWsL92OMURvOXRs4tt8iF
+fCQfU52y85EjnM2/1LwQVX8trcgGSi+b9XmluwwmaZPoMlOkNOi6YwACxUcHz6mx
+n71SGhULCvTycdmMjKx00an8L5tf7x8Mq0qb2HqA1Re/kHbE3+GHCzHJrTJwpZnR
+aPK8zBhdrM+Zop20muC3BhpEH2+bBfb8gHabmkPHJW308nYuZjSr6nr9fr5o2sSZ
+58tk/tOnFru80KMV7AF/3mkewWhkku+ZRL9aXO8P0ffgLZf94r2CR0tRB3+1J4ko
+uFIjKmFRB+I/6Cq73Tkk7FeqBct+X4paNEQb5088WTJQpODD9noJI/Mwa9ju7RWi
+59DfMU+Rjq58dRpEX6RF73BHDvN1IgUVkqFvkNqNkq6yGcaZ70TubxKA4Tl79+4U
+bvaNow+sKZNr8cMOhfE8HtcGEflv/H0IrTjiI+UITtIwvMoJ9jaHNse90GHIEGG4
+Ru/E1Ga//YPd4H8ZmZ9PodkIovaFXbIq4cdke6UcIK/Ps6lRHI+088NXloGnhuTg
+0fvgr45sadz1+Wl+cY93NEPvsSbKnNNwVHdUI66b43W6i1477bCeNf7tFw6qbVPI
+UmEjrxhYzotEBwhEqp7lPEsiRIk1sFShuRSh9teJKH+pZbuxYwIVjQEZ/mvtjGCL
+DsMlL1X83mPWB9r437wrYX1YbuOMzTtnRDuRPZbnRNgskF+AscYAeFEB73ADuOGB
+jqrqtNfJBpG1spooMMJhVyploKt52lDeCNUklKYipIgFA7VF2E5RsXnFuRDH/sQn
+EosOLySx6mbS9iiQ5AnZRq0rhjoud4IcqocFgfwgeW6FHAn3/kHwUI5FuZHgrHdE
+dQfQEwpF76QgTF2AylBHBie++uk75Qx2hpZna3i+//Je3APOZgFGCA2mPg5vykut
+tCQlrHCBbmNG1jlSzzkEfkYq1xf3HedQJ0iLWctYtxy7l2wMxKeNdCsuxKFGzbEz
+YkO7IO9qlnFwWtjD9q6nMeGcvnEb4Kd4F1joGKCvFDXEjwBMcWtbTDAawPZeKyJ6
+4ZoDHoH6l+YpAOBD9DjKS+u5GfvCH2PN1XLailFH7WueATdCIiwJw/xM0r6jF9g/
+cK/NBfcyPkuovpMq9kioAMnHJON3NO7GUsIUPMZ9hECfglvyUfFIhFB7If13M0Sj
+mL6XOkGOAgBAD7chDxrFk7Aemva8p0j5nTN+9Iw2r9RXX3DqYtFXOFnzbSFZZ6qj
+GQxxJMCH+TCr9w/h26dp0Po0OoMvGNV8rlbDWHZvxQIHjr//iBI6kHZNHi3hKf3z
+YvKynVBKek28gfQTkhHyEFy1W96AzhQbd4u2aWhagy9X9WuO8q9dP3OptsXDH0ld
+YeLZapoUbR8Ajr6m+LFnDvPJOu7qLYKeL9UYKscpQrOQpJNxV15ry1kog4uVQVwW
+KOq3QdtbBdYxlBKLEPjJtry7jb3CaSFMktwofBmchymvLzCXQdfgyZz8JUDcwcoy
+Ws4nbG7ea0DZRLMkTEIrrLHTkq9gKkJBFrhLZuNx1sNpzeUQfpxMf9N3vQ/plwS1
+YW+QgVBQfs9nHiF+4MZKAG/HK2QRl9Z7sSte68iRvuS2VVf8wvz6sDZSHZPeUf1f
+ekelZFPmelg3NGBL8RYPKBKSlQBlKpn07oWVqemlroWiDaMDkjMZDPRVTQA/3odT
+JnogSeWjXSp0DhvWqhpo+aj0KUMlhBAEjxPIgxy080DczBjzq54suhk21bXW+mc6
+TbdeX1HvjCyGeI7xZ3S7kBsG9WGJJvZnhJ0iQc3NcqTRsU+GPCBVe7s4wlDfbo1I
+ns4NBplLWCkReWzrsv/aQLbIW8JFJbDFIh5DquwElkdM4xF2ERW064fLqvu5mX8I
+ZC0pGZcuLn1pZh6dBQ7wEUzeF+ZPJN+BPJoLYGrqiJow4B32sH0rm8TtABt3nxWg
+SUHysgXstdlF8/DXT1VQrTPayfI5s3ef/lgGuu+OmK6wkn3LSGPaOMjCrdacvCcl
+VokwI+KiFCaJzeDTuAx5ibezbQXa/WT6hTXRXrzK0oIyQkFOMfvHCSO51RGmuqHh
+7Z8aNkkDmJ8nKNoftJsefK273KdAOHyEeS/LdC1qnjTU8oeKFZfwIEI+3FBMt/Pb
+GOKL5KUZ41SndcKuYMwiaQcbSRpHhmULRKF5LhS9NOg5G5bnCJFC18dksy2KV0AV
+Hw+BLyVj8OUfQjKm+Cv/MGRVDBytkD9ACBFNPC/61qhjQz4yJPtzyjm6+EcCsri9
+TGL1bmLug0+0PQwmg3aa6wVoI+M6gjnlDm7iW63v2iHUJotHr7yNjnR6Fg+RodOR
+cZWvp3ZQRFv2hXofZTbNWtQJAWOScKspKqF+pSH5LgtYGRyHwWk4FC0BXRPJbRjC
+Y5Xu4CcurbUODzlvyEb4jUq/GjsS0ji0rDN/Bp8tufgwPbknCDVnEX2yABkM90Zw
+AKEbmC6EVGXumKTEj67Rzpfv+/7yXi+A0W/Gq2VqXG1Cr7gxgv5lTq6jAaJ4k7YY
+0ZqH/tdtN+qjlJxlXRBBfCTnKgslrXUvcugJ1xYanUXEQW8gLFGh+FYn/xGrttxD
+is0b52RHLJX+6YAJ8pQA3Be5Dd2zIgZhmllcFwj8y3an3RbGVpwLfBDKHBfCBQef
+iasan4/1reaFQpGMAOEKvmbzNzw1960YhYxjvuirXmCYNTWCswmjZrJuB0ZY2izG
+FYPlcO/idTMdBrTA1189DCZBfQDpgqxaCt2iK5GHwkwnrA/z91lIbrAARD8brck9
+4mbA684orZEL0INCqDHFeQVINNdCvdJZKgvuF6YeYbEQV9PV1sc65DTqbVH0Az3+
+oTMap5UyW11HHDrXRBaV3SXKJ86TzuYvlBxuzd5rOz2mfTVnEJwxZ82FLtGgTbVP
+gZQ2lUtdNB4KBApdR2UsSR8aV0Nm82dakvPt4fR4LqJzQqN8mVrh9HhS/qZx1s6v
+6o2SPe1EADZX7GEqGqAasl5YCvzqHimj4BC85wfqKBwLci0ZMfv+hcr87Hz2ou76
+EdbY0O08EQ9aIKolkSifZbQCX7xv/AAd3cQIfyAser1Eg/KAFAJxMxS80dzy/nRe
+ZI67ubdt3TiESs3xshgvQTaz5bDfg12dCoqR0nUhHmDV4qkXC9CWpKz8ik6mZ6Ca
+UnjmdGnVCWWueNZszwDs2+Bf9kYIAZNprbrucSlZy7Iqjkb5kzHHWHB7VDvoI5nC
+lpADzML7OE/tTwBlX5M4UWJ8T+TZfebVG5RJfrOpImQjtTh1znwevNfcw1fuhaNU
+c5UeCArv4EiOmhJCgmiV9fhIarWfjg7x4PqdHHHUHcK8GexNReG+rn+O3a9ouTmC
+f851Ph28HlD3CmjCmeS32bnr9iGkWETmkQO0cme72sH7BP67GuB1pTrng7ZOEpZG
+q1x/E1fmyl0jwoWjfzEDsdcxrqKIdyatJy0vYgThHzQYKvKphMkhmxv7d3KPfqR8
+GaWzb4O7UpT1Wh19PQOKPW0GPDIxN11XyznoN7DvedjFM1GLt1aYMZd0bNyHEee/
+2/q6re+hUCl2sizHsTMkovRiZ7A8rVQq+RnmzQcGB5ERXvh1E5ONO0wO7Hjl4cWf
+E/MQVwEhDhwLfiFiN+uBoOdm7SCllRlGUXoIcxEGsbTOp3e4z6GFzZFkkwWnuhY5
+rieVqqBuFsHL55fA5KfvgoXtL7hb42/AAWK841uS61QbX9xd9KXA6XRKYvQpMAPt
+ZM1TakmE3HbukV5S43e1UQ7bdvVHQ7Q2B+o4l3X5GpugiDR9EvJRXkA4gTQbkZ1e
+ghP/7AafXlWwjicTAfeaMalQLNMQh+UsdeJfP5uTx6i17wq/w/5SMWrH2KVQctJ7
+5xb83v9pY1zb9iSIJCw6xEx9GzMWRY99lo4nSderjD9Z0OJiWPDpOplm3Vn21RgY
+G7TIWj+jsKJ7RfbCzblYdUC1bM3RZMfyKvVSvCgJ+cGpDhLB32M/9O2/99eGmH5N
+efC+DI7zoTAzZIswknlCyAkCNrVOeNtT3cDehW2b0mdPPoQjDsIcDp4LzCh9A9Ag
+NdbBR9RLNnZUjP7G3O0b4wZ2XVJ+ByMLkpAmbFS6hLKncOTzJC2luqn9ZKQq7y0a
+cYTe7SCmyW36ZS1NCuoV3BEDbdNSIwniCA5wJcxl5emQP4sXUauw3fDz7Ta6eX6n
+/aRt53HNsp74LmZX6hbJWe87xMWkLiwZ4fCRVK3VdCcQw0l7XwVJu7OlcQxknRVB
+jN07EpKrguAjF7HJ+VZyd6ZAG2rf29EjbB70mm3WvNoll4CUN2IiQa9F6MwNS98q
+gqVS06TfR24RwtJ98em+zUCsWuSmASjXbJ0DnOOTRc2s510xeS2OR1ojuqgS8Xy9
+7oMdQg3hXEQ7JKrV/wgXLSBRql8KI5sYGmw0unZ3gUolimBQv6QpUzgi6Og0An5M
+OoG3nQ5Wqq64nzWSeRaZ5tP6/Ks3x96Ku0oWNKJUgrut9wSleBybhingMciNuYoC
+BlP7Ehyc2tAu9F/iw4KrpRnmPfTrYTGB4otSyQhHrr9f5rdrr5jQnUbs1WwDEFg+
+dMOjMnmJeG249R8tMmWgcW3Q8nwNp6lk+k2joj3NaIRWi8rKmGowp+vjg6mt85e6
+QQb0TSrUp79rh6VwWFXydf+pvCOhIYFeW6qJwZKqpZWJwq70jF12cL1pGvcgpRsC
+Vb8ei30ZiAG+QnPfd35HDg/O0ylomLB5xA1Rcn770u2gRRSGhTorM+FBdkCyVqKu
+RzyJVyuABBjNKpYEUmnyIcV4VFzeWQlirJJvzAgG1s4//a98/JAntTmrIqtt+ZSo
+cmXdScOg6xkr+Esw7jqyEOUC81Vrdlycac/ZizN3R4Zggm2LdEAAcDT5+sDbwh3D
+T4U1i++h9n1Nv9PF79lvj6zPd87W9h4JKt0xIPSZ3eMPQxj8TsptcNvIGXJ+Gr5P
+3OfqLlImdvR3RC5Ndoby5h6MQWvs5E9HNWORFFi34QBkirGdJjaygn1lJbx/UTO6
+u4cw7hk1dr+D5XSHqUSlsT+kImezA24ScjToVV6xDjAhEoTMjF5Hgpxo3wdUWEkO
+M6oMsGBCvgrjfwn5n1eb0LoJ8rgPrqvFr34x34g9bFAemo09Ah9ru67GsGks+ASr
+V253tVDeJ097SseK2w9s48sByEuLrSF1kqiNNgdtnu652P4CH3oPtcBkdKeSCrGU
+5bsH+n6osdw7LeSlq7fIaI+pKIYwK5AZ4NjGU4bpuO76Sm3EmH8w6mahAPomW0EP
+MbnqhMhjB3HXC0LKOXxSFzaintXLye6L7vfzI8jn99/YY6NgMpwhIQMo2ospabzj
+LOGC8fMA6YdJTH3Yyoy2cEa/ku489bADnT9KeE8AG70nlaGiZ5RCf/8WSxHwppzQ
+zGCInfDsxom4jhOBdpUUo95QKk93Y+qGeEomDREfaVEfHi0gUxE05uEiI7tWsVgU
+skRh/YyKYJFdBniTZCrcXCRYs6K/tyKAg6S67K1JqRbH7bVlIUEcFN+jrH879yup
+r4n6zBJYCIhrbza8E7WxZmf6IfTr5KnR9SqQwzDH5Jk6IeyAUGLpz6Y5AdfivgY9
+5DcycJEK8dEIa8vncwXdSlS60hz1IozmJtNW3sJ+oHrJBCumfq1F4NqJmi3zCZOR
+sbp7NDET4/G5M+aHP4xS4oYsUNB38whm+vabu2tBrzNxap7xxaGMC+5rcvdT0oSd
+tYkiu/NsVtrTqjPTAOHRJ/wjkGenG3+lBKdwCqQqNK49NS9L1xTK6QfoEf/7lJTX
+17k0qBY9K2drv9yYAMLBLh3ZmtXCVrxvNvmmfGFlhG5euC/ilakW30lnUDJoiaU7
+1lQn2WzYrfu/XfqeMmdsWaBIp+Fs/ZsGELNqdowptSjQFH/anC9syqyIMkXWyEZZ
+JLuEkxdRHCmX7YSfopR/NA0Zzv1Mmn0oAamedM5mY/7w275ij8Cz4X2v6xJ4dKhe
+aEIv9l59Qz4+apz5bxQUgk9tLt/CN4Au58r3fC5NivtfqMd/GpTV5MgOZ92EiYQQ
+JEQyWKmW2jPz4Ae34tueqoAoAMQ9sdzWVAdtt/MhkS7wMKi2J9NDsjsA7TAxx038
+EJnJ9g/O5F4CHuP5IQ98B4dlvs2gfJZtjJZvXYjlgCVyLXYXwiTGOSW5eyF0Ectl
+ch9rZGZPIHVeoLF4CQ/gi1TJM0/znx6CHKv8pViyjPe9iWDMu1R2uQ2IoV9TQCQz
+it6ZcNuN33ocFi6MpBHS9ucjmf57/507wh9TDXv9TiBJTo/EvjU4AE6xIoWEG7QV
+QRaPtpNVn0sX93fhUbvYOiZbvxQBzMgmJ43bDzOHbuEh0ONEDtYsoM8t9FgB/QQm
+JME+XYkWyOWpFYFCDFFnErUs5PKDNNGT38Jx9GdZoTK2zb8SbLPykdy/+Bz3V8JK
+R+2iG9C+GjKiBHuFxVJcWwZ43XpNMkLnpxz4T6oJF2epcfUFmgfw3PezMsdwtnQW
+ml1k1Hd3spq9+5HIRfkLHIZDObnH/cYeE402+BpQQ99QULRl9cSoHXqZKld6BM34
+NiESZEXy2BYY0YjqAsD2M3ALt/jZtTsDDYHx6wqzmVtr57fhTewezYq7Ma7CRZtl
+mAyrozFQFsgAEcrSw55ftiMMohGreQLpMVAN7AFWpuJwUd8DrGU7naTGz3dh0XmN
+90SfPIQ+lvTCi/pZLmI1A2I8SpR12XrqvzNQ+0NMhgyGP67GbkQewXP+AAtgvSiH
+0CDetA9Jw4q7Dx0fRewlbzI0/Y0B4oMbdOITqcX6L0WEbQsdBpuVdvSBVcRqwyVl
+Mhvrq8ptHRiIWz5L9n6X2aDi45J1aX/YrYz99Mmhqi9ADUzddfsIh5W6BUt8GkZ0
+ItpNgRKDb0MVuYUZWQv2cBu9PX+wJLQi9/CIaJmXLKd7r2CE+sfmXab7ycekEfOo
+btiWO5glB5IFZNIaO1dE6+1lsUY1JEjsW9i6T6UHs8WIJkoycV0RdKuxU70NlFRo
+Q3ihHl2bMPI+7T4sDBaOm4pfzmT6Xsuww7cPnbJPHeHINtGekIDiR1/QbV/hcuP5
+TENJxXJaR1qEiIK3oE95SCX38FjTSh6dFWMT1TiBY4mtZN/LAu4H0kToM1pOQfBf
+c8XEYDutklC3RdMPhTep+z6PvxijKnIiD/LLmLleILOJOynU94HK7mvT3SzZOG7v
+AjXZEuTmucJoKyTeDD+sCODfFM4J/ztUawavgnrfb7kNZGAFxhIv2jUZoWT/cS13
+lgjT3P47WUpUR8SFCwjOOBFASHaHr2P7/UcDY5ssz4STG7V/SBSBHJRWEPx6F54G
+dT7B0X7v5LsM2v1DvcIX6Hh4vcokV2YMMddosKa3/guTuD4+CydjLsPw2yYPqlDu
+MFsPWVW4/ObNkTI3OXluv18zJqk2+jhMc/X8lJpnVt4z1Pjhl/cZHBNfNfw8HssW
+Q7HF85DcZW8bIgzfTQnqBlofXevmjx2PrlNOPmE3CAFoFJ9Nii5GEdlRFlUxzCum
+UxspR8Vwaznw4Y3FoRc0LgIulSjaUdVTIY3xOMBhshHdbPcGz+MfDz44Onlzf+qF
+tdu+lyrljN07cBPVNcXQgs0ZYmsyvGjQpyDUzrK2DyDWuJwRUaa6qqwU0E6yYkcc
+mATDb0P1WvXjTa00YGzYBY5JZ0ZZ2uylEoVbUikscPBi0Cgd7sAsDQhm3R7AttP4
+cV2VVw0pczeQSgfOH9yoIZ4DBBC3fWxbqrsPkbvDpsDrxMnMEISMzI/Is5t/2tlg
+/C1pNaeIv+CWkIPTNhq7GkQIdYdTG3qrIHWcM58TZrxuoMGb75AWViLez1z+nT7f
+drPz324SmrvfzMB7AUWlMJ10kKpzMZ4UzOvoBq2yeu44+JcR1aAtuEhFfqDDGZDy
+7srxzi+mpZADTa+96CA3XfgfhGz/PfS8ohxUnZZrhC76C0DHJDB52u7rS3HOjA/O
+29aL4+9Ek79ycjSWt4WoGZy85B4xqmR+WutfldomleBqKWt2xA85Oyd5oWBgnJkC
+9zbUnpDbamW7Usn32Er7JX9PIZkN6VMQEHFL63lulscJDs3hnqRkn+2VvrOJZdO/
+Tu9qxV6Gl5GcBX7QBk5dO8qMVNTTaCoCloBFBXqlLtKsQYlnoJom8K6wFzbu3nm+
+DsHtHqOrukOL+1rqHwsGKzgSj+b2fK1630zJXfhi5p1gJ8TD4zgeHNEEE8GMSGkV
+GxqTrA55XDvWYYJWLnNrgk3m/qQjp8eQyrVnIcJLMdshhGrUe9CT/1hDy/OIQh3g
+5C7auiwsXe5+juNE86PkSlpvJmpCVGvO9sE7pIeVTdJAt2cVbwK5UflDm4dar6N2
+BjJ2f0SVM4xxMB35UmmWzN756O/SaHkUw/L7uMBHUI86DIL2Pi/ahbKBtm19Q2st
+YGlJkRAV+KessuRP+WBn4sJFwOvylYiK/iBmkDU7pxce8X8+Y1aIYBmLlqaNcFfC
+yTERd/9fhekV1RN/JhqIaL/xSqlUXZlvt/mPUGb7bwAWLWdA8S5Pog9L82+mQ3Mn
+3YHh5SYAUos/VriA8eNBmh8TzQ6hM5ZErOqqs4hxXeh4vdbpzn1P7baucznWvzQg
+onXxx2OjxMQC3gUeTZ2xe9txAQCKaceUXHu6SuwtoMYJdE2mJk6bSZX4LGrdPBIR
+rigRFqj876TXngfKU7u1FYgGcx64xwwFlUcE5EpHdDzKwRGgPa5iZ9DyDbMDHL39
+wA1udMo9f7u7bTuj5up5TlIUj6Ltk09pLGIHh1gm94xOgYDS/n6ZVO+4VVLIqkS9
+PDRUe2zHU57APcTWjPUYahGd/znoR3f9c0gR76WKlRFjrdQx0MXkPgEhgzuE8Vzz
+kqXM3mvS453UFiMYTxshk8pGBFoL9Kh5uuKHW9I89QZ87sxHeSAOfpkU5CysT94f
+q7UbvoJe1XCDl/39lCmOI3zkZT7yOudTlb9aEyrAAUhy0ZDH+uZyao11qCSVhP14
+3q8XPFvactSj+4QF3lebrByJyPJddd53kkYgBO8NGgqT//0p2V+sjuP+CbeVPCBC
+c1ZPkuojW3lA3L20mIx0KEMIJlsi0OxhfzTJqmzOGcqQBdQopJnR0s+id1HevCBk
+78v7fv9ZrYlue4+EqW48UH9r8rfutFCJhlEPSqMkJvQhxJfAlIqH1O1x7OBDwLi1
+3Qv33ELPJr+FVXCNsOyGYSxzh/fV6KW9hQfcNl1B9WYnronjWLWrQFuPGiAdZ+kp
+q4yRTq0JXl4BIxRd6I87alTYIknKHCwSN9spOD7qZAQSni9+1AmEcVEEywfDmVFz
+f7snrC8yADK4n6dRQLunSKVslvd7COeeYlFY8k+uxVUlGp6He3zbKWrk59F/ARhr
+/Fy16yM4q+ZqnVqX2pfcWVqib+7CexJvMZOnVqvQ8PJLusK4QPkEizLS+slJS9g4
+bGYYLUWxqE4dDWtmlpYyFahUJDNaNSZBYdesmxmpUp65dEK9D6/zpdU+mrHCi2x6
+ZETuOSUHlNJq+HXwzorHXJtN+/+wM1BcVDtoXyUDnEwnZZWkZU0Wm1hhjHcCumsv
+7uEoW3MkHCFqNGEJ4Y/7VU9y4WQkpwIBdd+5qYDv45LVjluOppEat6wiUplky4TG
+0nE4wAx0URkdg4q3TRh+i25R4iIu5DvSt34ygIS8VRq2Foi75KULij33GRDJr6WP
+OoHKt1xf8Q564Mj9ef5yZm5h1zEH9xosC7Zb7L0UJ0KlACZlLLLpGTk6hYYbzQtm
+Bz3hFlbWpIoE4w++RMhriueGBDr8VToCxq9bIMyNIXkla+QgCgGlbB1szsffr/2s
+yqxE/aT2d8lw2BEgPVDJEjcviRndIcyxdAX6y3haSIZaeoGQ7GXh0ZiTxH3uA3Kb
+qPmP2BG8OcRucW9Hu+zbBssH9D3VCwRGDO5xBLsT8oMYgw60oeeRjza4lc3QpuoK
+gJz+o9wA6+osk15N8uUzLoom8DeVZmoH1+NPPZHR85veKjMmpiZomgj2q9VLyeSg
+k/98rx4FqPuDYOILBebpgAtzSc41k2vq7E0TbsXv2wpqZ8MAKP/xXVYdhOSSdZpQ
+AQ8Z+JFGz01wOkduR4FV+ucbp1iIr6ucnwazEdr2e62eqVhtj08foQnfkCOKRJeN
+nd21D6d8vtYLTebXkPFND6Y5LdY0H7aXOAM0T/XvB1xUwrEUZ99sHfvZGwxKBAMF
+RQuIq5ED+bvcgBkSHqicqb/Oq/P1qV/YU5ldvJreSy9OPsOp9cGF4RV5Y6AXQQjq
+FobcYuqf7lnbOfA2t7rxJQX+RHfyeu/QIU8hax4b5T+Svspm8Y/HP1EzaPAu+nCp
+2GFlbfO8b019F8iQ37awSGD+Lmh2uSWXBwRvXgLFZX9LDadtPRTuYEacASQqoGFo
+wZVfvhtRlCiNYWT/xwLRoftOtEfIVS2JkW+EgxIq8F72xqN31TS4V92aTBVMiuMs
+KdmsLnbc7fGUx3OXwMi2oadPyhDljRQI6izDiWcBw7TvaylzJkocVdVJlbu92q3A
+MqChvVfIzZsX2NcjnoUWojWK/0dgRK0NKozJHNLiQj+T1tN4FRqZvBs9MLf5tTAZ
+LIqvo7xSZjrhlGGCpMNMsPW3PI33pISYXZHufNrcLXaU7JoT2babASybpQnzUClJ
+trqxi/eYpsfCCo4g/a7y7IztNjlCIQYw/DI22ZAQ3KJDQQX/2BLJ9lr5F8XnXKKa
+NpdbM17UgpYnA3h7APc2Czuu4eHwQRlvlOAHY3WsW16H/yS+Y3y2HJPa+ed9GjkP
+wl7V10Y8G1cudxkPo2ZO9hdPrRbzwF5wy57gF+oPU3sBSSA5MBgD5x4QRpoDbpEG
+55NLuaKQW/7czOo0mocdl3dNeaP0yu3UwvQ0wRwD0+vCgQvec7k8UOVRK4gRjNng
+fLpj8FdXhfs5pfPS9ODWMU9987pA0fiu6jmKq6ZPNGqeMIumzPV9PqUUBFrf+cJx
+QMl5jiDwRv9SIpvgLO0VL+EL4qlluJC33jqhooLl+SLH3JNWVvIjEbULK66W/PC1
+Q0UxMmO94wG6Q01+RV/rlmklYRQD/k/Ut/1LbB0nNVOlqfQmKedZz2W/4W7tXqfj
+B5uUbm9ZoPSoC5Zm9d0Q7N4qph58JI613yuBW2Kr+cL/uXaa6pbKnYdMoFvu2j/A
+jWy7Qtz+VT3p19eN5TncKHp/jSAJmJV8bLhVrLa/hf8gjystbItB3l4ggyuE2udj
+z3ElODQSogvhaYxPHIsRTsNEZFvqDZxON4IdYTmU5rwWp82A2ndJPAoAfQlZ+Ytx
+gQ4lggy0NH5wiESi7YGzPg1dOKtdacosSt4emhbKFj2QxfBTyAFJOzoMyfxgxhk0
+bWxjcDKu0dgVXl74Az4zpC1VCnt8jM7hzAMgaIXcBQTnCQa2Pzi7zeSKCjHnzS06
+YLOooSJBb36fADYyTQj3hugKhP394JQTFVPxsvIibrun+BTPZgNBhQZQiNon/HtA
+/nmaGEOV7ymyuLmysX+D2Arazo2F3J2cXQCalNfRQa094IGwwtELhaPi+k4yGhM0
+nA10e227FE8pOA3M8iHMLTdDCLtlZ0TCsd9yPW7LVw+t+wZVGvog2pJCcJwDUBLM
+g0W9rP3NVSbAc918t2Mvp5oNP+0H0COwWZGF4NUWn5Lw8IIDeeLxYch+KLjuSMYk
+49Orcd1n5vOwDH8MfagpX0mhZ3189X/AzyH4QF6BnjAulD6telm0rbtrJmV1Fhh0
+fjDCEh9TeFTitP9p2UXP3NGh0Kvp7v/BTnCJUSVGWYROW0jH/LmLROkBuzl1oEe8
+f3ym+pdxNfquM1fhzT1CR2XQ9EphJIdFMqFoytk+u0FT94Uki8hI6t3wYvpR2mG2
+lh60089sMPUMh+S7TsgHXd7pfe7N8rjlb8vXEfMNrj+ETAsvqWhvEY01FIEO7a/P
+mA61LcFPCyf9QyLPJCc0oWRBgWu9BGMsdU2duejOTt5Z8s5pATKJlMTMzMR3aSx2
+TKTIJk7IETu0CtOojLsqBKEz8OB1R3c7NStwApmz/EcepHuAmjrSdP7ce2npAZEI
+1sFuzphGB+8tz8IJVpdOJYuXuBiptMFhs0x6K99EplT64MRRhPt3nVdZRd1xkG6o
+pJ++7i5zBvqMYf4IFj1ROAWsPebLudfQNh50hbM2l3u7/4i36zxGAtSlC5EAOKKg
+TyM30ZFGRH4rhRzjbYpk0bTZez5OJh3sNs/YeY22+9sst5IyAOGPPzBDFR43zbzS
+mRFBP8gInQgEc5AS2qKknJHwK5xIEny1eyORFcyLE73ZDHiAhxgCRywcF9B54Kvm
+PUjI9VhHF5A8HwxDsObpHemXPdtJPgt2qS3ucfZjmSzPznn+4Mm6VGkeHBB/17eJ
+cUsSTIxfdXjS1fzaQYOlFax9JvoWlyKct3Dc8knV7ibgaapkSoCdmwT6zYUGUCnz
+7SQXCFgNoFJ6Yj1hNOarQT5lSSO1oReV56ezF/UtzDeWa1q6+a8NRwTnFvs4c+L/
+2JgTqLiFk2Bb88IpOmthJVLG4JCmjzNPxErj3Paw2btowLYmO1gvycIE4rarkdln
+lyRiHAaAi80WUfRb0hQYCZ4TafDwayNZ+jdX6FCqKoKa1db8hn5DBdSYI/cUYwH9
+I/nbz4RoGX0rrRZcKo2kc2NU8gpG2lpvUE9VNAddLkXQj2QQWAWYNOaqGbqgxqsg
+rXYms+qm/aLPz9KEnGLiZQyTQgbiton7kpmz4NyVRWaXXMQsnDCT+uoP5qB6GCKy
+R+a1tgDtHqmSZerYBpMRdXNZ28ms8BH8o9dt8ak8n5KkyPBPWdzJWSoPvVYXJG8E
+sfVnMCBj2hUnuSjZxHHogJc2r371KarLmT59qGbBDbS+BgAj0uBbEUE5sRbtK2Gf
+WGbHvwan0slW+y/EAnljnE5GehXJyirwfeEuu9/yLXIyWcmis28XJiX2tA16t5xk
+FDseXDrkJnx2w3nFKSlBBF/nSsAr03hjqkWvlNMCqD55Gbirhzf13n63jNU66Sxl
+uv+Wiqp2gL2iQzYCQ8+WIRNApJjbShdGFz35ABFhMPx2tTh9ZGnEKo5RyEZJ8gHb
+IAQkiVHpoJhrlXVisZywJVCIq5YVu2/gZNghrFceErW1n4SQ1rieNAP2YZEZfYa5
+n0ESXS87pc6F+zsemLzPmsGm7oecHNAOf9eRLfEy0aLBmE+Xsbe9RMN+95GMzE/O
+Y7jveBwFrescFRxTNVcwJZK3vEsQHyQle0hUJ0cd0SjMd+eO3+jcN9SutBkGwAsn
+MHkxzwINlrKrdcI8lQdXuD2IKxZrzUR1DnLXoZkH78D/XtD5K+Jqp97/YFNuQSJO
+mEf9AWIVqMiq6fjChah1bb/09eJ39NucFBF6lsU1ffx33KJg0U2xEctW4HdIVuRW
+ol+eIIhBfSnA4swSFkRzMfmDveQ4aiqjRrzLDJGAXV2YnKV/r8GnOLa9wNo4Dq+7
+YALtWjKz5U6hd/B57g0QBLOuk4naPlQsyvGdY6vhWIbcUpPP+zOozEuxoejkwZep
+SttlTjGAaTjSiNSuIq/i+lyzeus3eeYzdEs4hK5eHOq7OUuG1EB5326A0j/fVG68
+qzKpOUZi2YU2EqLdGI/9GnkDNtYvcfzngvueek9J+LiPhXWWckRRYC4nQsgOiJ7g
+K+PmOab6e5PhYgt6Y9BaTSrFpcwr1hRmOBGCQJ914hYjRv4aB+QLz+0KFi6BPNAV
+orW14QNF2X1WGXEom637e6cHVGw/7CvXsZ2jioZwlIuk8OZO/jkiET7AL4dWvlBW
+TCVFVBPzWIG3UwH9sgjURdN0RtfrYplR37N/v9k4fNIV/96RmYm5F1pxSBVrK2QB
+jgLXFX5D3+9P6QB+Z5bYEgk0XXAkELTn9wsDgB+QKK6oiPm72qREdQ9qkMITdXz9
+3wgbnyRbAkejyeHszbgEwDOe8a8WmXVEKkpod/8izVmJ6eslYfhdcFTv6vovaNcT
+eYqb5dSZMHUqNJO7taiBblNMk859OPagmskp1nGHCvnmBNELR0WdseaiySO3HUmC
+fXT9A4jq4fL3kyc9tBPq2IXgU18Aq+eGGD6ngOywKDKvlfDWCcSuutgkkt/p6M3u
+2JOMQuzh1mgszSNt6lZze/5dkoKFtC16as6OGGswIIkqapyDMhfySrZbYkAZ67fv
+trCl8bTATD9IA02svjkncXBVPL7+Sxe5TxjrDTzT7I+5GDY3xKGg2BQuTfDr+Adx
+F60wquzFWn6fCDCUYC23GPCsj74PE3D8ReUIKiBsjAfF8NOu1DxN+MwX8+4bvO0A
+ZyFWf8poqi5y5FIErC4WbWKZQJuyCQcJI6YFa5MEsfX1ChZBCpNOCAjl4IeT7n1M
+yjdp/Fc+XsLKM3UO7IuMdcnfwKJFctz8AINeVB7AcBBWvLSxw2SMEKT6LRFB5yJ9
+17zPkbCklIDq09F81mc6TC5tetg8tZbPtfdzuF/T4L8IttJDO3t9Sbt96GbnrYL0
+JkieSzJbJx5+uZu/hdO+Rh7X0yJj5b3Mr+3ZKaF8FHygbDCVKu7UhW4+5zNX97rF
+TgIQ7XADottTjBpWy9jryYPoE08iP7/E8CN8xfn+oWwGSnkwy9OImrxGD1us64sx
+sm3qiUTeZfufEJoZ2jVpibsHbeerIWE/VaEmzqsFilmyUcxceVETaNU08w+nSzcY
+6ze7k9mT83W5nbwR5JW3fpOcftw6cgdQJvYtGZl/PDmI0NYd9WJGGBfcxIiJi7kb
+vGlBXWIgCTlgfr0PeDLuwmtikn20uBiuvDekhKWFLlBgTkB5Nsa+Gu4hBKfuMiYw
+GpZkGWaRieEn+s0UsUZhE/R8Dkr8Zj/kJsEEks+oCHpQFdLlAqLNIk4dfY7NLjsY
+Cs3ya56oiCXokiIvXwfiXXXv01AZf0wymBn9eA6IclCll1bdElVlHRlOPoTRqokG
++h9fz+8ThtcjAAUvPYhXO/eZzzTE3QYfIJ599wb7XCrum88soy2E32qfUKEaH1k9
+8xs9gsuBtFCFXrUhhzRE1owwU5IqelhcZ/N77MKI/V93kFTr0alSFge35Mqq/fkq
+0wR2uRPwg10Z231DOlNiPnYaR+/ESQnw3gj6gL1DMfQya2DegZB4hTJUBGWQPams
+e8vCoaPdkfnXClIyAxOn0TOxh2RCxQqmcPskRbwjuCCxQj4oB0S1j3yxYzRvSBkd
+FPi87fy3NZnd1cEnu0OrJJuHqipCkTL8qJCOr2cKikn1HadaWUkPgjz+nmstErUI
+gNYWo3mLO52mPXRHxvvaY7UwtFCOZQLYyh1jOqyaZedhxS0UPSE488qUHFrdG9tJ
+BFHOHHs+a6s2QzmBcE3Lf6ljluRAs9riG5ul+y77z1TwYuigYyGe2fDrcL7AW/gs
+UzXh/ESSY2CDV56j2pzd/Z+bHyIeJLCL7f7mqFZ5z/u+gCM03s9PiPYFlTsx9Q/F
+HEgouKSwrUlZ0F4bWrzcOHWWateWWIvGMytc+/Vgni236kFcldCiv4HYU9f0+TgN
+w3/U4I4TEK0D+wQ5DZ5pVK+bgJuUqBUK4wA2mZPQoWhgCo9l9sUNxiyIiv8sXmrh
+vej5my6emCYLZvxBuAbTq5H8zqJpj2MUqfbWGPK5WVkkNMgLbXSH4ufyW58KHUJD
+znTUlxLwgvwXsLxmAbD11sjLO4SMxFQPq2w0wrNyIB0nKtYZnUMduYO/TTwMac56
+DgAQMjUcJcX0+uzwmBNc3TCXm3Hs8Kf+wUJmi2jRCVvFYKg5TJMGDOHY5UbjhX45
+s1tdEyJm9r1bKYDZhKaLuip7Ojd/3WnfUtBowUJaytGZu8m9r/0Ok0z5eG/Qhcgx
+YMs75+TbW76RDe7IIX9gubRkgGCCpFVg91YdgFTtTrEN2HnhTpHSUl9XYAxlcthY
++FHmZnNzAh/jMu2PVsCumfC6gjHFBb7DXvS/O2wevvbOU/6/gLgU6i2PNQL1Yhuc
+P/6QJqRFarCS4ipWFYfi++DErREDmz71o/3DzuTp3AUHmagvIHAbMElJ9Chtedsp
+RROLqvTnzvx4EXMLyYm+w4xpd/7vnwNK14TK5ZlXHHB8z0y6uj0665BdD2tCvQTc
+OR71iRJvpCspFYDtaAEm7krpidBUNowGIOJZP7X+YwxrafxQy2y5hmj1Q/psmTo1
+TNbzubz+w11MsyRA+4rw0hj3WNkem+hvmF3DoSg21nknib3ONmqcekv67VmQ+GN0
+q73sr8ROjlpWmVhegqKMotW5YuExSLEOZsXJFrTPeMJtAWDlqii0aLcp/bnVPLmW
+dTOD912Dv3L/+vAXnq1zdSAGJc9d5K3AtPHBf0MCWBGaVsWf33vsttWPfrTlk5P+
+ow/7dNm3cdeu5aB5xfIdPn+7h3wVwkSOB6PioC/NvvhL7CptZI5AUicI610CM6vO
+oNiJZDovaMHBgv6sI6FHkLnSE61wMvyG5e3YX0ytA2sr1rMSXcfX5NqRIJPGxSml
+f8efP0jYflXo2qwbBiT4wuqcbMwY3n58nHhT5ZxEYYCBwHxQMNTYYEH1XzCT2SB1
+gBvCwcvNTe+dxl+lUhtQAyknBsu/V96wmB50Ac5+AfJt57IvoUsT/1cV4zBqeQPK
+P/SB4bMj4lvouIHm3cfef/Q/p0YZX/tItVhMQDSLELMGTl31W9H8wf8AbVePXEyT
+wVIVrcpa9jS3gwT3irwqgRFbW1al18A7kuytYhw6yMTYHbAFXzBMEsqMhCqnXPgN
+7djhjDHf/c37KPqV5xrd8y1L2Tb78cGYkCq/mhkITWQeQkkhZi4K0lbHwJUTRDcD
+wwh2pDkPr4z06gMVLwTKmsyaHTETZuPJSilK9adaioRlYAsPn2jFCogM0fP1yCVo
+rIsvMtc98y2neIz60qHO1iahdvFz9AV0aYh9Ts2nEKvMFqf28WueAOSU8tOAc5ZA
+7eWLguwiDMqS7iOEtD5RNT0pGyRHxxNlyfRwLDi3fY6uNaZ0gIidfw1DpsyID4A+
+HPss/Px0GVhu5ekdhY/ZnadbSxcAfIwuo2w7Cu3kQ2tJzDuRBELJz7GEkJBEX71L
+7PvQ5pxRzAtZzIm1ibQv9PxMV/lFlyWvAI3WfuvpbwZihVbCDz0mXw0iu9t9O1y/
+/WP6p7w77WvES2251+yagACvuL8zPoEXfPpHxGwCC+d8c8nsie+CiYjKT+C/slnV
+bm8AU+rKEQyx8mBr3WHoxNja3gK1dvUz99GPGxKKa0iOFSjDsMicaKC44GuJ3Qtu
+UxUQqE9cVxHs3meHs/+Od2uq4kOReUOR75yD25H9EdwsBkHAaO8hMmD0KzCSmZPt
+7stfkfZaEIaw+jBGb+i1felf7xRm6CP01rLTeeDYPztoyPWOzAFb5ftUhPgDGJoX
+bP1XVPTY9NS5rmosOVSm7i6bTdB130wt3YAPF+UM50tL7N68TVzK8CrilvQud+QT
+RjA3mRpSEuWlLbTFuYyQ+4ed7oNyCleo+cA4X3aLVl2bn+nRaz94R+rMzTDR85d2
+n0pBSZmDmi6Rq9DE661OZV0IUbMsUL4f0mj+l1VrwlYuL3DtMSLooTBpXDHNVncr
+8j06Emt1cX8RzGh6rvsn9UP8hBQc7H5RxZawlEcbgMAEtUJbaRBZmxzqVzSd1w5l
+e06DKrEl5ikvjooRveOeZ+nGrH+gBwiMeL+TCnqDyZbkd4g8pmI+RIcLbrCFoUuO
+uYrloswIFmVrP71UjyY1n3S5CZlzp38p0mfXWkqt+lNc8WJQeQGGcy1OVhTtmqcd
+6plnGt7orNxiT2+9bw/3jSZOeMFYx3/hNcjOouVSbPe43Fb/4DPLzs3ugTCuIAFL
+B2XVKFPSrU2YNgtJAKRQPnR+GPVOR4eyE5V+0AAz9THU6zVWkI1+thBXliwF+d+K
+o6l9wfGQH81xwMvdpOvVU+GVOBr6cAo51/CRYhNxGFzoRByTf6DRHgWbD8RsYj1e
+16QFwGefH5mDn/wBFw0O9907AbvYT+etYQK52gX4UkcLiFtSO2cipqOMRukwkpIp
+cSHh7QdzWUgJXkaQFP1cYuiFw4AfiKRl5E+OOkqVkLOZndxP5kgoWYHLOKfgdt6g
+nPt7Wy0GzEesr8jzI9LNc+b1pj/w9rHbSLake6z3RGKDKYOKmZQfOu9cU5AkxgFC
+XNPUS7gQRHOm7mGA/eNdWGJQnXABxrkrg3gbXd/zxtRIsTZ5z03U27aFoRO9//RL
+8dOjITL9N4ZZvEqF24Zlu04NehAEkLnWnGhzDD7ntPw0QjuGp/8l0pvyNjvu+VOC
+HpbPiRgeIzJ2aSXIgRn/IIFmA0bZwPsztQH2JLndPEKjUgH+kiQG83hV5DyhyXJD
+iP/pThEaHFs/SFx4FYwbC1vW7YACBUs2ROr6FFtwJ6VNpZluM9MjLYt0iK+/bIl2
+Y+PJevVCv3MZuEkTxBnPudBUNubknghOsddROZLjupU27HxGQFvYVuBmmQqIx0gw
+1ejmXo1YVXLpQjekr+aEznt/iFdcw/aRis1l+/Zy61ksyogjewAFyl4KqfCBkEIN
+x4v9t92e8m8ZpjoPrGsPAwrcDDlcsym+8uHNIv1bNjOeZh8zhLyEIr9Eti8SmY+L
+hGtldQdBaRarhd/ZBAzkMAaf/KdRW/1jXOiyMv72RvFplHV9wkKpAkUaTQyEdbfI
+Vfe9ggM1BPOJWDxZedHQjLUQyBWQ305UfYbhGavFj4s/GNQ6TMxmLn4+v6o/37+C
+GbOtMG1uudnxEnurcTnVTwgI9S7VRbf/thqPxRO+BaAIlSrQFFVgCJm8HeFtwStr
+9J4hCFUvKJKHj/ZiSSscfC3Nfi7RnMuhwTR/Rw72Hn6m4omUrI5aS9XULY8kohgK
+uXnuY25g4FuU6TELpCeCMTfCmccxYwmdrpcG5DSC25tE0pfBwI/8cOEOhw0vto4r
+fUUOhoof8hi/2LAbgVHMmgYdd2j+K7i/NVsSIYNAYZZGs3qkm95PFeEVotaFcIci
+xrqmnfwJz7o3+vI4dDQ9IoVePsizinvbpEzD22/nEOwvYxh/lswvRiCsBvlz+IgB
+7rnBLkzlOcIYOzCbAqgOaIcvkYFJu8hk6k8MmpJ4gCuTqZqcfV6fmx+9RO17nktH
+CvxwY81SPJlvTS8Z80PFnxSia0Q3FJjECiT5EDPFFb1XtWIaiLpWOabvk5boCoM8
+zcwjiAm1oMSLksYPMEnWz5m+EA2stzrtcORU57EOrj+l6NWHbszUPvyB4tbSd6QA
+HgjmHyg83xx77AaP51pN8YAimKSXe5WhaL5pAN5Nybq1dRO93+GDyTgKYvTUJuMQ
+BQOe/EH3TBjpMS0Fmf74LuMFybm72iQZkoNcRL3yH6T9mjCkY7cIbaIh7nrpttSj
+HKaS9vxMk8KlGao55P8/9ETJYUKVByYdZlyFt9hD6bhtvGzUhP49k5GqvScx6/uD
+vcZsuGiPzrg82PS46AVQIUI3cfqwJvlY989bkmp2j4oDZukA9Fav+pi+2OZWFgN9
+mSHWKEFK4HpkRExtf1vhNijgeDJKQNmgDtBOKNWUXPVrnH/oOJXrGEy+Me0cqMmi
+vI+gTHxsmLoZtcJiyhBsDp6dg26foMx+svhZ45KB/sjDrF1e8MS+46RMZDHjJ0Ut
+g4MqerN7+ZpE3CcQToFu17cAQIALoZJFkQx1ONyJgfXJtl6LeFd9mAV+R1Ky4f/2
+yV0sOVl+MnOVO4sDLuwhrPfHON2wWHkI8nwf+R4wWKNr+baOaCYbvw9BXVCcnSTR
+P6EqH6FT9S6AkN6pvq/BM54Uyoh4SBXa6pftA049IfPpSYdrquVg1hlBh9+gL25Q
+xCR7bLt149YGHx1zIeUv6uxml7MOLWyw4qm+wxAkQgTNjIxl8hhVNFEXT4haaCMU
+lzWF3PfxdoU4PDhlcs0Cw5XFbPiQrRsKZHiGrzhOU3q2OPl9M2MlrbBoJPBwBxa1
+czXjXBlr+VuhnSs4omQuetATt8xjUNu3ZYLVxf8eXG745soWJXrYQMOtGfW8rFzX
+rnyzvYJqGMTrgfj/ygZ01nQns0tOyGMwLi1fPhNZPm+M9+bcC/QUcgT1qVOGngiO
+jllec7TEYVeTjah7PNi8tPl5BFJrnGs5af/T2tp6DDDvHyaVkUHZgc3e8lLVTQhQ
+miBauTY8h0vw13/5IgbZ1yauXCStvmaRdg7AgeMJQC9keTfcyMIQ6HlFhiYHHKQO
+fnQNtgbBuTuFzKfkkfKRYAmKMWOjk5bTuVYfc86+2uC7n/GVZ5/YP+K3URv9GCcV
+JBSkKW2C6NZABkVjbDbRRbQpsDewFaVdUhL0IN3CrGbuvz4yrlP9Jz0GUFB6PjXM
+VrnMdsvMBN0bpRbW/3MPRrLy57wZO2/MZ7KlN/RXZOYY+cOTQuEvKRHT3X1Own8J
+hoS1+lp9UKcF5375jidQ6hskEGIK3XvcEl0QhvpRrQUfjfu2OwR8rESDdHaSz7Pl
+ioRPyuZEFAGdqft/n3+lMfuxKGZFdFhAB/b6mIhxli4YoLe/tKBO8lYSHNtaZ4xR
+uu8ANa33rYj6OrXrJfciu4wjWSmsGxnT5fpcDe7t9qhca9jsMXIiDIY37Ovx0JQv
+QaXhRPTUtIAAFmz1Gqg1tK3Cu4C+lPN7vXvY+fSc0Wby6gPLekgDHiXTP0KY+fnt
+1t7aE+5jsnOvbrri0B7yj1fnmeki8O1gbSiJwpWg5ioaSG94bLgnH1Ij503GJgqm
+SpXDV0y48xmBNJhTtFg+11o7cGaiTxB6k0168geHMDr8m0wy+HbHLHIol6n7MC6B
+jznBmbrToMtYv8YzdkV3/VrD1FpdMfM+Qllxn6b29XJm4rO6e1eAROoImJVqMzjx
+ZpNrl9MsIgjNgzgOirApVlJyFnckgIxMeHBejIVbqqysb0okOPPr+/Ua+bLeCHGj
+VcFNpAy9HaDVgyH7xUwydLVp37cjfIxJCFABMqNVS7hes3Isb0YQ4fauAhH3S2C3
+LZaXkRS/CZdPA30+5G66RsH/ckws9+37QpdOqFs2fIjzw7tBjEzJDHH79mrTdNJC
+4UxAcRrHBC7rj1gpwwMy/K+4BlFfMY2AQ/VW5IZ00361ul/X/bdqgHOx4pKc8zb5
+tFnatXSEZS+DsJtaiF0bOjBUckCKIMLvSvigvCdXt8V/HS2RHTHuso6uSmhaLuGB
+MKL2pUnIZHbfiSOspdUKtxQ2QAeicLwgjNdvncKg+wlBwfja2E5sa4kXbDS4e86u
+aF2on0dFobDa57LAOTZJc3rfEZoX7smxlgqpsB0FTVuumo+yGLLe+lmO5vFhWkLh
+p/ulWOnLFaD2Vy8+cB4h5Vja4YE4/EXaBPQxNESk1quExO/vO057HaofEuYmFcwL
+oplt3QfRpvsscUvHF57lsUALFYnEZT+RJ06zCdPKeAtdK2Ql3ZMQ/g+H6gTYxWlk
+j96YhRutVIgPOfZHutnCtSmmvRZE4zVdrlUgAkc2vb9L1sPp3YslhuQ0psXr2tVu
+KfpodH259iK2NL+RvIHHJ8cN7+oe/6bNu5BN3b8TF0ZhFioB51DUjPj7IPyllfMM
+Ouv9XItHhinP4ELw0mgg7USI6C/3Uj8sAlxuxZS4IyYfOF2DfRqzCUznL2hzryd1
+Ju5sXEvHSL8fEGZkiHpnB8A7iU/eVLGGuXhD6b5eBgq2QwWmklZbm/8U+Ab2qyZu
+QSN94mhqiLl4GO1LmORd6YTCB0juH9QkoWHUDZRAluVRzji21O9Cd2oPs8Lap5wc
+4ewR+BGFuV5YCTZq0eDw1WX3Wx6RWeg4FYAbwJDHXC3JRK/Xq85S9ayQtkxUrrVA
+Hvbqb/ke6bxocQ9qsbWBs1YIwu7XEjj+IRru34G7AaQof/bOSyzlu7uIoUcO0OC1
+h+6zRU71U1et2maZ1SzOPfrrRKs4KR96ozN/LHrDNAFPzXWAqqL4KHDzMJYW5A6m
+1uoOaXI89s1zEfmeHMqcwGfXDgYu7mRrQOPWRBcUn0DbVq+D/Tsmv1vCgRZzKhmu
+xago4O8Qp2hfb4HlisKSp6hE/aUlzYGgeJclmwk0Z3nSA0IFB84V4sAs8YfnstfP
+3Q4g//1HK5KabOGA+cNeMmdRLRd4gtwNBJ9FPq3JdOAnME6bBThNVvGJvWDRl6+v
+Qt9BlEtmnncnsAtAchLPcy/akPrCPpW917bPi4enIic8X9UzywscuFxtXggemUNb
+jNm640djcWrrlxz9WTNvopFq2rQMeRvZ+KDnnml8SpVtvncO6EcjWw4mTcMvYzxV
+UdTx1TZMXF84AUGiSvUdJaYuOnrw4ABNAp+8vYwtA6tPVq/5u27EZC5flJYXSEha
+Tr2YpN/jAoTRIeCmF9zu12zUrYRvlVHihtL6VQGJJ05Ro3MTi2qA+LXC9D4FQ2C+
+lh9+JO6j3G2zHIxA9aUXI5WcXLF/BOd1b8scu/A+HqHGnsJQu0p2xvEfOH7GkB+j
+YgCu6c4M9lL3z+RbRePmQ02SFymmJUfGPMiSnXgMMGMff2TCNCYdclHJNKCO09Ye
+XjO1yxu0yXHXXG/4rzErZqf6Q8p/lRyK/UIcaY5YPZTmyZKV32+Y9+NcXXYl7iDx
+oqs6IXiQqzjCy8KwpJOa4ibQm7NKWaqUuKVPhOof+H2Fnm8mNGRSqPNl1ZpbvF3c
+FQrNDw8DGV41wtFsBZHXa5j+60ip2hwThJPBqVNQf1FIBgUzfvFzjAOgCfqUW3DE
+j0blVTDB/F/U0TjxKCC8fgdjwgUdI8fPWtkGnBfYTE8dhrlv2A6LiR8TSFgb+aET
+xElwyN6S49v7cwWb3TtzuGzhlc8tv/jEVTsshV7gSFDXp3BnZUFGmlGkWBZqligW
+nsSlysP55Scovbo/9aK9n7jrrN9UINEo0+ePAj25L6E6yBu8yuI4MKUKihSUM67N
+A27LQRGIJtC4sJgZy4hpbwdsuijdL9QPnCKXdBiYjv4XpnFJo6laSohsYB6dMPs+
+Lshc6Q/SjYVHyJPeSjt56H8Lf/tRC9jyg4teGjwdOOMEl4/PMRA00M8NReZ7o6f5
+lkxSCkQ7wTUhnC6SDwPa0CeWkL5UyrxyvLd5SlO6bDlNNSUGrrNj7zBb+Enx3tQ3
+dyaaQomJ4WIiitT6D80Pe/UdyMakIBg7vHHzgKj6OyY7Z6PIcMhdCbi658WaPhNJ
+22glP0kgp4JcshrjN8ouJhn8W3MrYs0SGAgcI8V5QaM6Rwlbv56sRbfN/aEYpT7h
+8OQnWfYa4fyqAvQ+yuGxw8jnTtpuQ81dymdJ3ZLpmQ7DeGYrzEHrZsHM1gk4YxzF
+4HoJ4wpEbNNdLFL/OaoliQGXtuIsyFeUV8XNi9GR1cRwNo5LhmHzR7FE4fM/0712
+b65YKxqZmf/4jzF5389tQPoWJpHIef1U2tRNJuIm7g1Ql75FAli7QPrgMtkBDHfk
+gO9uCUWdHme27KTzWZwpy9GZafRS20bW08dJl6cQdCJ9G+hsDqke9o8uWT7bgPah
+zZrV+ZFNQ+lVISVF5hkHDRtuKDMu9rBI2C5fQL86b/Vl7IWoX+IfcFufULOMi+EM
+zU1iVOnMIblMzlRisdGhuVTU7pLLJUX3e3bhhKx6z+rng3nqa1FXJpxt2wn9JbwF
+qaS1QuuQeMD+q/Cy7ZUwUs03OOH1vu/BwChLoMr5Yefr+gh3xE6ajsp09ZBKK/Fv
+kcm+I6jVtyh6QFMampW0/yGBYeSCnI2qOUQOCk5MxbHyv1i2SgZgzMNjbwNuB4Bg
+smmoMsBTzlD7df5+Y08RUTEYJS5H83ZuI6A42qiJAH5YjKE3IdDbaJwAFuDzDiOL
+jIBluDGu6lBnS+TuLAJw9sPjD5KfvA7vFQeE0H7kr796eyeEN1NlNEul4XrGnllv
+jqiQ4F8XBLT3aRx8HAudY7lLWQWS2meh31u3UdVhabE2HNPummbV2viAKkUvC/VY
+J09C6WIQ4B1U10zQ7uq5PA220otv4yAcphkf1xmUXASqwr+Dwc6PglT+8shZWcwA
+F3mbsoMQeHJJlue2OYIw9+ysYXLVJ2PX5T6u8jU94Wu4+7TYfVUVbT0XdFsKcKJB
+9oVCCh3ayWurF/nEmQdHbqz8/RNa0mff/cFbtPW85p+Zk6IfJasSf8+rXzJo66X5
+pVwRmBGII+YZ1r70rAdFQj9CYhdXbQs6qWvUbQCfK6+t545llQX0s3p9dLh2/Cx+
+r2VsDIO4Ki9V+sg7tqlyPwNECMoIglK4ajDjGmWhKxDBbhip4EAMshAvfKEzlTup
+6ZfJ7b9Y95kf0NBO3tjG45wAU49/Fn/JEwaZtKFSrsFpSdw5KJIZnI4CRVbwudlb
+J0IviBuqXhAkB2zTjk8czClHm2xq6uhmoO55JkVdeD+/dToHSfXfw2Rr9s6h1XqF
+HxHcIIaYyuXffU83ehF2p5zay9WqwrnbxKn2+66hDOdxGf9NXDDMoyRpqlIGYLDy
+QaT/QQvrXwrd+4UdYdu6xzYlnlugJywirywGQNlkyTTFp17d9Ym+xgHPcLRzamio
+OFpsR8oogl9zE6rfl+DEO+Gz7XmAZH4h+sLPoJfx+qXEFlPBDERfk09V9tQMKuD3
+rlz++Cd2U+22pjOH1LoebpcixIc9ay5L90eWVgqD0Q5aPyl7iKjzkywLCoDi4bxw
+yo2jJUVUs09u05rk+Dr0kC5R5l6B8Ifcn5/9kslX8WFdQrRuEJEXa9iftRiFZhbx
+yBiE1mTSwZZTlhsM5TvqzG76Zi+1wZ14eSXSBIG+lpBiXnuAc1tdrvHtHKWltzjd
+zXoWEq6pnUyhCj5MxbpQeVIN/xXqF+6lpI1ysvoAJ8GhGMrHLyV3eqlQdXtiZVDd
+/Hxc0K0gZ5E605tu9JBJPZusWUH0rq+eUDGvakp+Mgef/xNDYhjUI37O11v0hh2B
+c/7PJAcpfbY2T4yJa962Kp7w1OJbqVM+LZ4ig/UIKBGtpYizOkoBTQZOgMBzuQAV
+rLU4/u2ckf2DJduRxCbl7U/3wBlCTFbBoat5cC3kpemCJp4J6X8j5X9EuH4t1UyU
+vF5OUszDv7P1pkb/L+xTRdlez5OaEvQKswZVI5aex9q7tMZQafnfY+HCyGXaTxKi
+jFvA5uptpFeUmQ14aEMgrlCxjoR+gUUbTsGosAIHyq7XBCOAZGHIONPMZeA4s6LI
+06/UieADPbDQ0nyce14iZbju80rzdOUCqig9QBmwz6H3py/TpgCPNU3lB8TmGqEa
+sRBGYtnzTZgBgqtOuh01gcbKzOJy2KBeqPuav7NdQ7iQnTl+uJ2dT8yYRC0NmiQA
+tLVWQXCFuMZmxIZoVi+zeqN+bgdOnK52gIHQ7Yynw3E+x4KdVK68r5E8w1jH6P7R
+t9q3WBrhDIchHZV0ZOMCauq4D/gt/QArhsi49+nOss6/Qq0o8VYy0mkx1OVuu9HY
+Nlowy0tvF2YHvjhxTo8d6fupu7jH/R2a41dsr5+/Q7f8MFJMBYxi9YiBE8QZtNMy
+aQiPPehvSPNZufsLRhmm4PyRHRmQt8Iu8qzmRpDY5Rl3mw3O7btc5eJmIeV2kTZI
+aLmjqk7Z3hCysidYBq8d6bs+jZpJr/bVwSWOzpEQEDzvOT0bkwoiO0I4yFv2Eq+O
+9lR3ZtDsM12iPenGgBv21AgJzaOlKRPu6B9K9Zdl1P5zIyoNlyZbKSc3K3Giz+RM
+5JzgPpGgxOgJXU2wGOizy3+SHyT8arasPfd1Pm2MjzVr8C9EfSpimyWnGmXJLGHY
+cfs8eoezyDPUMsbMdgD2TxG1CZlbvsehgZ+ZS5rd6bFDiGTSGwqstH2oFYmutk7j
+YdcUPvgTTN3W7WSRwrdn4Wx3ttTluQKWp/xo0LHN+43ZEg6P4sn/Mr/P67rKFx6c
+koBT7j2SlnKxsSHebWPE/1IhCn0P2NZRr0j8Lix0QXN5imPJW0qIc5/fQWLGOi3Y
+nv+2gtwVhmO6e1ZXmraqf++RUNDS5mE51jQPN/1hzBNBCuehiV8G1cOtM9BdavmJ
+mt1VmevyQ1FHruEHNsg805vU8a7qGDpQeTmzNwvmuiYq2muhgBt+6r1JMrVztYZs
+nVNSrzCc2fEUPE4UcBX87Q+XvdbCtaGSxdHRpb9ry6qEXLEMBilS8ShmvhNX4MXO
+XDD75MkY7F178TIWhFQ5KPMR6zm3p3EPsBdioNGKGxjOQKkzbbqJPgeGEB8AsBbs
+8VCulxLMUsjndUfGH3baDrBqvMBMDj2+O+Np1NbyZjys/KxeUrDFDQbfj0onPxhi
+S7CXgYLyAjLwkP5Z52CtZ4WT/bFIwg6KOaHU6aqup6R9wswX5RMJEN/cTNlVmcfU
+hQEuqem+Nfv8ZO3AWkNYTYSSVip88Hrssu7WaynGhzGhghjSoPPtmSct3pGc0QMv
+GLB3el4GYG+cIWeeKRge9BK6Vop+gvGoLZuMWh+HCK/Ky/dEl0JUxFDjZDVJ962V
+iIRHcxOW1FENL89TQy17gv1RcBc1aa+B2tRdA2lAWfx26fdSLj3BRk7LCORZD637
+6ss6UEZFx5SDVbpA4d0ibZqYahd5wKzt35lrgERm7FmM8BV7OCkeTo12823XtPyY
+6xpRj+iE7aekgs/oFj6Z3DqQ29N8mfOpyn9UfQdGz81G4AFSbHBom+OLchQDxy8e
+oI7f1TAlc0aiSwxEw3afvFK4PJ1yT71oXUqmPEyPLiSTD254C5E/VA4wESnXASx/
+8nvmOsn6X8yWJrxdnmkdGz74/5gO8XdJArGlrrV2gg+Yv1BzRFFXU3K88Xq1mzZC
+lh5hjYpri7y0lAG9kE9ROymd5P6E04rwH9G+ysP28fCvXyWTdX4dW5T/u/9GqqDY
+pbcHHniN5TRp53x5oz945/ZjFTkpIz4pyQFcZQqr2rD3UsT30anHJK4MEzXUXkDw
+GmBL3gTh88Sn3vLP83hXSUKmgjwJMlJ1Lvwh9N897n3gK9NtQsYRffY6rL6o7JmY
+kbkFkJ4V/QK4zk3hY2rwX0c1Hgx53/DKOuzwGsmmIpkUa2aWEyNWwQbrWMpidkGk
+33FrYhbdEi7617Mp7DQJ0xwp2CHrsLivll+lHM7w4WVZWPXRQ9kFZdpw2vDqaPTO
+AxvZ6jMv2TaGxrczGnrkkf7nfYGrmJOYcEXD4pXnOC8cQ5hJvgul9T1H3wR/xpZI
+4vqtkCSBajH/QZXF1hK8DJwofxTUOTkdimEqVWEEcRIV7AEuVIZ5q9RIyz3y5Giq
+qefQXnTpSeYVv7J2nurjz4L0cYVZp/eMp7A8AsOtN4AgG6U8v7l02usQnvd9fyki
+gcsog0keZr6u2Gw+JEnsm3coFSfV1qEUlDLbyIWkI6ffMNCLvWUbB/W2iQH0Xidq
+6PThVaiyOx85jGltmeDp7qVunbc3IT292u5tLiWPApo6aHkXmwRQc39bN44U/bwq
+3vm/HM9SVnnHIpVP9G2JaFLosYiYfzv1cQJjhXjg63QvIx1Invjl2CgSENp33TXC
+irye7BTPTATll0FJhc9LuCEAaoVXRFCGlb/5IXCQvEeahP5uF8M7qFqD/Y7Fuc3x
+ZpMEmN/3qHnarXHFowVXX0Qa2l+Y0ZNNZ6/tTJhIQD3zOuHjbm4BsNPsuS65HlYM
+QFO6avRY6bhX/QwvU9eNa5XMJpEFxRT4yxexyZrEzaq5za4PoyIikJumVXuXhI2r
+YgtFrfasD4/kNJHasuq6rJG32COnLMi9C29CQ+sIfrlDNDuB9DNnydkoKDGADTxo
+DZJP7aCdmhNhEIEwco0CY2vVgWa/68cLkWTVRHw0b+Vnd/UQ4Aq4D07/SjWBOhIz
+yrZcccfQssL38n/hD0PV0QxJAeHFXjtr8Gyx9faHbwwnMkFQFzgbJHMnIEkMF2vA
+BrqoFGLO7y1Sg6ybhgwQZlTf2HXBI1Fe773D9nrt36Xm/Spg+bqM8cEk6WVF8gI8
+S1klnsBQiQeuwcne9Kv+au7y64Fe5AuUJoO1Kg4ifT22PPdPZ2fKzUZDO7Wvebhh
+SxCh2mD5O4SutdhzHuzTvtmF1d4qj2w9iZzhN9gtRWEw76laZCHUNNc67Mzm977Q
+CfQ2AcnliKE9oVx51ZvmyauAtsLEYUm/B1rx+k6cnUWXrKE8Gg69+Ql4LEIKE4e/
+JfdNaEIV+I1k0I3r9QsVuKuBQ717Tc2R+QFOIa1UwFoG8h96fo4DcQ/PmiruAAZc
+jDvzUhEw7zsKmlVbVYJyThj7e56vmyc/HPKIMd//FmDHV6c84sK6fYxOJXTL71YP
+iCAu73sp1olJpRTvKOWgnUrvDJP7FeKH1IiS4xskgTfMQQpYGNXFxFDJzBr2L2WH
+IT/9VNRvdTfzfGJNrRd+WxR/roDDWdjMUMfHBRqOSVcfYWidmOAbyXuCEO9l2c5m
+NX8rWiD9rP9q+BX4yZEBxhCdJKsL/XxBptVqowQr8DtI9oovCORjSkibD/0Ob0E3
+gkYSOoKCA6pYQHp/ldyvHAFTCAkkzlpm1oEMYYrKB09WSWYUyb+dzvNfYnmbrae3
+Z6ZNU6Y78pgOhNh5qkbQCFx37gLaywVp92JBxgc0e4g8f0gGhIM0/IX506cO+X+S
+OrDNLdQ3rwe6/FKxrSt8tBsEzTzK6o86aU0Bs5vaEeCw1VAc/ShcELkYNAxxrfQD
+QGWiXJxE5X3sJ+yDmn8GKeIYJzxLFnL3Rf7rYy/FYtfMez9Asjyef6DnDGlNFuvn
+/7W/NIKFJP/N5EbqedlmatttQbk3uYteq2YjUMQeZRt4teKDch+Q88nG/pVZiq/y
+GXHcA1zastW9RGkgBZ5Whb3C0fKVqypqPQ5Iuzx0thFeifWZquFxbJrbxLYiaRpx
+Djqtumo5kC41krRYAOaONuhSVB2+zBjaHR3dWO6eL1QwlLtYaEOpa0OVZqFUKLhx
+UgW1OWJvF9Wn5LBh7Pw8ifqx/LrCONq1Fgz1meAxPxS6gDhpKo4MFl/BnuXe3Rv8
+QgZ90Iv9TVGSe5Nf9Us4C2DdDenwpbzWomz7n86/Ch2/gUWWelL71bwMlYFqCJnQ
+m8268sFQ454VLcGQMHIrhdKOpVJYRQRyzQWbgXFYeMDNE8/otf5ObxtOx1QZX4Ug
+87Eq+jB/1wMGbSluEdR+Utn5QVKO+xYuwM/NQs3iLx3Dl1izHcmM/CMqsjXx99tY
+n8gLqT34ppU5yMWIjfbZnZO5bXhD3XrLekATPP3z2tfWMDZa6S64ks8X8dzojvZD
+KZ9NDiTBEUfNKzQ3ItZLYQqnQsUzgdmArz17qeOgJT4prJwkcSPhvrTuDqJUWipR
+K61YEs1pxHC9VL4j7hxZuiah0oZQrFJM4OHkqa0TUoLQeb7Wxh4ymw9n8aXkgWw4
+XikjNa+M66tD0xCFyatkygK95ZKW7VJL8n+1gpkmz7vws0gLcuCBW5+8F/VVRo8y
+Fp6Nzw4WOwxbduE9fDnUv4bibPGoef9wevTg3xi1JhJqeRTHBXvtxGV8YeXwFxtE
+B8ygXK1O2GlLcffOb6RI1WBdydMhXMNOpal1L+cEqUxTOGI+wFqFr2W6GaJbqw/2
+peUDo7FLRnXff47IZOXQsyBSBQbcc4rw+01RoTndZZPCHAVAD9Fq7WNO0dvrVR/5
+fOrT0a1lzr0i84hehWuBgAZaJRrSw4tSJ9kpX2MbijyWXiZvpNBjALJgE4fHbOC/
+rcmcd9I+uO0GqOgA3uSNr+fUcw5jD/VxPVj8AUEcjgOjqB4kHfZ6UkQX4O9N8wRp
+3ngTgW2btWylVJgRl9TIRwzZECkou26OxClAn4B1DjP5IV5e40pdiK9U3krO65WH
+fCvjT8lZVKzTMxKnF2m+TlyGTWCJtODk27MnLgfxQ5+IMfJnl5bgsjSP/R/JsO01
+72AMiGaZDdpY2iymJBV+FPkhWfB/Ej4+j8Ml5PAbApmEBrNqoRIQts1HXOrw8pE2
+jzI+SI8U4UErjqmbYOweM1Wa6JhFxlEBx+48+QHDzlV3ziAnl7K+ZzrFFVzvVQ8h
+a/y5HEinYUywXvvVJQ4cNExLiArRdfHp7cW21Gv7cGn0pzrwN9/hYGS/9X5RZ/LR
+M0jbNKkO3RhojYh4PVV3uc1WgqtT6oAvwm28Zq1Nki06GsPwEKHmkccD7FcIf8WZ
+HYwXCK/P7x+RAX8E6H1Xg0+/No6gTYbvVOi/J7QFTGv4LGepPyCAr34LKWvLDkDE
+K7sR2usbmtJ+W+kghiceOX2PMpaYlV3mC74nMvWSdOJp3/gvUjqoOX2D+6Kn9qxD
+TNS6Nu4aFvnvX/znRHKAq5zX+KxGNw9TP4jcpnUf2mGwlEXDR/3pIndbIlMcOV2i
+bNd4pviKNkfGREpPbGGHJPwTR+lmmKb7aP3xnrMTkdaHXP5a1aaYZb10klRCakRD
+DY6XQzF0/QHxgL4OIv0TC5oO+iOZfU04xgywbKIFgdJQiyFeBHfgAKqi14750leU
+VheKQrItTXUr4ZdD9Mw+RUuv9Tyg5bv0vgIPEvkRl2dL+o0hqwLw6EE50aIu9lvL
+94kP7brQdtFuzmsFTgQS1umXgdhvQRGB2Jo+TbCvXUnx/AjlAfRwA2xqnEDENWBZ
+KCvBI5EYm0BRK1UEMqmWcm/KRxYeviDiOdJzLWNeijTkR0UGMB111hShyDlyX/Hi
+XXqFJnDg4pc30/guG4lOifuF1Lvir+bbSdl8xauaPlegOlMRt+5l+lYL8/OCYs2U
+4k+spjziJYvmDHU8+bojFJ4SSzhFaCJuiPImkOkXa1tLAtROyEVHUz55WvurbO3M
+ae3kx8OIDQcGvrsFK3bYGYfGqD5FgpDxNQ6QXjDkj/gZdNRLScwH65zgN3lhpncx
+2da4z1k51BdtOdtr8UTnMlbdKxXJ5UYmnZ88cMHFSeDorsHgOvEdK3SBOxo7fJwP
+Umt/dBIkJUP2bYnasOf8/HZDvVTK8XRI7ZN88x2Sm9g/vn0yHuk2OYSk5M5lNpYx
+UBQVeBXZ6WhHAbtU96nDAkX6ZYFmX7ZjEUJ5awhJ1HSlKMBnWFgttYsX8bmjoLy/
+5iy6jDdGJdKxe2HJRrdECnJ9ddI5qezBVn29pr1odrZzaFf8Ey4vDEr52CK6GupY
+MAdtrEA/mKrgGrggFDqdux+xqS0lPVXY506hZsYhANVd57/E2jPaCP5DYaRXDCLv
+ChGQGd0DpKoZuL6R7SB3LzI29IwvmmY8P0ifyVxm9D2rCStlNdwOIBN/cYuJuqk0
+m7XRIS7seolDZab6A1i9mMG1mpMEFhe4USH2YzCFo7WLOO1TE64rP2QvwkH9cDgW
+daHB4sULCNR+KlHwJXVC9oSZS6sc5auLMQKMRNyQaRDwivoaBspMpCo59/GByOJF
+tabEdMx5cjoZsYJ8PqX4zW2QuaI9jTvlC43f1Bn8J5GeyumK7TG7f2zXxkGJSYEE
+Z6I80PyVAsdS6j3CSxwFPIfQAJUglz3uU0Wp2M61ukmQJk9yf2DBZ09pVw2k9cQs
+o1ExOpP4oJuYoXih5E9hssg0Jgl3WDTZkN+NP3nB+g1qxwHBWqUbKKy2EoDYRIEx
+JbuN49gLLGb8uVa2zKNjKHE72g9uhd3r2P2Ny6EU8jRSfpQIwY5kRXyBIZU0qsf2
+y7yXZB38w6mFjxn2VTYHGYNIuEeDXbIHCRKcYeIP85iZ6MM/E5LrWtP9D/da0JLm
+mxKKngEqkvcRM6mak3MfZzkWEI0UYPqtvQSjX/snq2a4xfHIKlkKnfKMJadPNVqv
+S7JGxuakztnLb9p0SVE6wTwRfWAyHR2zoCyKLrbF34UTVEIsHP4my9zssrt9pu3o
+It53nVw6+q0+aBGQ23Fv66C+8g9byVgIBoEvVUjt3HzK8S6OE5DY6NYgbRyBoxG8
+k8PjZgQoX1amebnB+C3Xu73b/ImZZbSaia8vJRFlI094rTCh+Cple4G3pMOx3Ld7
+WYtzqzT11/DJdBgZBMSiNQeP92sorM2jcnidQntbPWII5/U+fhnF+nw3uytmtIbL
+ZUgdh+wwcK3xj3ARpCVKwj4kfKoE3hhmKlSGv4M/adzNw/AAAlUx2sAxzi2hGn1c
+15+kFYB8W4TSxJBw8Ff4S2csYX+FkjS6oPWG8FWo6lXU89xM4hEQ9WxmD2ckZPKh
+GbwplYefI9KiCGMuMtbQTbK1HHsruPUN6yUVtMbyLjm5fBNqAwn2whDEUymt3Eav
+kT4+erjhZyaXGrEBcoWToxgbvipKvfxOOgaMURUeS2u1W9YcoCPg7RYX3rMY5lF3
+HSgYi2dkAQk2ab0RV76s/ZeAkUHB0TbuSr+wjk9X6e8Xfnh87497UJXB1EFh4x3c
+9hrE8coZljepCl4fm+ln4dzOGYVtEkCMXFFuXhqPktBWnjzjVB4qP5CZPazH56cK
+/0Nt3Yg5v08G9+IqULofg7jH7ymPnOJd7nKPTGG+9tD1kdBMx/N9f3mhD02MzZoX
+7o1bs1kOIHf//4940SL1nQ/VGhkB6pOs+4rErydH5bR+K0lPUJjx7JNhfr+cu4Jd
+F3Pa1woHW0IVjd6U9lJMjrCaldM/QO52fCPMw98Uoxj4QRSmWsXzBayBM98lAKi0
+goKFtUkyrwXWfaHY9v1dlBpEY/i3F0ocln7bS6CZ2x77HGaqIzVUxPMjzfXo/bEt
+I5t8wMUrH33byRiN6E5f5DPkfCOr1Yu2WSE9799SkeY5isSiQ37HN9OWhSwNQ0FT
+CSleVjXOMZ8dMZZOdEM24+xWLrVDdT2N247ob4d1Ge+Zb7LBZ9PVQcPit6I8Kvfu
+WwuJcD7Qo/X5yAHC/WW9NeHaYc9c7S0H8admRucpRHjvPohAOY4Gz5AmuLY8pAy/
+akQkoP/rn8mF+XRIclvr0f2lkEKBueGuKcCVPWggs6U5SMdHcSYt6lCVjVzDUJrl
+gLdTomCwC6D4SvSMr/crFsBLFrWNDcHkoJBFKGviqO9lylPv7NVtMxGJLYEAKb7n
+TTSfeR8KDeUH5GUCnEb3njDMxjIRByorwygpSCMIwgzETshCJwokvgab4HmIAHuj
+DSOJiur/Siqf9c5Vf0fZTNQNeC766VvoIy7C58NqdqwOw26o2h+fowTU96iqVQ6i
+/Hu6fokhYaKgIZTvIpZCpIXI0K7j7LU/pTKXBbs0ybNvUOa6nBa9qog0lcex0EcV
+ZZlQWohv8dS8CtmgHlu8lLRXFC9W8th4ksqXEJZED57AWkVR4x+DBw4E9ZWBg6T6
+qfObLFdtASi2n3+HvLeHI1ut86duD0g+lC+sPZZ0K6+yrOr8syqwmMIwF60QGiDj
+r68O5GqWjvCNl1uSUlbpl2wz9VaUnP4cWGROnVa7VuTizejlSuq/+/3zg+FM4q3v
+O6soGekdX//aDcVmcxd+2gjiAvQL6ex6EwA9qC83sC7UjRn9AizgA9QXS0qc6GDE
+sseI90Uh+CevkTLQXfps1WNN5tDhgrLffEjYCnSG/BaNqNs7P8cqUXLvyJnx+ATP
+M6SOPuNvq3hBBX4+e2seWinf6KNWlP5nZ++Uw9MHabrtkb7YX4eAOjLv34i8IKlf
+V+lYj+DZmmFgeV6+URBMHEF0nPYaYBieV2SJmhesEUK7ViOK4x4FXV6vgKh1Q9Is
+Yjow2HuWxVCIvdyXJGfiCU90rml4B6hiLpNeSLjP9tFYrEtxw8QPAk5VCXtgsIy2
+9dwyZh690SkM92MbB48mFLUEsIzlWXlUBKIReSTVCXglUWulTgvmoY8fbuxkjHyH
+cxJAk9qz9XGAUxWGSmEpOAkpv9iexLF2wfsr1fwT45glyVyfPk3+jTnitSsXhucj
+oues2vZ8g5diuHsxWLM1i1jMbGGEvNvFKmYgsSYJipxR+kXrjyyBSg5hNLUajjAP
+t67RxcAFuwASFHQMAXDOr31t83MPkWaABNbwQcai0NDMwPXbCEA2NxySBVkpDVbr
+Sxgl96MlThBNE6eZPiySGremEsF10p5TXjnThV4nEErlTYsD6NuHxKw7fSJg9ChW
+9XVupX9skoN9I69rRqcfC7NMroxIAbhElAQfbpi+EARMRFSPTyZiM0d3FzPI3a6Y
+TU3H02+z0Ac7CvRqy26PiYlgmLul1Sq4kbK8Z7Np+V1T6ULdwE2yW4d95BWwqAOB
+Wuko6zOxUlzhgERHCigQ/jaqVIkgzK/bI0ZbA5gMEHuY2ENEh7LP+XwxGZX9Cwbp
+fPfn74/c8Lx/7DUo97ZsmvEixP/soOz+0R0+7HA3D6nKofxHdm6l67PWyaI0HaMY
+4VBGTvBv2XaGqpp7qsIV6NdIhCkuaBQNydcsHdWFR7Z9LB9Z7HYMOO8asAR/3fvd
+bP0vpYZD1TdNrA7BaqiBuY3go7HtuDu4gl0M5TkPcKxuSp3iSYpozHsTYQLE6Mpz
+Vihu90l9CAPTUsiH9euLEC1nxKlGbfTkR1L0lh2qXFzKE+HhYWDgSlr887qMaXFS
+cpd6ai5KKb1cJsusWS820+ozzepUCSRV2lGcgPo6Z84c8l276SkgW7LCErTLHXlw
+p2s2xHR2mXALcHPV+ddZWmnCwonFg6j4Ay+bZvCS854pz4BQbL1YwpueLS3C8wNG
+908lnJqDp9ROKrTKCLE02/5xuwE1FpIZfbsw4bMJFkgCOSf5p92pS9jkEEVwGVvr
+bCLCVLSCXFBC5CKmL3sf/Cawmh6eKdDaySOu/8X20O/gDwAqNmma/V1tftatHRpY
+jmKGFBGhvmbKn4InvIKTWS7i4c/LYRGKjlhaIXbedX5EHqi5wIFWT3nmNFhtV+qu
+N0LWTs+NVyJ90K3nPu/dzZanK3eX0x42UmCQ8jq6uwy+jqt9VJtZV7iK63vZ1vHP
+S20ac0dG0GJ/UQ9YNXy0ZpAAHLhv0TVT8KPhiThEoEoLkRinOYtyuk5P1xUuVcpJ
+eFAYN7dX6SyXcfpdsBJPIWEQQLB8Zd9XJ0XEDXXprNcg1ilAevBA0r3gMIR8k5VS
+VJoOizdmkD2qE8aGWHlaA+ZU5gByYywrifrJL/F6WlhTwJbsnJ7NKdDhuGjud2qz
+dyY+vNuaeqyhaG+l4qqC1LIzQp4F4gtN0lgB3n0m1F1Cwfv/CKpbrsq4kxiAT9gN
+PIcR7ccBGpfIkb/AT/4BPbccWnDwZONTrknmrIw2fqDiAB8jINcaFf8yyLrZq4I/
+ojEFPjbMO+/lU0LL49jXP5JS3TZu3cdWkpYQ9GYZJ2cwGJ7+/p0bOvV7lyo0HpIx
+lieRLP0UhANEJRlZpONWkrMDzY7o/8bTBiO0gN+MWWG5nEJ/SX8teNp9jYuS+jtb
+9Www+rC+QjvZv9rsJ9EVb+IdCwcAZHS40Dzf7O5yzH+BqlUS/sW/ZmBr6COisITa
+Fw/VrSXLTiAMl8LNznxgM2eJTb08y01JOhtUvQQIf1MUhwIFW0Pp+wqaSG4ft8iI
+dtU6ewv+DmJPbQ+0/pmTRocQP3f+rKVNuV4jUq+cG73U/Df753Iyvh/6hgtUw6C/
+bIbdKutoGPU4DP/EBHrqbn2zSC1+ODidc8gT8ZnnUUbSBpuLfAv8x3p7RB1XIyim
+ns5LQJHI4F8+bgocU+jPMQIxtvcc1pAq612wS1VJjNA8wc4EYlNKH+p9KzgcUDmQ
+3kkd15AKrVOFQq9tG9jpV7yYOJJ+JgD71MmknJGeTW+QGHql1zZaTbALlD5mokJn
+ZYKZDPYjP3L6N4Ukn7Cu/sF35xEnpkU3VC0zdzrDfkQ6RJAb5c4dr7c6+jqOFROM
+kkdQtzHRiME9vgxXwbPplnlram3VeMxV47BfqHIhMqE4OcA0uCHk/gIM0CpOCz8Z
+CLQRRP42BwbdxPuPdU6SNIKemiR6GqfSHvEUs0w4hx6RcKo15opFVaG5+3NbxKiU
+f7obJ0wyHGzSoB44xy41ii6Xfi/0FyujjU62euB0YVGRxx0sKCPkyvrhmY4IlJ3o
+eT8V8Y1kDj4KPzls+JUYjen9n8pSFTK4te9M5rO0Ir6Kg9JDznXl9SrcOPXfnoNF
+17xa8WnQhyxb8wmbLt5iBSxI7+HHBO/fgTXF2COJ0nwzsAFLROIh4rXTKZ/I1jF+
+9enzlmFJ6tpn7ol6j0Y7DDigBbOQbUsD2VORmRWK+ll6boin+Ohci40XSHEhkDEF
+EC9RcHD0P0t23CeCtdnnyY/qsjA5tAPAMft5H3HpBa3XegJp9y6UZXQ4a9pCUfAG
+OmV4IblqXZQsC0yDffkU/DbmeKoZ1CYROs/pKwyM1aFpGfQSNhgPbLXjjxa5mrAJ
+VdggNE4YuQBYwR3gD/L7Mlif9LJrnFw8bcd/wHx9qsaULj4A2rlCx2LpYmVKLvvc
+e41OK7tdDMIlmQICr/W2xVzas3ppFvOdpUCXP7efyrl+1+89W/APLVtR99hJWgHK
+FvlDZ0OM+hvhk5v44dAWjTe9TwwrS7z+XpuKw+NnjvWrnOocBHzw/aw4uYOccq/J
+/b4/gAag2uUlShhjvAmrYtOPEOZPcZgvSHcGom/KBRwl0YfZgHEbzAHonQtEFjbe
+r7To05iiXCR/4oA0IqsdjwkO3cRc7f9gvHw3gNkcaAYqpTbqoe7dyQz6NFQbZbq+
+NFNB+ayqzFU9XhCebnJPfOQZ64q/DMCL+USPQWuoWVEKUF3Z3gpCRJiYea5dWx+S
+MPCaZ7Jwf29ZpTgoCyzpwL7zuYqLSdvs0HeCyMHV1PFstmoOGyhdYVIl4GS/Ieu4
+NvAXr4apOhOaxhM7YZIXi5HnP0qzlDmb8gos8ipkmjpWjVrM7WRmzs9YqEqHPG5M
+GyOaBqDU9kEYfuFndzRoEA+yztCXJ7RR5cF3vcMdpwlcDv7ib11teOtQsmMOY6sL
+sEgHwFcIGUHRAt5PMiBSVPYOUjhH5wrHnKMATcdW4zRyVI1n3yQQ7jzxJI0Ve42U
+AYcyKi/HL3OYRXS7hyTvBoH6XciMbT5cNMLs1E5x2OqMcmG++ar34SNei7H16EFj
+r3mOjcmcGUQxo5T+vrN/4H8i8mqLcipvLVN0GsiwDn8WBlwC3ve2/5X4SZ7BzzAb
+X/Y4NqiqeWhFeCX8jvkAqkeeQA96QVa+BnmV6/OduR9Wy39xh2D96JsYCNpdocu1
+6kivTnKNt9ORWFyP4V679EkLWcpfObfXU0UOrozAOvfwQLNeyiQBxSxkxLPHR56d
+FLfoalPvzvVddSwYX0wZV6WmmULJVVfDTLABVzDJeMjyg+RLbqVUwADX9Wt9EPHl
+vO6jWKjf3wlnkRMtFaH72k1ZjBGL+2q7o7gnLiUUINRR3nDXcoaVkP1mUiyZH6cV
+I3p6pnXddCjLgtg9EgNmNYjJ/TPODw4iN/weTqrXMMYTe70dwCJ3kwCJARtnxGe6
+V5Nd1boIHx/ZC+ZYKICboJO8gT+Wni+/DTsWgGnMTtFr6Qv8AQ4r2+sFMi39I1RJ
+qvzBqYBYgHxzyMmyLsiI6XnoWiWiRHOqkklo8eE0FTneTUI8T6OayrCn0H0hk30K
+5B+5BoRCP3FSe3emt8aqnlJQhVv/bQmfHOqpqAmG+45hxVWwOycptmryptXQAwoR
+PDtJiUKCObIwFmKNb78fDxSJWJVvIHWZzHJ3YMbuKYbG7id2x5Wih/B0Puzh0M+h
+WEO3340lHYE3BvLMLV/wh7hDsv0X2uY4+WQp9dqgEfD0lp2cCu/aMzG9G2LCvTGK
+OlMIAgFW/4cl7FaHdkymzfSQslJ0J6231pnfacXwRUUMySMGr5Yf8dWKaAArPwDY
+UdhSJe8YsnVQWaiIx6XvmLZBhTB6uWZbzq8zy3wITmv/vIC1mliyImUW2VGo6h97
+4hu28fpc7jLHKQIeGZ7wyaDHUMNjXa/kVypUD0Tb7bALCvac99SkzOSFOBHXS4/K
+ruAbDp8u9NY7HfBxng3dK2kgciR4piD7S6Ob4QSQ5Wszd6mMlPj2xRke2MaPgGUo
+Ymx0drVdrmfH9TZ7q6G1BkFXtwQjrHMFGMypH7Pn5nUL5jnLiwwi6mXBb+iUfM8u
+1OibP/9HBij5nZ4ssZAX4cqyA3bfJEkeXEqy2MgAcIaY+eGW1as3OOrb57Y5ibyS
+4xFugyJgLPQYNaYoV3obKKYgSHSHKAgO1nI3J6DO88i6PHukT9aRiHXsJzwA0TbB
+Fg3sonmPCLQIp+fGqujgnzOLAvJBXG90hJvw+VVBsD29fewJkuTn55CyzNiaREPe
+JDyO5W7Ey0JH5KsSY/dwYdz0x2HlSWD4vWHG6J5mQE/wk37DvTVx8VBOEn+ZH8vS
+SfvXH6o6Xxsaw4aia0Pmh9o+bbhLU0KzNOlshvWpVOEld1x9BbeqdA4NSsL4ZaRQ
+Sx/tDH7qBFSyRqbOK/cmFa8gosKof3r2t+8q7UjBlcP7twplz5YrMkoiX6PC04BW
+I1R8U1geror9ZD+hdr+8SmOxXxo6jLJdkQF3WAfjLnjnLAr3BGKriF8Pt6aVD9Ti
+sAkc6qYcZQg4NIzCfWXB/0wvq/S8F+pB8qE0lBO5y5lmsohEOmAZtXS0n29K8Pg/
+yjJYa7Cxtcg0OOuHwJ/zsxI7yG5MEim7A3edR9LAIBXBWfuQg9t3uARBByVsk7+i
+KjgI6K4j+1mmocTs2F81bTgonYApMS948WfVaz/YKaAhVCG8RockMIOTR8THhWvY
+PJgdThvkUkDcz20cp0OW/XOJE2dhiQ9LaMF2mba40wJP7Kiv466yC7QLg5evVkAB
+2eNCNkPz/fxBlTEc6HQ4vcaic/OBTuC5h9/m9PI2yKNUrRVgslEj8+de6wEIcxW0
+Id+XJ4ck9hLLvpvszBcnNhuB2ldTDReS4HnN3IZJiKJ/1Xn/xgIz3US1XWjEb+Bt
+bCCJvCrOw4WkImaZD09hn+BFZHk5E0NlX8XT662PgElxq9xd0fTu+esjvsnuP1dM
+VVUw1a1ufd1mLwP3F19jm/ZY1pWJA2AN/JI+jiCIlLW385/4MFnisRMyj9jvhnPp
+Z0/U3pzlc41PQPtdSbrsaUv21skPirOlgUMvmIJWB0pRJpXyinGVkhQX7lKByXr4
+1uK/28SB4WwHBEJkhVy9ur9OlNjmnOmbf4nMiGHOtbeQ1CegBIP19Xg0b9oGF3xs
+Rf1QDaNOWdhEO4UWKHjnX0ZAVEVrwqpEvAezLYlZVR19UU2WSEhvPHIJkR8rwcwz
+/wVUz6AKDLDjvgEVIG84AA4T1nMJJphxnwiDRfb5wq56RpIigb+gK7s38Xwfiqto
+hGydRp/1MMl8suPXYoKp/p8fBFGd34bsrMf7jd77iI0HTyZELcgdIhAK1PPYDbs0
+1PMMStiE5B54Pur7naAorFpQEsoMNLGF7cqGYHVab0zjxD6CtmcQt7Bxvbqmky5b
+KIJjCr9ah8OtbFEYfzOfr0NCL3W6zE9ZwAaPTTlxuO0+nzFmUK+7Jb+Hhs+qzPgk
+08PjH5xtSdfumvPQusEwY4wFlr3tayhQEznVVPEw/4rHq3zexxuPqcmGDv/w+eda
+3IgmYh1XpBeJ8Kifrh0a6S3YRh3yeSgXoJqM0WqHLxmtClq1mz12o/83kxidEYVB
+wZrGLP2f08/M8F28nEOR3OuFxT2jFHoiebhRBxNZCJh/Ho0zcptfUWeZ2jVTIAXq
+ZZ7zY2m7ICmiC+cYbNvcvd0XOCW7dXRg63MNBWhomEwLBndwoh7R8MEDUExu9ZZX
+F0QhCc5wE3vcJBJYipktONmE31IgZ2/272Dq3siTbwWUEPGVO5m1bq15+PYgaPAX
+gB47xNoZdzCo6JbBTC032Von0E2SqIw9+OElJacN2pI+b6a5VtzUsr0Thb0j3rPW
++hWf3p5B2EjQK9qIOWA4XgGQU0tIf14GUBR2X5P6tz88p2iR9tCRQTot+r6a9bN6
+Q+64Pz5MlpvFTX7xU6MxQfvHd7vME14x3BGCc5Jwuq91DkGl8tDm5wGOKBHT+64a
+lFrjbMGaVSZV/Z6QrTVP/qpGio3U3lBCQNl4D2PQbFclQmkxOT5PYZ69V+tdyQMI
+MYfZ7qL2qKc2JbgwqarsI4Hu6jWWf++bVHEgsnvQo2drz135f8smqQAEP3atEFxv
+0o+2dR6FLZZqvR9ztPOCLqLwyw8e3f/7/w3ICW6lUfKR7HxvNNvzqF97arSxaADV
+6LfAhjavA8/M5qLqgo1L7Q2NVKndHFKuWqz+L/mKHDQXmSSclB663z537l7FcXl4
+QEXerLc1K9WQ0zUncpols6qf3WmzNEVZhC7wq/lVyeRe/USCTXc6UKjY7gUXQKK9
+P4tY6CvNIaqD+Ty7xOGK4KPr3aAhFlntZ3PlSVmy4jGiNz1AGsv3l4OZNTKgOlZ3
+H2h0LgvEV5jycYM4UjTnF+R7oJ7DgifUJ4KwS7RTC/YsNKgUnY8jjJ1iodO6oYPi
+0pZ/fL+RZkVPdfyYwB1e6q2ohJN6iZ144H7E9JVXR2pGl8RM1oMnKPivohS6ObjS
+ZeK2qBlV2XnnIH8ytM5L7du3V+5LoMYgUux4qfFWdc9dChUwr+N3pyvRp/ir9oGf
+pyndMFJ+2Fh9RsGorHGJVG/obQyWGlmsbSsESgg2ca4uy4vJNVmpPhABz/LT9oEr
+GcGcM6CBCR4cQB2ih25/CtVllOw2vg/zdMjo/CyVtqO7fsZIkIEDd7W0q4nyu1yK
+BiyTypoo4AKuTaBqiIQJ3hfT8fAkqisYgpCSmFjPo1ACXga1N0St62Vc2LeGmNCi
+G0aPdx1s3oEdbVx3ixsUQDqspkrk3FCubSMCT1KL3tz/FSL9AlqEWm2uxeDqWXw5
+oHaJICsVMlgBOJDtoryIKvc8KSHEwbv2oymIUOuKUvC5k7gtiUy/4XzYVE5AFAdu
+6vOtZvc1vZlLPDUvLi+b6X4ToHfCy/2dkrWIlLf5l2uhnPeoTejTHjGMRqxhX9M9
+hO23EOnkVNNEtLiUr3/WhzZZ85h0pzAlROcIjeyZtWWWEXkupkKCYf+4wXKlqfNb
+R/RZOJkakE7oeBFkHRFT2ejcwkmUmGYWhrRuqGV2HTQAu/nUdxLMqmQfSKYV+q2w
+43a2utDs6uVahdnV+xcmacCIl8gWUGCQhFcUgJzWCxW25bm3nzWB7/W8Suhw9DYg
+XejqeA3qk2Yzn9/JS4ekveQkoetxHJDbVrf9HeBkV8aDpNmfAPUe4DnjPPEDKZut
+z3PWAP+kneckT36fz0yePieLBnG+H9FAfDjKVJNXSh7N++JmfJCh/77+PEyNujKz
+uUK6NXpmzdIW7jG7vQzqr+IbrpnmGzdY0fz7IZ+MwfpZtPhspkYSxXISgIcCQx8U
+qh16ySCh9uIXHeKZbFQETFQSPttbTFSAxUqz/O53o6t4KbeQgV3+mau0S7F6FT1S
+8hFiqAl1cVC6h7t3PWbjqJvqTINt6ZjJ3WeGZcArWvHDfsXg1MR96psu9l3xRF/E
+NDkrk/K5M/jxoLP9qWYvKLDjm3pz/OD5T5nOjAyRIKFEw2YRcebrukKcTlIvD3Ch
+kOVYKCW0ybP2r7GVopoMvpQpfeukKgSkZO/jzXIFTG6Ls1jiqPC8INBvF0Tu77Cu
+4b48h6c4SPbJYWoWU6ixBsGRRap3cvpgQSi1jP0r7hjxPo+O/N6S2pwwHaaWRv5u
+r4E8DFKk84Bm/QrDAjG0HmuAjkAQJMx/w/vs9FAT9/MkaxwcsaxlUSEDG8b7MqbB
+8ePYuUOvjlD3lORsfQypf3Q08WO6kg6mEtpTzpd2fPxrnYe50YjobN0TD2pxrVUA
+Lr/u6vFsyE6rSdVbRwz6vBzDcvIT2UpYSxQs6/bcPvWaZUJhFrBmF7RYeWlzVtGV
+4w6F/xW4Ud91N+mrLMON1oOModZn0gQigl3aM+baKOCCCIU/vmate86SkjXBdyeH
+dWxfVPdTQ4CpsZaZdC4nS6uQ7hhf0wTmqE/hispYuFjE5oB5kw09DEEyAPTmtx5h
+Zg1U4zs7FLp3RLlC1wALK9OTeA0D4BKCT7DjPlqVknC4GeOWscDSv1AA9xi7JciK
+CiOyS68DUdbNmNL4IN2K2xOfn9wZw9p5Xqh3vePdkRhBOs7H9ykZ1Atze/ONN5lg
+lv/IX9/4VwWWtVGK3F/1zeBEvz/DM64DsqZ7nHXUx6sLCebZeM9CDAJJPdI55L7k
+2Gr2D66WKOsmch+sQE+TlbwmOrgFtEm0r2j9TVAfVvofGsUhhcujEYhGR1Qq/PDn
+cYNVi3yAIaUVxHnOo8B/NMCyf1J6BXad6wPEqYv+nGNqLnTHvIlQr8kEnKSCb8Na
+yUFbJSuowQWiVZNpLyaRG95hOljZmWofcxZZDHf6nf6lMmsUAKessOmFzh95NlQe
+J+T59bFRwBDX5I6KCQRLY12m8aGb3ICNOXgC9hbx7H65R1sA3ogfK81s4es3b2vT
+AaI2DCTjtocVRbSE4006wreTj6YCSfJj4UpUySariagBrwoI7VQDr9DqTqodOufn
+yqY0Eo6BBKVfulQeSqYlMmfYhdzhoTRUlDv0fB+AYFlxn299Bl8Wcn96p9l70so9
+qh54pJ4FfuEXQ+f2TdTjdOgM4EQrtuTI9Pfqvj7gBz2l8rHDVqM4VnKgC6O6q6t/
+TVV0Io30nCX0PFZz5vS0KVyhfJfS0M4STM23deONFP4FlUE/zw5OLw4b4CnsHlMV
+Y6eDQPvAHysxtDg8BfT+Zsqn27POC4MTcSkPXKXdAd2bh6QZAYP+rLhm3kguEbki
+bizlWcQsmCjOq/BgFtOnlQfBKKcw+Eo8UFL9qyycWbigDkvFsEO5u8Hm+2nVyrV8
+6Yd7/F7y5ddYF97miSdKjbUEWzQwV5FQaXhFI1BdNBzca1523llcAWAXLTDLYWjK
+HuH+wZu2Z0x2D4tJnIn3ED65g60xKgRqpz0HK/VlAGm4AJa9CdLfO3tu6ZagjtHd
+uGMO9zSBDRBjNpy31370Vx+7L6X5nt85UJ8FnRNeIh2j/rjyTH/ivbhtI18Mxg+b
+rzuGusSwrkQHdkJ6RkXVR8/wdUOTp55UXF1NLF19Jm4dsjxlh3GPPqmzNXoT+fZv
+8I7dNaPNKsvVXVhci4TiPM3GNjQjTW7ZXGRauZE2zmkdzhLjJeu6aE11df9J2ryw
+QCfMb7YnmPG7jeVsjPZ7H2e4c9ZX4CQ8RFg2RBessL7yVTV185T+tDiohMBMTrS4
+m0MTYsUe9UGdZOiKfqRYxfdGS6G8p9hmsT/oSsKWdEWaxNWU/odfSfOFdSGtW9SJ
+53IW5Zbe+qoMiaqF6ShkZWxJqnGPmQQxYsA6OCV6icd3kPL8g3KB8OK9garFfcdA
+hf3PclVVyvnIVk0ehNBIF9ejFDkXPi7sEuRX6osC4zotoyk/h9ejbC5HLvZj7XiC
+RDWoZuHveYmB0sFMAweJegCQ7LfGZ61nIPYOq0a9PAkexVUpC6+/+CZfj51kPlo2
+CT17JgG3byQmwwIvs57by3KAJqpg5QSJk02PowM8PU63mNyjmpTHWGwr5IEC8h8X
+0fy95TtI6beVXP+Oci6rn3PmzLPuOFWbG4YkRvpuv60HEjJhWebWEX1iww9W9Rw0
+LFw+1S4Hqh6HjJcW8xIVtnO6Ut3OmapSGzFGZUjXBrHPuo1Klknw9zZdbQIK9tMY
+kXWlVVN0I2dZ6GPYh69uC7rxieAzDYD4O5dn8zS7Z77JO5M0g7I4iXHTgGUIVUc1
+FoKfKrJGpW4lwX/zbgaUNW9FXGS3iXSCrjDD3TM2x0Ct2sMV2iDLWAXwharaKoi1
+GxHPzuH/6qc+Ixnpr0pF3+WbSNBQtp1oii021Uccx4ZSHqyG6LhC+Sgw3Gj0opsN
+jCYHpVpgGgZ5zWa6RJqRKY7RVao2V9xb1L6TQArLDBUOZ1fklH9lLsCb2M8Isfe7
+kzHMCeLtpCE01a4yYRGh4y8NiGglje6E+AthF4Bsj6IBDnTxMn6fvdw6UfxDU6wO
+AOU96oy8q1kXGBuQV8h7qIounynw/EnqGKLgOM+lvX6BAgct8KuH9eU2FvHBbJ0e
+FEnqenL5QLAu7dhK91abYGtwnE7pNqKIyuvRBp32YUrOYjV3xTHtrd0bv9pZo0Dr
+tsejuLDLM/2kGc5ZZPgDpMgoFAjAZ4eGtbjtVIp9T07No+DFFyLFQckn6AMdI28U
+qFMUPKJLT/yFXnJT1AB9nHQzx5T09q/JPk/JGDhj9gPftSjMimmI7Q/S2ZNNQMoD
+w9wAvk+TT9BWZ9cxk3imdlcVH1+a+EFPZ11f4mBXtiq1uBsLWLD78P30ZwxTBNgZ
+Htl9A42HU3hW6XHSYyojgt9VyDu8+qNe6DQm9ZF0cjbUgE9VTRCMXzMywRNWLpeu
+avLFaZbFPmH6lywdPMW83AqJBWAm0xpJ8c9Xjnupi6pC0d+o5DX//+qq31pSYjXq
+kzpRtzCb4s2D7U4oItcvBisSXiTYBLR6bE7cCGcDuJc5SJr+/WGKMYAl5suNrauW
+VRfJrPr9pbB/8WVkHrQxsEASuORMPnHWZLFw5TD+TeYxTF6PAyeLmBjh6Zskg8ti
+jufnCJ6z1heh6IpfxX7kEACjA4D3E6eS3Z0IMpvTeSJ/vJ56sZ0M1+ODZ7/QYLaN
+hkMAMNDbqNH/JVzy5+Q1gAdC3FdBR/5VEMjZi+3Gs5MESxfmYvMWwSQvQQ4NWmCq
+JMgZ0fHnUTdPAEbuRS5eCOiZ8ExbEjQ4F/dHV1MgticybR2e+l3iTYkr24oL6uLc
+//PbhWCIxBn3xFsuDdoceiksl7Qk2UuvILq5w+jERGrgN4uywdqj1vt8kZj6C3IO
+LKq1u+QVka9Sf5Re2KKWkPjnIZlFXmWEkZ8LlrT7CRFq8T2eMkFJx3t8oEIsPkMK
+CW0jVJz0U80FM9g5PZ631+f2F1WZmNoh4HyOFBHtQtqlnCAumCzv7nyjO72dWpGg
+jIkbG/B6Anh6vnP8lbkSunWYe31BL9IpU5TSKbOohLpyhdPFl63KIKGeXYlvmftS
+G48/oVKB9wRZnaNxgXMRnz7L+Jd1OiODdqFsU3jvlcRxK+swcdykT7AT5L5avCvp
+WXB+gPlnJuRyYQ8uln6rT10A00elkUqjpDnkHR4IZOqEvlvtfxmB9VuLvEV53TGv
+r+X1DMk/PFwUrOL2AAxw+rQKF208l4S71uuFkpA+5hPtDyoIbGH/wSlv0EV8oieK
+nCr3l6N7aSEwWVLhPMJAMQn247wwkve6LI4VP71IJG7zL/GXmzF1SsPYeXzSXmvA
+MoeAgHKDhpS1Jk1dX6EY08Xt6VBje7gqvQNIJIzM4lBTjr3m1fYjdJuX2wCadVyZ
+P9o0b8yEVSL+gEJYF8qLRJ3vKZPVOF+mVcgTvT63y8ktIJpPOx3E67iT7mXYcQAI
+61xORHTOeZ5q5UeaLTuYQJDEaSgykkelHkt4pkDlr8WUzRDtxrltzFwCG37Mqhou
+ax0jpxD9637vC6hpHNPe11ALvDqyZtGyv2aiByOUsTbexQaHRoflBnzJZ1ZHf8UW
++KT53mQrdv9m3B5V9HDocmYt2IhkvcI16N5nVeAgb7/aimVDXYQdvnYiym8ohMLM
+F4Tqwzx80ajUdBEEVqPcUwdV8lKVFCmf1JUaIBFWAjKen7M334WcDbMXPYKchBHd
+lLl+euD842zUz5JQBawpAzobkapnxzd1VY7ULZGJphAMDjrwAblyugsOLNMKKB8v
+Z/dQ7LGXVdw+wmvSQxXorlJArM46QqfmVxmcroAauw8bSYUlv6rKXXcQQf/QpJUz
+ZKEJvhXn4tsNs1xWib0hr20rq8ccqUcuXVjMQ95+6hCJwTBOg1TCWKKa1MotGtTS
+V4SuQJh7KDcITJR83IjDLktZ0OM1sR4UzU6DY0OFrKO/rVeOV0O9YnkhuJUpclPb
+754QSvG7Kr+6/ozJWHFVd6K4KdQsRXLOZ2MZ1OpCKMnP8ZHfA4APDJhginkmrDg6
+8K9+Y3AGuYZz8d2H5h3iHWi3wRU6z8incWvMrz91TqDZzNxxdnOriQyMvnNLnSmt
+xI5ki/AQIWh7srTqoJp4R75T9/Zm0FcoGw+9FtJt/pwQchaLKoZxFD84Sn/FOS7d
+S2V3AeYG3qd8OjDeO1hKc8Atnz0XMqDXP5AgnK8FHHdJ0tNq3ybNANxENjyN3yUl
+Y6C8hjW8WeVOtkUdnLMeQxRBL5pvNvlITpIbQa+MZzjjK7u6jJ/na8G9vaA8s6zf
+SMgYjh49FpQV7i9YNQVWC5jnQOUycuafq5xos6BHRZHan7uDYPs/GQHC05BmumM3
+OG4yVFYMY+ec9x6Iboqd5C00zUaS3bPF+pj1lNNNpMzTk0sLm4fiQv0wHHm2v2w8
+pnHKA7MkuBwbghdxf3NkeqKoQdNurkuSv3nyfOK1+KSKwS1dEHobCehv3KgsIPfE
+SUHdVp7RUX1zKbOnqEMi14xsfze4GBvBA/52CwC4kHgfkxwGCeIBLyozQskx+dO3
+CSCJCjZGYHKWL4gPkv0N51TkPgVIGzFnFx54AfGUQzhktHmgH4EnsIbRoMDgy99D
+DEfCNVxLbX8mc+NiaRPzX0Kn8VPkjjIxgtMwV9MUpgl+9NEUQuiav5xEP5MR9T+8
+DWzPZ1sTP1Lx2jxb3nBHxyaPTq1FrErTCe3+t1C5VDFRmIybjcuhhZjKW/+SaOUK
+ip84U0OLV0X7bzreznfURMb3a/X4lJ2a8Li4qaQ4/PUGv81iuCrk4Ppsm42wEfBM
+heNLsgVtsTAASjE4348o1mi1ETs96Ophxccwbtd8xohcSH7tL4NS9YPfoGNY/OrX
+np61vTUR+oOumSVdbkW3K9tNHGwKjYld+3Krvn+mZSaTaHYYW5PHPCndkaNCTHIl
+9h5dod+hWishPO1AmiUvAZOZH3a01gv9fnT4AsRd0hV7mcR+fWVsHOfnvjLmhd9t
+6itweuCv2RLC0YML1RwoAx92GNRrjM4T9Dkqa3Qp6XgYQzgu3qeCyDbc2StFKUGk
++v9ls7IhmmMZJPo6K9QlrB6/JOzkvfXL8Dy4IeasFoH2e7CXifyOETLDUpF8X3Y8
+td/KTs2zlj9Oh6/fV/GVIxotPgs4GXXfjccQGCDgSeEu3PxIB5RqG7dboVrLG7eW
+8/gQ0yj35Rugvwvf4zVLbejtikZq+CXxD5RbiuyylBD3NmyqgI1VbyuIEt56o/TY
+J9FecvOzBCfrqjvlMKQBSziXGvZNxi7vQpoQxs2EPEdzMFK9V8PCMV8+fZOcehtV
+cnfOLjtdBMl+PUkrsOBYVvmEO1xtsgFrHr5tniQitlhV52qHJZIxZss8v96xhy/s
+5e0Jfd5CInkA0cJtvI1HsfzPrKDVG5yshIsZ1uNPzhqxnQ7Hlv0/aevAu1QDbW9x
+VhMpYPMo1BJKveLxA8AZwav1V8XrLkkTy3NuTCt5KR6RrLDdGoO9OOVd42umb9yf
+20rlLL5qFWd2pWpObxkYGhAGADnGjxba+RTLlZ+pS78AnWUsjqY87L/CFXiJ318D
+GCxe4yxo7nKoUYCDeP1S8dLD140SV1Cij6gERUkvY1hSTC+VTdAOPGaxJu0RSlmh
+SxHQqYyg7TN6xcRjX+xDaN742zQ2I/l4F9gmGdqDgujNtlgI4MuSH9/uWb1TfbwJ
+xVkC9eOQptuQbb0iylbA1qRnpMNdJYt4B7SG74qMR+ay9R4WQTvdWficjen479uB
+xMyHZuJNemnaSeCS/t3WdoUVOl2ItUtIMgy2UWDGBwG0BUEMxk71u3dk18WrSd0Z
+E1Y9K+TkV3x/b1yAYC0WQO4A0cL5u1Eum3WLZ6K/VUl1wdyhffFQyZ8ZRtfBBm//
+B7yXJUn5gdtDaJ9R0mf9ehqp1ooIacbP4RheCswGph1xBfVRiB6I9k7XzNY4fLYq
+HS/B+eF0foX+DuHA1NMXPyTq1yJVJ1xU7gjQadgg5QEuJhiS5DZ1nTIl42v8Ig6T
+RzWldmOD+LCvT3ZQ0+mczXqBTrheIib12Hvb65Cn521h5kvkHyqPRZHCnXvOrtN+
+R4ZsQ8mjv+gmBR7EIGiDm0nNnuUHBma+aixZgFSLHVqRzOH53XNoXPhMKvypcpB1
+8yW2eNffGYX57HYpiQENnv9xxW0wOp1vgiByBDtPROLrIou0aWYs6GY6SukIyufw
+S3lOo1TM/wn2kRohucMNs/rL3QZJlZDM5mYYwdxLdA6B/p7LutXA4MWCqXgMWHme
+nK3O6BcULD2p58ympk7YoIXQ7VQZGpGE5SIgVkfvvSIAXlXAd+4SZ/9cEdl1VLxg
+nSrAN4swZUaaGG5nxXSjHxidJZKO7jAAA/h2xiS0alym5WjyD0CU4HLaZBPYPTZe
+lJ6+HkV6dV9n7NVioZSbw4XfsguEZaHGCrlhoXvz/3Ol3zGyE3BrGvOHiEORwLs0
+WfcgvuwtizOIGQXeU78kpgcq35hmAa3NxzhgQOHq2fYeuYuZ3pxBm4rMG26G0UF7
+zyN9o+OJzJnG4ZNvT3AbgkSj4EzK/Tp+ec2EVvPk0d1D0V9wf3jp9hz1ZqdKvPce
+Dg5Y2o3NPChNzK8b3bOko+L6aA/OWjfOXL7jgJnzPdsFkWEO8pAGsxL9gLNgt5q8
+RudZDg957RlH49iGGdFje10gvFyMrp12/UuUu4Q59TaJ7pgof3imsuoWfmmX6xVm
+JZu4bCgGEl0HhUNMhkfNP2jdAexL11YTJ8ZNibVNnlkFf/36Ril920AdKZCB25Qi
+knz7BelafIocM9Y/AaOihKg37ijy+32e7hGUXYmLOstmGGsvYvOpMzd+LcLMYAmZ
+N8bgdkyeYgQ+zScB5Mqwec6FU9GGKR1ApiWni4EtE+XLbbA0MHUqGZejtsTuuw93
+4CpLmIdiRD47NGY98kLJEn9A19tB9kAuTFFor4nlXVaeG8bjJ440NTUHetsWvGA8
+0vmUcchKHcSN/q8YwYwTSmUaBwU6lOQjAifd5+mNLCnCGoeq5kGWGF8Z3W5FJfNR
+hEvl2fYeZjxqGU7/w981V2rgUXABTaKFx8Ea0AhmJFfvi8Vygz5E5uxJqKQE3ryk
+k0ih35bTIvUvQhyPk/ArNdboYThnT5T08l4KNpi03Ic1yf0WVkCmqQa6dn9l7r5p
+KHmpUx5bND+Dbx5m022NnIxPdVQqqD6NasGK8eSzcnrjlC0qagsptjOxcNucBmdb
+GXJnvvlUShny2uUyJs0id+1tg98GcS0T6zf5tgKHiaogQxprs+tu4DaoJXWrWyl7
+nXLlVAjQc3Z8rdoQHW78zP/Q8fAENQmQXxwEp8zggBPzGQdSY5euD1oaSINMqyHM
+R1OF2ODu/QzwcZqkmu8AnJmgsLlqGVGOWNiFKjnXnL/XHf3W+J16xWWwXoExq5qd
+EFht7PywMTA1rt8J2DSC6I28KDd7XfKtf2Eac2fA5gdc45hChjRBRYi5NeXf177D
+GpQdB/pIm1C3p8E3XJH78zukunbeIO2sx9lxYta9PHaEpuKK49QHRJwlJdDVnfMq
+DYeOGFantdNWYsc+2Y3UnstcnfKBgXqbuFdttVVi7UcksevpF86kGbldVbVvFs5X
+OsPjbVxaEPH2WT0261zznEsLV4o7Xn1BaMc3KVmIIjhS5CenuBs3+GB4HAP/qq8U
+OGbkv0NqmjlgU4+uUNjo/zkss6FzylGzBM5dHo2Msjb9YhXkY+e04edavzO1qAtB
+/otuGx3JDSLiIeQLTPf2PvIaeFGiyLqLHfoGMwfITHMacKUg/Ts90P8pgibSJnt1
++G80FJz5/PkBntg5fRi66EBNYReGAey2c7mMsuAyaQysndN5yQZF0CbALo9K76eU
+poLNZlZTeDoo2G+eovb8qBgisdZR8XQLsfSxnyEPfEQkv7brHOLewdaE9BVeh+8U
+fUoJGZNWSsan4P3QwtPjYZzhhOwb5sA5wEDCJZ5L+WoqaQvb5CihVPICrYsXJlHg
+OBoWjWw76VmkzC00OQ84QIrc1uOSQnvgaD92X1QER3bhBcqPLbPV/oxB8h2GAyEA
+j/4wDbE8nyQYWXmHaLLyrfKBYO8X4XetQ5108v9C4Ynuiq7WE2I+SbONtsrMNDIV
++bru9h3r8sKaucUgeGR6oHfccJra0LyxMk8ul31/g3N0tQA6D/V8/R/pOxT/2as0
+vXEsUzgCkCCSqszZLlKCtaPN4jBsuWgEFKB7+CyPdxnPKBY9buCMxEnxoXcVMJwP
+ayeQZsjSG898zNhPNgOH9DRdDAlMhqMwhXpUARupiZT//l8mez0v/PAuNFo9c7wm
+AQ6TsPAJJY+pt2hJ4NIyvany/9kiYiJJUPpxebYZ7vLxvHXQ98Dpsnm27IcUxyVs
+QOHFuo1QFOVZO42XYI8ZAzownAk/NVAVcMSgfys8HKDNmrYFgaiDvdCSV1o2vB7J
+utPEJM+191exQqm+Yvl+4dzJVXjz77QyWH+bohpOCHq93qhOXJXptNhJDtc55tlu
+2vlW36dcROePSkVj6P9p18xGyl8xlc67369Chxq3gp7ZNN+ufGVKQoUhkk06NTLw
+HZgL0riuDicn6SvcYI0k575kCnFQkbf+iJU6DnHZW9ofwjQnYtP9fSpRXKe3A0+W
+rXwIPzklOXkixa84ilWC+e6/8uBb1imni0BUyLOUIJSEdFqjJenItX/8hh+S29S0
+HHTvoAAcHe+JT/7Ih0qKbbbpDeK4f++wHkwYKbT3XMG5WWtbPbB5rGb1tbrdHYYH
+N7qAd8fjesfdIl7kwN5qqBd84WSvs2R+XihkVuweNb0g9l1cNSK7xah0rQwCTUHp
+L0bS4MZ/pJ163pPfSD08ZjfOhzwrH82dpGLMUuNjGNc4mVQIj3DKzs5Z9QgyfHZL
+4RAgDBukvB/O59U2uugfYPAr3qezOvp5/59R+k9YCYvRratv6u1fH4d6jFinrYw1
+dG5dI2x+y3hzDVNRDcICDDryjFA9dnC9LkSxLhTioyee6TARdbVKSLuFQYO2qe2P
+dEloX4azinUlzDFmVj8oyLDib/Eou6v/J/DOPMwguSyZ6WgEy076nhhWCCuQPCmA
+Kyt91pa5PEz4YymH71fqUphUr8yl3iFdOuQB8GUpdKv+JgW5CHnwlHaLfDduADVH
+pVEoz1r6u+x+AahvpKp8ZK60XLhNLmBpyy6zTnKEs2Nrp9DSULFBrN3gd7HF2JN6
+4/z6/krE8QYIELzA/37JS7A2Pfpd3osQ9r+YYxaFG19+rBqhYiyBJ14s/2w/i9CI
+Jm6GjJ6WrQKMjlGHA9JuEzlk/2F/odWvmQKelg2kCklXDJP20uHnPoZBBqMEjcGu
+ypnjy/IUxr+60SJRsplWwVQj0/Hq7Rg8wmn1mXplmSHHMsaacfKzsGnNPBzduwdJ
+njQrE0oyP0mcznKkYR8wXY7oCkv5BNYw43M2Xmo54JS6oD5tMUTAnaIUXvXUOzfN
+/n3Iav+Ob90ljipMNhBQeJV4U+fp3BOmv04xnZnzgQo4s+rGyLd0aiZQdaHkZors
+Ae4gLGsHTEtUPxhNmMN02eNNc4Lh1VhIkS9sPi7NU230khvdziScd/xqlqXXixg9
+Hoyx5c4lD2B8lKi55FXQeGkpcX4bN0gtU7dTOdB+oG6YQjw0JojdNnfpvtvQnpr0
+KweBpf7PJ4bCFIHqSUARb7QvMxlRUWblmkPmcdqJhA9XEv+V87tW1DO36HM8wvDh
+W54E0hT9NlwCGnW7pigQ8AzdHByBYdo7e5zCxw+ROm5fQht6lTS8bFyK3aEgOauB
+zFfgu3EUM1UA+QR/dC2RDvjv9Cp/qv9QI77fUBJIr/ybvr9c/9KoOoUEql/aTdJC
+HZyReRgnRfpSlE9HHW8ENqsGKtYsX0GO8MeC4kqdG8LTpb+R54Rhddx7a+BqSL5V
+soQpT++4g6FlDoZ+9bR3wkorO++SL0UIhJhmrl0jJDASQJv42/aqJL9FT2O2MrXj
+nLs1AVfJAdX3uSJnkaP5km+58j7g4n/bsx2K/d25ubsLzfjBqKRehH/EYQN+pjfX
+27nrql83SEFEqa/o1XSlAeoDoBMrUviGskGysce59tv+9fDqFt52XxeueHdcW9cp
+KJK/qw5X7yRlyNyjJsTpZ0Xf2804aQyLWA5iNkvUAJ3vC8er3/nHScb3wx3hxucj
+2VWB5E6K5F5kU+LYnG/oXsBq7AFDi+9RGkZEmMuZ1OZHve/EbsUPP8suUqwHtXZu
+dyniVTKcNaVRW+/NnmL74i0WZma8PEXXSo47ZoecJ+pv0gSiGFKCgJ35NNxcHHoX
+jgrayWcJz2fZEN6zZhI6IjDbG0KzHZLEXuKwG/Djf/v4FrLS4exDoyB8L2bJx99e
+z+Jk6/sdyu+XOlNcYGegQ8JLVDdqNcaEGorZd2JbTMNfAqDpFE1/se1jZbwtZ0HZ
+lr5gJ5mY6HILNwyQgI/f99dc5SMlT9R8XRPDMF+gKSQ9TxT+05+JRXL3SoSqxnjt
++iMZUSMAstmZDvc8FuZBTgnaz0lMmFyIo3DjXNLXe19cJN3jkMLozyQXkdiHI4Dz
+LIHudy2pVDTUnbORzorkZSGi9RYvNKnPD0LDqaZ7O2Gv3n4iSI+CL9yLPxNbqWSk
+uM/kzNE0fpC6gLQ8qOfV45VFpEgc1YNbmYxEmcy9dYfKBnC/030pcWDVUjh9flZF
+tDckNXns+hlmquzs1XIJeAlHW9SoNxxfNMaK6Nx3ZrAdTc08jwp+l2DIdtUAOuZU
+Shz6NJWyrzNmGMyjDuiYxuvPPhkuETDCAPXgRCo1ZoUIXB3KIMFiEjuhJyUHuHXg
+ZWRe4Nf+g1pBD0J+rsUS77JDnDwQw9887d6wU/fMGk1VgNfIuWiLdS4KBcH8P2M9
+7yB4BxlsCO9DeDL38N2phiHPRcZFIg58K8H0ZmX/1cUivFP86k76BmLpqLPNOiu/
+s4YC0OEGlB7tnZ6i5ZYJNrKW0CibrfEl7PpXBC28rtPdw1J5aWKTRsCDn/Qf+dWn
+qqVDoua7R9xuPkoUoqEyAJ5gBHp4PEIlnKxxJoZa0J+oeNWv9BNqYyNym0eT1tZM
+QuhELwijjb7hauqFbGr/sOjxK/gEgSRS9arOmCiEdmXr5sh6SorvBa9Zq+rVssk+
+nuPi+QnXR2cU7kxbJR722k1OfxvjPjXJnW+pBJ2A25Cxz1v4CNQiX4x3e4M4Ep4I
+266tIAKwl+PDwUUEr/bzjto4Qoxgdlk8ZbBMRG3ax4wTI6eGF4JQbLc2E084qrE6
+7bg648HqUMtivNRpEZQL+xYXPF8ATfK7W6fixnDqJmQPiqM9hVHqq1Fw59DOshNE
+UUeV/JlzAL8u6hgxR46KXqrMb6A1IIKbz1zqVlCIViE9+LV3dDDu21ARn1czPTdO
+eCEcDFeW1CupVSuDOXB2hVotkGC9R/84qr7AR19KPkQBNf3W/k/unJH3+jfZntRZ
+0qClJu1Xx7Pv4nDrmjnDxJB+OuWloNY1AUNUzYYOWZaUEShmbX2ZRRS93T6NNXDU
+WNk0erVjQPWSsb/A7fARfDa4NvGxvG73M3wGRGMFY0XXFeeIff2q+8obVUFesmmP
+dl3J0QGIGdRlQ9tKYMz3dH2Pl/TBjKhcSLehOZDRKTrfqo4YIb/1XrLxIDCAs7xO
+/9wJMkCcacU2YIVIgtYH5d/TZUUMEcmzctosZlHVg4S2q9M6aiee8RrXJtTBTahI
+sdwiaRAN6Oqnxd/sdHk+HkQZ+ZiOKamFaTLt9q4NprX8EtjEo0xQdJhOVTFSS/2i
+tdfM7Na1tARFtz1qVN7FDcl9zDyJRc+2pkpCXxT7pWxZLHyJf4RdOCLsrwAumj82
+nPpUhxZrk0AdMneI8tRLRND9kaNZ8/AUf4leuayhm3f9abmwdLpaMXxbG04NL+RN
+7+Dh04KZydC452439RLX6r06USiuOIQXO2efV649T56RO0jlJRGhIwpHGwz5nE+B
+Bew7PR5k6CGeLn/YL4TbloBHvBf5614aKV3joEXkOQGJybDzYMEtiA+5/065hp+6
+wBlQEz6Prnhrz6bgOELwfdpqreLjlxU4XzJOyRMv43KRGGaG4eSF1EMr2cL6A1gR
+XlpykMhOS6x0gmoUeEQ/cA1HARMhK428nSDEHq2tcROiRUtpJFVeQaiIjCZLJ2Oz
+DncX1cXb7p8Vh5lqixP9QqU7b2Z4nGz/aPW1pLHuXIGpz/kJ1CXdQFTfk2WqQoQa
+5JVt//RCIpqIGdQVDQ3x2unz1//0PHbhDvnbuyLDGDVHQAKB5fgrVO87Fz8m3MXB
+S98VREZXts8RUXPqUQ9lY2F6r3+Qyfpz8jg25VtJa++rU3TYDn+4jpXGcRcdXRyK
+tm+BUQ20OVop3DTPmkKLfyk6H0eRXX7Lwyujm96sbOOFxt66/fiDijc0kl8S2EYC
+hcdPC6LSpwk2F6FH6Aerkg/04MasJyXxFqYEpHb66Km91XJAMjAqHaHYOJc8pTiw
++6ED1lmnEFTa8XqNDnoo+EjVu+AuO6LtavzgIclY+ocXn5N3Yb86PgaBBeyut/BP
+/1nH/aLfQ+5YBUm9vVq0wbbfe/CFdXoir3hafr12P1UhcZggt/5TMhtu5Mqysv56
+Re0bXxuBBNuhKTvFFkXaY0zrbAZGa9/9VokIx7u5FLNl18bA+s7AUtnczV7iwH4R
+PUq4+/eJbotRAkFBgpsxdlSGTK2bxlfc7tEyrmHF0F0ecRIaH3hbNLad2Z3YVvdK
+ZDJDQGXk4LArPtYG2KynTjaUmbGpJcQTlirY+XWGb/VInyY9OizwfSU+H4k4nbRW
+GRiBtBn6DcKM5MHBA40htHWChuQI7ntWLJuxidnHZeb5+iA4UaabQiwyGZdlq92i
+2J3PsWhCzFBnq+RXWRPew72ZUqly96BEYYvrLi1Gbm7ThNPmiTd6Hjs0LyqVkwWQ
+995XMidC9naK8Km4Mn0V571pxqn4NAf6YCzjAJpec3rxqVeP0vqi0VvdiwdY9+e9
+gyXs49xwiMDuXFb6cC8J08qHRn28B9+aKnb//qnsjxCQ6bc0a+Kbg6jiqh4BsNL+
+sgBbyhHvFkzbuEhWiLBfh5RJUq6RGTQtWbUZeXMT0yfHLn8WtYtEHUj2ljSAhlkU
+9MpO387z4fsPTueCdYnN+NcWgi86ZijNHWjVS4qTB51O0V6PospxRzROoN/SogBN
+NrtwzaepzUxOAhcYKAwROLvIplMeL0ipLEZu7ZzSJEekz+t6WR66mB9fp+34KkZn
+5UtXOg2F8DRtID/BtbcHKjsi42zXQgfxAnzZ1ThW+mp0QlX6C2Qa5bUZn/QOUUT0
+E1OuBnIvyuB8LMgxIRvLg6zl6MVuWPvu95RjGooCHFc9aXGSjepn87JwgzL/cKew
+uklUjyvDHtCLUJy455nKF9QQvgyd7GcD6tSxfnKKA4UmnUj3TvxnTzpGr2sqV9FX
+zxA7wp+bp7L/+HLYbNMNGeNntWp5uAvl6malP1NahqFL5ydARMYFWxJkRt4YbdJx
+ESvM4RiamZ6CxkmFPrkqTo9c6ParZ07VdTC1Zga76Jxa5eQGYK//tvJKgeB+4TkJ
+2xjAlAy8O9gPRt6L43d1d/1Egk+TesRUFOf1C/wXaX3f93uO+HTYkZvG+BmRlOR2
+klU6A/RyDO5CXBBogZSh6JeDwNU0EmcESjZxo5bpGlYTi3jluFJ2XdkRXZc5hAeo
+E5KIa4SoEGaMDayNSpqvxgX4C31vmS03GD8+a2XdPUSQ0Zq4GNIlNvact/hX5ERD
+MexfGp7ZeBFbyzQh8v5jxUVMprTEwCSb81lbITsSsqYP49+tFF5rCGSRRK2iQhps
+RpLkEYt6xk4DMV+iNBAtQf8pepIq329jiZ0xm+u/Oo9goukGxhWuSq+PVH7gu/oU
+ieufHR9jAzXHVH7F7WJZmfBO7tpyI8jrjjyT3Ym4585UKbGM370duzv9qLxGCA0n
+noGIGNjUsQW6hMSAiXGwjJeSwodFNaTfkstWRzmhJoUoXeQjbhQvT35Dc3hBuzVo
+b7bgiP9CaztEDvBrA7qElk6k+zMQPvOEx1kZxQ6odNd7ADXmxWrdc4MY/CkY7vXv
+N9UwlEEqjR2SFdorFlSxaB+UO7AFAfp833w1QsUUpEhY5FCgTR9wc2NU9aMe1OoD
+UPU6HAMgzGv9hhrTTpnAx8IPkqIf/nLChdBQ4U7NBFfj4uNvQT43vfRbsYJRqqb0
+/EExaON1jfsm8WNb4JJBVS9zlrv28qpAjadcpvtpbrR603dyyoj2SZiUVrjMXzQg
+0Au5VfalPDzPsz8rRg3Cq3Xpe+dXWPO0QU93we26MylmfIbcCpIwAxiL8FXrWRmN
+KpssAngSefZqhcURQwiCLXo0J9SkFZsqfDiXI7LmXbCR4CSS89o9W0qYS+/UHn8H
+TY27XrC/dQB+jdERsXcJLAP2/P3D2/lGyyi9N3lnyzPJ6YKK8UIAeMzVZQbUldr3
+P3x4K3HKbD1wjETTsVHcJJO8aVCHkFRrRrfpdcQk9NMKhVbEunk/YECXSjXvfuNa
+QJqplQ08fQsgtFWRxstu8Z80wym6GTmtz0TVvKfeEF9mNRU28mQbqtxMGMbuqQjz
+dy7QHGc0P75r6v9LlqWKFl1W3DCW2lcCU5qYaRcsyA9H/8LQWnrMLyVZ4GNjL31B
+CSor1VkyJoe/Wm/chRSLxOdr0XSHQW5wjtzGQKZzYNAEhjE2c3VDdLA7mQaF0izZ
+06CjorPh5/JlwSZn32Y8QN4m+VK4gM5f0PLnoU/KKuB0kOETGQpF/EkP/XHwMeZs
+qQZjTVNv2+6FhS2XLQHYYHcMeQA63eBC2DfW9PuKmHb5dbEdGrJYt8J71Q1hkV6K
+cZ8T80380e5as1uIg5TsajsVZ+TtxNOkNYkgmfS+p6TCtK9e4iRtH6onE+hxQ/Fn
+l04Ct7dPD2K/1cjSruxpE9T7TpT8NvDlQx5v333WEPgKgVl2k2qnzF/VJpm7gU1w
+nrPUN8ycIN6OjATby9VUPbO+xbJwKBaKy90uaj/nAoBvFN2lItpzhYF4oLhvdNFs
+M2uqkS+NxwCl7HFac6+jooCnkIMZjzD5vZV2OBHJvZvqgb7OxlyMB9/ORwitE+ji
+0duMqvGjHUlVtNJu4vPbcWCCeXcojoTGn31v3TguyVVuvPGd87gPlLve1sVWwQGz
+mUf3ObEAUootJrQqzpr6nB2AzpPikechRjA6nxnsfZ6cuxRFXBA8X/bkZnUGf8o1
+RA2WhxG4iJjrcJCEzOehVSflht+DhyMEobKkL+FRcPweqKBixLTeGCZ3CQuPxMQP
+s6/BSOBWfJtiiBeNVLdkYQCMXFuFsijy15/0gY9h7dBtLc+XYWXTmKWRmF+KOMRb
+JKJ7SVydhLzzH4wDDtWG6TZRrZ897VXwQGNfUhyHZIgDiLyeXYqaI/wyxrVzUe+N
+z4/5BO/QBMQq9jBy587BOUNqS1N1ka+MWewS4B3TpWosyybMFkQWxr28f/Fn1Qt6
+bi6C0R0rOO5d3gJRYTQ6UVKalE62TaCBHcf9UCuGgeClKSTis1pWKzWca+Qbl+1Y
+8jD7R1b8VjQ2FCFw1n9qTtDUTdv4hq9STmNPbnA4dFw91reLoqPpVeElmAJyKaSc
+Avz0PRm4b458xwhyki6uEu6tQty82AT21qN5hgip74GfiTLVktFSNvR3cGuyPTdM
+lcNFVT/UVDXgN1zYrAJJIha+KsMPJW3Y5QkujszBetIlIJ0fsBmAPeXUxfuFWYzS
+w2877bj6YDNS4q6U4iYHLsRGGddk57YkSblsJPGsM6Y94TXUad5cXD/OpQkVhSiQ
+sEHclFyZysIhmH6l0o53dytFLheCZEnkQKzoEeLDx5wL9s7sLtHMI3qTMzysJMaZ
+nGXEWp4SBIF6hVyg+LWkKzvwAGbYwAFS+z9s8zxHVtz9x5EsnSW/8qvFs/R/FHNL
+3EhUigDqIQMLvmMvCJrGSgY0c9QaFBteezGWJP6LF1AFHOnYWUp6SIbYk4tSEkLs
+NaUkSXlbT3RmyUJ1oxpYKIzJxJEHVZvlk80FIwTSwSyeSmGn013HLglD8NQLtuI+
+/F4adZZdIkS0PHbLTKJ+YtMTtoOhLOMLSrRbMBRQZeCwz2ttPCgxgzbnNpJjiP+4
+odDce3oGdtaSm7F9Zphs+6mefvp0XfyCq5X5LQpxDxVRSGPK6ak4KoWwnQb6wxIY
+SbNsE7CSXSfcaYfGrSfudAyUFZhg0rbQOGbsc8cytlzB4rtV6iuJXSiamZjBHT/n
+1XCELfSaZF+KQeaNAUPgVqX8qRGrY3Dc1mx4V0aXvGSvvUGHbVCH1s4kQOaRplv6
+V/VHM25mULNiWtOACyyJYOjVoYKJjiXKAddEW1/qN6HM6T0AE0M7mLCBxQaYNuEX
+RsfSzX5xW9z4PQJZQpAIpzVBKvKHkGK5KfWRlZl6QHBIbza096RkwcJsl/Gr/j4T
+cbH9ckWp1xXCWr3QXRBdxuR3blMKDlxbZQFve9xYPymtYP47nt4J6ssur2nKE9d3
+mBR/1a/U757fQ/i4fsWBh8dPKVTQ5r999TpT1r/yOaxCyHg9vS+Y7cL5EbKZ+Qzo
+E0iJ3NA510RFg/grI2RVIvEzPqoP1yyxKhXZKni6MdpAEtGGQA0OcrwDQAhxMBvg
+3O4AQxK0PDxyuEXTMVRUhxgsVpP6WZ4CM8ANffSBupmafortKsBvBUAyOY84OrJ4
+4EGZgwnqAiSAn0yWcKmk2zZj34FZkuBgWsimTQA0To0361cSWyHC1y7ucQX5D7/a
+pEodf11xoykpl0kmIbCb4gb9cut1+eKyzd6s5mDK12LI7Gfgx9H7diLSYgC/C/4y
+Qye9VWB3s7k4gWdRmH2Z5p0rSRfIEHnVvnmZnkdXapMCStEXiU1Eh6oQaBU3umCT
+1+XQ5+RGSs4MYjO6wshtQK8DcwDNTTjdMKZCz3a7k9vW0C05A9grFv2u7qSpfsG2
+8lrSYE7swTJ/7xD/wA2xY5wHS8dVfj1ILpSnqdJqWtdgGFNryoywWZcWxlKPJs6R
+cFYVri/+06ROXWBnL5Cvnxs8rt3wMkO5Ns6e8IU3lZDlYhbcKTK5nX90IH+NfWDk
+fem1pd+vzcvVKYjo7A69c0l0UzbuFN1agKacec7oW8AOnX5Aw+LVlG/7HC2IqUOk
+YzumEcrhGfC0xj3rpU0BGO3LKQHCd80yV6lnPY2XXTErhxFanl6BCmXcTErmGz9X
+cQ6rTB0O95I827X6SKGxHhsq3JS58FPr9ymwrWPj9J583e1IJ5HVajRJMpkDPjKF
+7ssEDxz+Q4mPF2pmf+lL7SgjrwnekDlLMH3XCIQ+Y+P4oTwI+yBXva/A+l+F1v4n
+tXLCEPN7NVGWJCeJJuxlwIheXCnwJkTe+QBaTkWl/YhwUuRj5M60xUCs6+r9glLl
+T3GhTTpRHdZh/k7veFpoFm5ZW0y6YM8nrcjEMIWW/XIzpIKgpveOzNn7Bd54y6xw
+IVFkau2KiA6DUAW8I3WuebKzAzBI4nHnLYJBvrM2wlp9729laCUm00V0yf6xukBZ
+zSdrPw2Auy5d2RkPIZyJYg/mcUDkm5U4BFDH6mDJkOToKI0swdcWEtHvtf3zb7Lh
+2h9Vbtt1Pb0JZHLttyDy3c+E+SWW7Cw8dw70HHhGOar6D0fA4AzZSYqQDvTBv8XY
+HphGeb2qxAalU6EyuBrr6rjP05n1BWm1gwadeRxVUbrS2jBY/b/N8XQbnk52AnTU
+VHjeZwAyQ48Fp3SSf2HIA1U7beI5xW3b2uFDDZyAbFZ6FKoMa24j70neI3iYa49L
+/mdM4Yi7CpLfjYpMm5IIU3em0fhJcB/4eoYnRfkpyPAeR6xl0HssIyesgcxiJuSK
+8z3lAs2fdeR2hOHBYdSUx9FBMYaRtTE8nd3J37FNiTdxGzu1eg8waOVuIa6EXeJ6
+sIfK68gCuTavoejnUL3Kf2/VxnmRwiRwjHdOoYUScMGo0f469wYzs3V03lgP8YZ6
+puPhjOVsMqNl7ukMHHOChCYSUgFj9n5gsbmXC+4dROeB2J1+vtuBemanyu/vWKea
+IbCNv2+98K95xpWHk6GQMkKWgIT0WQ/Sn7macvCwaUL64lKti2InBu3K6xT1wswj
+ViTrn+vnMUgKTFJ9Wte2RHDuPmcR+zg8yFpS1AEAPJcldfWDUbvW2KDhAA7OUwI7
+6aIkvlWtqKrF+I46lkKjPQ0OHZnTIoTy8jPMnZaF1r+d1UyGrDhC1mEE9GUHFK/8
+MxKIP4MJY3tkgm4mjplsTKsJhfn5HJzzHGu12h3P1qljEDE1xnKUbCpWkZz2nqE2
+DWYth8h/sW0H9nSgWmuDRpFF3vs7vHopTCMz4mgD2J93XqT8Meb8jhnhtUxqUVTA
+dNNr1y4ASkK6G2XdPrcxKOn52V82AjapIMg531KDFRAVBIYM6VmdjdTbxYj1bH9v
+p2o4KZ30OvTz4CdwIlRE0S13rTdZHdcOu6WMmlRHLIZ9MOPCUfaa91xdmE2GmB2J
+wQEg2C8ecpf+m/yNmhmDBZ6VXi2v4HkubKjIz+Mu0KYTkUZpoauP1yEO/r3K6u1Q
+RlfeMCi8CvB4uMaMvA1Xp935aaGcKFq8CPqxSyWOYHKZH+J3aK5E5+Ud3HCnFQvt
+v7fPLNp9k9MEkKYskP1euffcrFE13m+a3bx1TwNo2//QF+rCjefRQBM4jotwvn6q
+wCOkrry1Vg0mSH8Fi6gfTUW1qVNmnwLO4h7lanGgG/o+7cRqCNu99SVbyyGy0SE3
+m1ZY3KX1z2la+EinQDLgX8UbTvhjiJiTxjnZlk8CnX1qDk3W92t58UWzrzwWwFfh
+8Inf93Wpj2jmpW1S6BkgRFkMT4hlUPllzahNaR8PwflKjzsqdRb8Yzy7aR7laJBl
+LQ4EEcBL38gt/KtZcj9KoSGiE0X5isJflCdyQNzt4yPCnbjg/KjeRk6rw9qzCs1i
+kKF0YVV/LrlwnIGOXETGv3MEmTrM5GpnA8NsubwXRl+wgjaVo+T+zuI6jd2e8wmt
+u/QJH2BWULmNrxer8Pt/Ow+fzf3u5lzuBcN1aePJzDk2c6fP4xR4poJ0yzVUqS6A
+dcXLmAB7z7CxD4esRI9eLc4LQsGUf1hHxY+8ye9kqQiHDdYeymWi9kdX8zJ6JTae
+8A5sYeXJFmBUZ91UTBgaNr1l2WMYSutPS8UjZ3wvi0Ujl4OzQciRQ/cRAAQ4mhY8
+Rv++fGo203umdLgv7zlHNSyYIYn6UUNhCvHWa/AQOU15sz7vDAUSVd5OXrCNbDEv
+8vnoDpcH2XQeFwem+isPukzqgslwB0O2VjKAcKFxJADKFQhH1eErI9JC1BRnoBe5
+xy7qhm7Yt7kSBkWsy6a+HkejAanT0qXg5UfoBLSZ1LO/7yD8vfw7YTkAuo5UTKl8
+4vZXx1AiNM3SI7XSQdhVukej+PrvPdcDKv7STJZAI2tJwtZskmF9PufybseFMgyk
+06yDtk9ji+gSktI3RtWFlgUVlcNM9Mv4LRg82hUl0sr9OiryI97k3wiUS/NhAZQY
+bK4WBxN8Z1qe+bDWI5SFfLLndBqNYzyM+ikZiq6NOjPKfZaDXS0h8v2Y25TYr6y2
+axWPqMiFjdMZOchotc3UvxoUSdUTVG0DTqCrYELSsj7Jvd3f2wGUpPuuLM1WOQ7k
+pg8V3cpm4UhqyWQcriC5E8XUjZnURGubruY+GovQXO1ki40BSl9TvWyfqerFakmm
+IkOzgpyI/IwrnrY+NygCZwFUY9rrB3e8LC8j9XAKsQ3FR66GIj5/sBe/zRYAQkuc
+E9ci5MBHvrrcoVcRj2j3OonYNhIvZS+RjC0Y+cHd0a3+OH8UddETizN2k8Zx3EQ+
+A8/xzuvbAhTxQcSb+2WsK3tkLsmr/0Zm0g45kBZiWz9vvmmiA+cCSrO1CZ3UoD1e
+9vJ27cvDW4GZJkRxo3OWr2uIjPcgfsItG0cd9NNvfgVg7B+CaisICXMy9zk4FN0z
+9gpMXr0tuKJ+xuY3M8gQdFfvZ4zpAUMKo0k+jfNB+DR6JGHXTzSqNji3mjIuv3IY
+sTcdveUGZsEUWEB4R5i133Mf9GfJKDJ/Il4LciJWH3d+QOGSOXxMEdjMwGfG4KaP
+QOfdyFmxUoMpkMS7etMDhh8i+i14W1+h63g4DmuPd6Yuc2vzj9o1y0v+80M7FGJw
+y9QlOm6mEY3J5aG0IAuQLOnM49A7gWw/+HZH3rjcZ/rmutM3vEd3CejOGr6Hh5G3
+BFWxZckCIHeHFQNapDbD6X3kIxCQIJu5kzvlWMaB+aca6zlZ8gqlofCBbbS+ySGS
+jhGzmTEjMVOqu9p3lacTLoj08p98MxhyyT/WIv9u4OJlP+kY0WUsxJqCu2NaR0BJ
+6cUkfJS9XHAGolMxpkfjiqe30vdqBe53Q+BinF0GuaOiJFZiwuZprowt3zfLIRZF
+zMhuGwKNJrfb2c2Kho7Js73SyGhls/LeEZXg3FPT7tXOoCEoEICNRBxPoydsHvrW
+nCbmws89uu4sKM4DMT5M/9nHZLMYJsnsVV141hEc2urhM3Iew+4Gy5NoGBp7iOps
+tNfVJIAoHOi4zdyiXfnp7xtQB1//ujM1/vnxZg5aY2g1diXhCAXgLocMwlrhWFR2
+D5WZNkt21DFXCui81CiY+NNl+9eyvljXUZbATE/RVWL7inGByNgUK+lX2igVi47p
+o0SWcA3Kfe/I5CXwhwE38XW7ptcKws1oUGQtc15UH+rk+bZPeg4kwUQ6GT84Z4J4
+8NY8WKng3Xj5s3u+WWLGPeRPR1jxJnADU07ev6W7Jtoqh2DjerezKJO6moBqlR5A
+1N3V3wLxR/AXdC5u0L+jB+sAGpI2Octcz0TcXOPnf4sVvOTGtP5xw2BYXbQxgqov
+2+s3xZ44fz7R1zGmMuVPXrYUBdAn37P/GvdfehNWCBGtZ47/8wWl7w24t3u+Aa1M
+Iae6wK1w+kYtderUN6N9sn6deI9bQvQ58WHJQonPcapuv1IVBXZlObpDBxKYLaTX
+AKYVrGbqLRk1URp5WC9hscr3UfN6fc0G/r9Kvs9/29jQHwm9hcmLWp6l8jdkF4ot
+tRaAwZehXd6vQpCkYAHJ4h6QjHGkuqTIkqdMxZk2j7o6G7AQ6NrcCRMqOu0ifQd6
+Smx0taUmkz/515wAlP5j45iU7nNv+sHl/xZ5O+L4mrv23sCV6+nYk204W/JlCjzl
+ZLG+ZFy/BXkSOUrKu8usF1QCrfl3A7NLjG7ktPEHPwh51+/OfBroB6kVn4uu0vai
+fuIEOLsfT1Zp/+gZb3zyDurIAgNGNmQbymWjKJWeOVBKUcOkhh/nL+bedDvbG+VY
+pRA7LmdYIwWA58sQ5Y30gEqQhoTOPsA0wBVn+idIkEfPjtJaIstwwgyI7tAC2ofM
+TBwLoBireR3r/CB6aVlZ+BJL7IQ99Wu56gExOEgAj3XfU/hQ4NNNl2Cn8Qx+loAq
++WpcqnJ16NGttwpPC3KRn3ffbE7xNC0teMncNdG6MyPhZKHj304zC8HFodJ+DKq5
+H06GSovOZbzPgv3uHOmk3b6LUMwzsIMUaKOHF2Clwwv8ODvle9ZvxnLKbjCLrg9Z
+DRfa4dOW0x4rfyryVllhGlbEGqBurTFQJdYWkhAfSEulur9sWHbD7K+sgZ5gEzT2
+wFmRzApR3uIbB/uR5cc/vNAP5C3Onw+cYjiITgTOD5JW6lrpp/XbdWPJHOQ8iDy9
+uZ4xEPpdL2yorNzSrI/zvNI/puCKp2txkOzr3k81h1VmgGGK03SiVW84KXk+vov7
+mawHgvE2tnaqng/myMocWXH020HJI7K0QJZB37fdq5GUOPylejiQff9+1UwvLqv7
+pHols9RfGh3hBTt0N70uE/r1UajGRI9TS4FNoeVkcGZ8qRP8GnluOcBaHXn2qWTF
+mZ2+KqFBgF0PiKpFwoLIxC5Y7gZkP/vxknAiJ9poIC9tSOI8gu/awNiHcWvuLL0C
+cSVOeTp362MyShTmwRGdDFlrlNlNX9WQZavSy83slKlOO9OAELa0s+o2ipIepxLY
+l3FB+86w3TJnz8cuOI5wG2qvqixqGn3etfxKLv0JqF5Pc+pny9OM2MeRJU8Ocd62
+GEzhZwgwAkttq/GkCqRO1lx72SVw1lIy4NJr1okqptU7JfjNOXftRHlEoSWSWWKD
+hcvnhIEvgDD8/AkL6u1+M3sCN2wvxkk5a54lZ44W7cA6tIrQPG8ae4gWSiSF91FJ
+Tub6eWy/Zs5hIk9A6CZC89B2lgiOIgAuCwTKa2RQvo7wM+JQUakCVl4Jwz78Rzp1
+yE2fwuv5cJrUV36dDh/ns0UaCFPQ2W5cYKvd9JMsbujSUh4c2XalkBXpnSdyOsVM
+LRd0OecQ+DzIqZxlnF2Mj3xZL30LNGYczRpAZjS7Uhh/HPZ8L2PFGlOtHkDG94iR
+nJKi8TzLBFYLXnrBNJrMqR78kYA/SRHSxQk+s4K0Cu9qn0whvrqBem6nkxi3UWU/
+TTTfTMBSC4weoHGAlf93OKYdHHmmql9v53OG540jjiGHvoLs1P5MCEVBgzS6az5H
+MXU0DqxmDaAFqsa3lgmveNw7lxhidP4ksaDaQWtFW0KCcpUBa5AWtE9O75qNNuPg
+3Pm95od1Yyzivl4UImRzX8e0CVkK77xVVVQ2d5ETi0CBvt4T+FXMvdlzSSWYCIn9
+xQIX1YHUmkzExvkRmkgdovDvsQ94U/x/Wu3R9gHHv9su6sA6QbIAq5fzDfHM8ukI
+PP0URy+CgSlNc6qqcLkBOwwE4U4sc4oVsfqFSUxqHYb1KK4QDhKHOIG4axfxm5gu
+cvwnf0JwGyRntVx8P8TbpI2mVBeqhKf/0va9phsXHLPenkNdJuFh2et0RgaSvW8e
+2GFj/OnQU+Y3MNiQ1LR0T9604xTgIynYPK2IPlNtcPfVS2IJIGyI1TUgDGrpsS5F
+wP10OYyOrXJwhzb2qZBezaio4OR6dB7wxnhoEa7oGp/muMKRqfLXHwBxoIT061cx
+mytdt1aWBLMdLUwBuxVLfbboF5pFW3F7hPNvOteCSLbYsk/JwogLFUUUf1VZsqSC
+9sqzcfoD+oujLAQoRSf+35PHHcepWWvRB+4G8U8TSOcUaYOhsSbh/OzkWx92OAyv
+VQfMRl9YYs7+5F+lsnhv9dosAr32RXPV6/ADgcvU/wBn1bfeOgBG4hPSExcf4awS
+4BUvVtEF4gxr5LNnIct64fBXWmnzddtVv1QBQHkNQ6aZ84NGZ8eJuuX9eeV0cy5Q
+6MkefzBpDL+pDpEQLdt34dW/usADyLxZkGDMC3KjTe4rtZPBopx10EIM4wsdeGhv
+CE6lfQ+sOFcsrpYXeW97irlR2++0UMOabgMV1jAIPghtU2imyszwI8/xGOYNJseG
+B39YnNt+qPOzXyJBGx9hCYwou42SvhoDXc5GFFmYuUAJT0cKXl5ETuQGr5j5nOUj
+7/i3UrOO2OTuwojICXysuTmpnUFDk939AGa36smBBqnnrmj9owCrSVlZt/4gFUiy
+pY8rvv5tlTNLE5zs4wqcwn7iQ/I0SCu4GD5COD/l6eAqpJCDYkukRJYlCfkqfLUl
+U7oY7Tl99S8eq30jFKA35CQzHT8/+nBfuk0EsyazZDIX+eGIcf6pWv98sxHX3A33
+NHS17kQ4SiDOIzAnsabi+6J+bnnq/Dy10JizDRjmAPHKje85I7UUrPWNqJH8pjeY
+RzAaMAhnAVtmybuonuPHg1xrfJxLyYVQhsvUFjPFOZDPxoi0rM1SZTSzIOPFNy0W
+xKgwqy31fxipf9RXT/DOGdE3ETc8Wcf9I4KD3n9HzUlW2869/uUb5FyR7EOYP/A3
+EbKKCebqkzWKZjbNkScrpZ5yyTKLOEp9Gq1jIIzdq/uBICnwLNbT20NkEIov7bxu
+Y6zGaS/TNzfuyatbWTWEz0lbmpq4RHE3JnLHUJnHE+aNJe0mnSE1/jhcwPVHVg6k
+nYFYeOpahw2i4oQy00mePXKbUzc4VB1LQfjBU0Ik6HQKEpJ7/dTwhL2jo1RqVqrx
+VOywtADxsZB4sIJtVpmUuM34rfHCiRuqSj8X8jctqhThYdEBzZbkIHb4u7RI208U
+gUk5jaQ5iPdzL+jEtMN7GQNW3kZ9Vz3WK7yHVbntzFiUwjUyr2KoQq7iGbj9TnHQ
+XZmvsPW08hotyaCIlBfmHc2QYt5x+H+N9Xe1oKhgumUWZIGzq6jqSj1rO6qYwdQG
+kZ0NhTHRZaKH4Be6AYYp0zvK+TeNxKQ3DwhI+Po4bclN++JHfIhhiMMZUgH0mFKC
+ao0H/lS+Yx/2V52De8crhVJwyowOGJCKgw9Reb2pQcoO0oIUZCTzjeUzSZZWYuj7
+9+ylY9PrS7kNiI8WvGHcYzHKndRoVJHHUQPcP9l36R4R1jq2596C+EA5h5cumt6X
+Z9YDt2YrTFOX87F+Uftye/Rtrss5+PMtvZTee7yhlOCroBwuncZ2FkE5RqpsZ/Ar
+Guey6Bmue1m3hMrGjH5Je8WDErE2g/diGeaD6D4QHs2t1505/duzGBe9AlJwYj3s
+ojPwk5daGseoAIOCnnnk17Ty8ulaFpuuMccJmFIN5EzkmGIiRhfXiFvQ0ilcc7YG
+P02LUfyQKE+9HWueMFsoW8hdK5Zje8KcDNwaYVtCA7IXb9idtEuFR0BAI99MDV43
+U8VdENc9H1N4URRcr6wfc8/aTn8rFPOTOvNxag1GjlilzPnqfoqxupVxVNhaAr1a
+5y3+RKa2NXx4TcUKhnAgUtRZw2QIv1IvDJ0pEKSe3WtTKU9u2JHVxHd2hAe32+Xw
+fEDX0CB4Zx8+lWtpU9Faf7CccoJB346J2pm+NesgAaE96EftHypOZnpg4SkmJrXF
+t/HakUbJ1qMsglxu09Y6rvA20ub0nMS8mxhacmZQImVnC5Mke0g+WsHPpjdPwiIW
+gZ0h1N3dh1OCIjaXj7kORUQx7I8+bTGcOBELIvXGK6m5bO2JMgp9yy2jGfdU27kC
+PKV5aFYdNswCR5QzYnYEGkiJFYBYOU7La3w39+wPzh7KyCqiS7ASlydFZe6IIcSo
+4Sx2RPNpSgf+LbPbVWHmqASYvUvlzllUl/KS9PhLAAlbD/4/Ex0Cnlror1WzjL3G
+FhaeSJQ2oWOgfPl9LrhV0ZaTWSDnqa7NezqP7G/zypzQ1TlW/+C21d8lZr1jKxoZ
+qIc3gQOYH3iNI/DFfv2eIxASj6rRPOHEobsUvKZhbSHVOnIJtGbIMS9BysFFavBE
+mf/QKdmbSgwqlfpaWXRsjHGwawWsjjrIMYzeelFY34Cc0p3Xu5zrxxo5DyhKwSBt
+FDIqxYyusDfiVLxIBf8IEAQ8PQQeTMM1KWbqsofpFtf9Ne5BRG8kMmUnDJ6EJU6E
+mDGG4S+26D/8ro9+BbtIWNdXms6ziVIDL6PBHhs94gBJUWRBZvrkWPcRNtZcHNqA
+wCVgq25PantJbtme2+FndecyhskJyOQVQBDln3jLsZ5UdPs8+JEl84Rp/mne2F+F
+iAqOevIdX83Hwe1gkr3RuXTJ2TsG47iBIhen++DrEFaILnddIIw4+/SBPlIJcapQ
+1dJiZUiID0kLrSvC2P/GSJ1mFEGnw9ly11yQcTXO5X8NcaeVPNgXox+rlouH5VeW
+mbjYVYQmo/wuxEFUHx7Koji14fPTHqJdqgGoUKnQ9oQ9orWDNSYkSziZbkQpLprK
+2U5Vwiuv4UqbRKa52BbqWI5wsWP/wbLQKKUIbYp8DSFKBeajz0Odrm9zNrS5q1bl
+n/t6mvIjlygtaO6hMxbEf5hOELKFKy5c8BxgPMfOZXY6b6skUqrUvaWsuj7Q3ClT
+3wzN7OKbX4QbpXtveYOE+BbZpz+75KKRrYrr2V84XwGncsZP5Utu62uFnRqnhnc7
+Vx4XV5QXmsswRyoVFHEiw7wi6fOnQ7vLtMoxlyQzD97dfQPGF6imbn733JybRGAr
+t+ehrorVzwdIzMAzNQJUF0I0znlH1FwaFcWr6Nvr3yidIwcEMaQDuaVC/W3yo9RF
+qNWWZ9o5NWKkHThq37BGy1ilJoATukDyCqpq+3WrspmODkjKZyfai2E/IJobQw8A
+BZDCi3Z8IHnslhbaG2ryYwcUqJ+6ijKHVUHXP4AOXAecajCGVEY76uks2c5MDPci
+K+4ItR6BLDoOQ97Z+S1rdUH6m2yGnMSqfdpEQzYh1SKmyBxW+jU1M37pClE7GQsl
+qOL+lU100sT6iq8rZ0p/g5THGI8iWCN9NaWKnigrkJl7iN5ndU8TgVFjm5IlWlTr
+0IsWzVl0YpygAHzeETShunVdY9XyhujdxMUchFm1GVtcWjAjg54I/CXRCHOir65z
+6Db78B5EzHHKQOLAA/bekmRlrS6tPiNqwNmgmKjuzr2EprhTJPrKZs+L4UVO08eM
+2ymnkXWmItgmBkp+trLgQwV/XvLVF1wSyiotizckg+ZJzMMR4+0ZoAclBJwmeDZ4
+zZlLJ6SbJfPVd6WNXbZPI2UF7xAXnwVkkM/p5DyZVDs/5oLahSjJ7r8lPZ2LKW8d
+/8WZt6QzGvcIXiqUHJDY8k+NmmQPQV2txZqc4/rOZ9T8LQslCqSXnTD4ei9MLU9g
+z6PGxAYKtKxQ8nC1VfsCnzpJOc1CoqvqfS2Uy++8gc8VK+UP4onp85Zse8T3EoLe
+hgQsgcLFHXoL6MKOsV3aUz1+PogH+SrZK9MQ+ZQ6JrgPlj0EEmgqwx+W8io2yjSH
+fc1V4LZohCcS/UCqKn8nBuf8kHAjM7xt4GH3YZ9bvXmony902zxnQFwpAWMqGrfq
+x3LwWsyB02WDJ8k5MnbSyT1HdYZNPSUzo6vZw/37tE6/oNZBzJoGrKUwc8YTDeoU
+JCdBVQRm1tWqyaLvsboXOXy+6K9x6i7rh/V4xmMQNNCpYqcEXuZPlha0Iy0JUcTm
+T8I1kq58bj6XGrXVTR36G88P4DbidrWOwr65QPvR1+4SQqbd8tkyuQjn0ZkHfAuY
+jVTij4YeN+RtU4W4JpRhd9zj9Poz9klwD3/wkVWu7duoejVwgBGCLD2svdC2IcHd
+WDzPHLdiA2eXiCy8SRQmS2UFBPnXj2fEhomB4RAXB+ijfKEoShca+CeT00xUsRJy
+/5F4REntWcSy0HFMfThivi/Nz+xJAsxHMd4ai/kVmnoBygZ/xOI7HVohDUJyZnSz
+dG0PXD0kDP+yOlf26OFSw1ddqpaKXgdS/9/O8eNhjiSaPVwD4yRXIcfOzMEVFm6J
+uESQa8rAbtBqqSqaqKyDeGl1n8OXwT0SaYXQnskuLn8EogKpyWjCyjRDLNP1dE6b
+/68n0pqHq7EXLF6tW55jjVYwT+DCbqIKfUC/ZLMzvsc3MUa7D2nLKL0C3krCF0vK
+NNhOkYFchBRthY7pZgZuU3awMEKkhFrVg4VKTTzIF4De7Y/ZsIaLYiVsgJ/Atc7Q
+DjKgNJ8Rx1GJKkOMXJ3UP0Q0zLAKGopTnxmFqZoukINeaUwMIhgunFjuUpa47NFS
+cBf28ns1JY+U7oT2XZBGWLnhcfK7MdbT7cIOB5Ci/XDFj5Oyjvfuxlh7C4pWGyvd
+1t06OKO1wJygSL7wa+MlZlfXnMZRJ8pzw36vOdIRhYNBguRDdSb5Mz0XzcSyCQnu
+zWGVyO+PhT4IPtiGWEa+z1t8cbywPDMYvcFC68TDw3zZk8dmWcHm0WVXJYoSjKiL
+reuVUQf8YmmxuD+e9UX2M8TbBrJ/RcWKAGB1VHJxolD2Zv27wuYIY+SHUmwY5dbI
+VxzaK07xOenpgRLwU4EwlSriFyoQQlIA8O1AXllEEY703c85x9gJMFd4rYyfUemC
+eDRf8ar2pN1qwsDuu0Hczh4yBQBepm5dKaVlGtTxX93KaRkKfCv/xyFUND5PI/o4
+rfuNSePmcMLiTWukO80LQSScfUsfOMMgeSoWGnUMU+dBzzQMU5nC5x9HU6oaiqn5
+Hj8TAhS8MVvpuktsSOhywh8swuUV/yWV0dNkVueYvaqAJ1wS322gNRFInxkJ4CGa
+RW+aEsbmZgzJfmSmq/ZNLEOKLf3P7DJc/NsEiAko5SNrZbM1Ef87SVvUiz4C6ifY
+bKRtWG3p0haosDXcCBVrEtBwlVy/NKK86J9q52/DcbyuCCnPSqTHfkNo2IClelcE
+GCJ6azMFdHWAn38iUsdDhOczqKcE/TUjPuJdTC+55+kZzxibLldUIABwCvs6wCGX
+WGVtPA030fHrrW2mHfFK4zPfh/yuxUnaHTZzqVBrwEH5KF9VsyL/iaLbB4nDC1MQ
+aQ0Fjq8kriMMlaV83PKb+Rhmwdr2kk4WYzdsVyyj+TTAJqRNTQaxTxq2UYFsexPj
+ZIyUbHhWFLFWG2E3AYm1e6WcHh24F9a1zdjkCNa2ynDeSz9Prip9Vl9aib/nD7pg
+oZ2UQ6y+X9XPodaKtnCRGt7tXraCCdAbP4nGbE8UOBsh+ZiaYPjAk7tqNi85GbLd
+hnTyOrovIMIf4XPhoZ0NMuI9WvBmm7Y6+6sfJhP8m/PQaeksIAD/5SVaMak0AreN
+OxgyeegixrtfmlMnYwYG52Zc18WudedqUzwDwRI11BUGTZyPhw5OlMZ4Nt60O9nm
+XvMoLa1nK/g1iosr/1wLpfky+lZlndV7jfMu99lqtXsu8fn96bWk90JQnnU3+K2b
+PMBf5E/rxZ2L9t39f7HG4jJhSS4rqF43mABgi1Chekyx4Y8C9w4swIlKBWumpoWp
+Fmgs6CiptmE2LSOGd4AydNiCbN9i9i0FnqX/ArAdYppwKj6PpuXKKR6VgJ28T/AW
+4uZvIN37lkH7IJr/eO+pdPZ3wJ0R7sjppNZizBOBfUBEd/KB125NX7L08QFX04jU
+AWne+xQhOjxJxTofpNPbfIfgtjt7hea1vu3F6u8VWDs9dZC2FtIWeBPnTNFmOFMc
+6WojksB7WV5iRbd/GWOIZ3pV+GLHAM/N6vh4tBsYR0/0B3jzcVQf/v+xx5MbPlYg
+/ROfwjGilK7r/RKoUYwKjLaCwGYq64FzYZ5LiO1DWYNmhA21vrkVQ0QFoUehpvbJ
+BaIyOjRbo+QIXBifwUcjuHwr81S46vXarzqVx80sQ3ZuYekcDnu9U6KUK+twMdDR
+4bX3i+f2WLmNmexj7QlyFixs2y69swG6rM5O/OiXP4xmftXS99C51XPb5dS60tkt
+iTRgbe9tJ+Ep9qwuChE7iKxccB5tuu2bYv/N+XxHs7TId34vEKjw7GgMz/0zmQ2L
+r5dDxf8UjX5FrahYSvUmh3u72jdTKmNPQ240GFQDJQidhXwUHBF3YF8sogLz/rBQ
+4gqSP6I/NwAIQ5JDG8D/AyKvwPB95H61NaFFQy/vHajIt88Zl11hzYNEPp7RTutW
+XhiaFG4TwGDaZfAyj/NGjFwtCn6YSDjod4NWNQej12Tb/JC2KObfZz4R3LuCAzJm
+ne/2zsUMnSkhWFIbT8NwcJzwXZVQk7Cj67+c8tm7QFZBLPqutOEKOKNwDbcOo46D
+/Epp1kpu7hSGp47jwbUBpk4Hq7xk2ImOf9dK9yx6OlC0XKaX7Vn/6b6KMkGWkjbi
+d90bRDsCIyVzuPtupXbjAIHReYD6irCn3cPVP1BC0ptwc1VG4fhSGaBQB4QFLwbQ
+H5AlG+/DHyOS0O1lKn/xOojt0gLKqx09IYtpLAsxDvPA6kCm2r21MQNqb9qJooYI
+Uil2IlCqhWu1+e+QsFUT0zQARLkJX7WOWsmkXYhZ8HpmBEstqXXgDSLhsakpd/WX
+Lj33oFA4b0R6bS9crSyI8m27ameOEP1F9OW3/iRuy5W7BikHIzDtveByyerxJA7A
+8IksT//eepDm2jZe3nAN7L9fxwCp+ZKTNd1FDkmV03D4T7mLpHcFl2dkCneR5tuY
+5NHiAVTw6GZAWmmptUJgsVCPcDw9ONEAYKWSC69PMPTv57BseDncjmxbOyYSa2Ep
+lV/7pT7JvVk14y67nJsk6moeKkVG7VE1Ynz5bPH5DGT+EzEgTbkrkaI4xLqrl0yt
+SwHrHjCdSlBh9vP0btIumO0hgm2PbKx2HOBFZN0NK9e/7TIXk3g3V6z3UDKRRwra
+MJWfJ+EzqytBPEniC8KYtuAP4Ho8Rd2tsCXxSCrVR8nAYLuGY/n+Lpl25E7GD1RI
+A5Y8MsdZgi31gz5oyvTYsGsCMDoz7rIqlJRt9JFNip9i0DmJiA3iQjmp87yUmPpz
+0axwRQ27xgmWmIQpvafWaK32Y58AM5e485dyTXCTD6XgiWdqtVQ1lRjBNeUsPqE+
++Q1NU113T2lXjmCkzLKXW5MbL+/z1rlO2XIZ4oqVlm3qGls++RfISGU0DS+2GgDO
+ztGCxRrjulczo0HxQwCIiUq2Qs1xGzadlACu9NZipD3nLLh923N0V+2stiaiw/0N
+oJkXk3PvbqZ24CJvstoH7Q1tnXFiRY3tecdYm0Fa0Posy1leusOzUMYzOou+zpNg
+IGPOOmekHizUia9oSXzTAmEP5JuCW/i9JC7PeH81ckmuWrVYZAEOseckRZIaMx76
+N89sa3stRNRLZvMNOqSgccOi0JevADqLI2aVLl5AYKV091zJhqpvLbgMMd6ZTRrN
+1Lc8A4fQR6AX2y08RpAqtRviZrOHuNjnZzwyfFwXKrwSm4Ub4mQAge942bsN7/Pt
+Du992xB+rsVrcTsRi+L5MUZCZGmqZC9tUItoCWMkE55e5J0165zm6UgpXdFGcXkM
+m0NaPj3XUZ6DoqLjQE9lJJT0vwjvxGaTUOg+/kpfgMNCb7ECyRGtp2k8pW7EB4S3
+Wu01oekzfzAketZPSGl7yGCPb5r5SOIb37Qw+wiZ4LcdrwADkwDPQdiRr+6lzNV4
+69PNVy+Z8YsC3N6B6lOKw5hYtEF2L8oaXJU0ccLQm5yNcKx8gDVMjsUjm4hT27zS
+OKq+8OmfyWpYdnOrdYntuv2iy40OrJLHfDb1AYccHNGVMv/aKzjZz6xGRZHy3nAt
+Z44LoDCCNpkvRaKdI5gsGd+lo2EgAMrG0SCS48vl5wslqQPupF9akPtG43Dt/FFY
+pLiVm6TJDIk+05DWQfqb9F5CnU1yoPcShwtIIhsKS56C96H76SevWn2HtxRD3MPc
+fcEO2sE8oojlRlO4L41LUymiT9hgQCzHuTPWC9tKWxoNVLVkj+Ak/qL+ZzzWj/JR
+ScRoeXDrcclp9jVs57E01WS7P3lj3pwbwz1ZEia1Yr35C7MSYWt0jhgU4639SEPo
+NPOiyb4PV9u5g/+clC27ZpdFkQbnRz/g1AhM5us8q9x12DVCNgP2MpYTuW4FRM71
+4oJn+Sk+vbTgm+pRNOWlN1o6AO/TYxcNzU3Hx7l3DvaN7FLu329KUj3A8unBlJZB
+hsEDeu4erMMkTB6qa+iWkMe/NDFXwdl54QJGy+uHMPHt0NaWCPLdF0ojjC9f+olc
++qfDiw5SzubAk430owKC5S8ec4BN+uq4GrUH8QBLhIuiyZcaNHvgf2hGhJMjNJJA
+6r61uNrph9Cqwm14kJjWPdXzGzk/YrWSCALCKmjVntX4gUSysvuqdro+qJfeBI5w
+nVDDk3XfNBHnu0Ceizq8AFROzl0chVjYkUBF9HYZmrCWw7dRsz5EZXHJpsRJu88k
+UxkgxQn1rBsRf/GLlVKCl+qhdpNda+B0Ec82GUEyvlacl2rMFpQJV+sXoz4sK+CS
+d3o7bUlLar61kX8TmFaW2Na89YfszjsTJUyKx2WkE+69HEO2Cx0SNZfm5JO+ICWG
+ttW+XetETj+M8ROlYLCXlUn9ONhXEpA8XYQJSGS5wC4S0tkry4ZHhR4JVsUqrAJE
+4eaAZJLiTkhdvk0WXMpGI825YVkeL6QRK3VtvEQGFys1vI97QHkxn5YQ08T736L1
+tgLV6/EjnZOPB46D1bTk+ihwjBp5v3gcN/V6dvhxWVQBggix+qYZ/XSUOnrT1Ff9
+cTQGgrNiTMV7HAIiUvIR6sd0WQ6mIz/WG1mLXhMWXQT78DMFHJVw488Ye21SpQCc
+JZ0SL4KHz5vBRXjBIha4PHJELHYlkhyQwMm8gIFIXG/v6Bs7BuLJSDEzB1n/uJed
+xuOLAV0yilR0hMqRK30r8tuxF61a/KIrORU+8qRTC6J6mLyk2/TlbOvVg7frLn1+
+oQPQPXxTSBZVJCKryj5vuWLpoEJI6pr6dzgKYLWu9jY+Lnh0Gk6LMpLQXGL34Bau
+lwl9mkmFQn7NPJ7fSfUdrhnXnRR6uye0mpwYDSMmmfDDVP9jYRZw80wbbtGPaev5
+6HANGQXJyaHQ4EkcoOrF4UH51iQRsaXFxuWRtuJ9t7pK5uKsKgiVu81145mipsbA
+FLjRfqQSGDsXR6gPNGFH81yh6OlPMa773DoyM3YQCd6lCpBT/6hNXJ7YR847yYk4
+IiHT+pS5VIYH3j5GXQEbr1HMw4fzjG10e+p9LKYAcayhR1Vqwl2HyQzOQ8Rhewkx
+FKG676Ak37sQkcEoQHpYfV4eGmyqlPLmrCT035S36vFaCT4wJkZlN1Zv0mZ/oqfu
+cMTwPjp3+HiSXbYj3fMvo/0v+xVTk3NOnt1mZ4jAcH8hLKPCGS1kf9Ul1vxilzx9
+WgysSS66wSkDHQ7lHEXBJghcpfaowmf4Pcbx2/KU0Gcp+vi027Lwtr5PsTuB4OVG
++adiZ7332cAyb+9TVRsOcvSNtrnwO3H2OgBzhcFl9yb6nrLAQYL+wE2nsWXhqvdL
+OhtlPGqN16eCQd0eEjao3K9LjYUAvVSNQomnR9rT3t5e5FUUBCyJ+YdKwCjoQovZ
+80/Hs8xGBbZd/z01V+uA8A3OYxjNK4NXzSNFnqDr9qaw07+YvsAuGbrn07gnwLRI
+WAmgKgWzB2LV80KabVBrqY0zFUU7aw0bnk4XIDFr+jfB5TkdkQVB9VTi/1qH1blq
+PFtaq7WqvGzo/G82ILBrZJBEAWSb1vEQ9Au7tFYA/cgXus5SGCtdx5a2/ZMU5fq9
+U3SlmpSpoKbhHtLbGtUc8hlEE4kIPZ6O22GORXC7MrYlXnQe/IkwdzWn72IRHMzS
+tGgZ8p6pZ2QKEjOA6ChNPG2N7bEPLuXTN359u6Ne5ThYMxwgMESvFxA3UQSoSkVd
+0k+yInCptIid9gyoxBSJLzi+9iGCr2LmO1K1iy/bIeFUWfNFAJPcEfNeDsBWuu1b
+uuaaeOGpNN/tVE4h6Yh8/on2cyiq2Mc1n/yeAxbQFU7xPr+YeuRDfMmviyNpm9BR
+xPP3BmMd9kNI46COqel03lBsS9jkHqq1d+Eupv7n3H5cUVYyh8GFEvrE7o+1HdWa
+yItb563arUEpkcOCLIz8eeX+6SKQO6tPx/N/Lo0c+knxIv45InehkzC4CBGpg1MQ
+lx+ogXA0dwRaZW1HRi0PkTLQTT9IUdpToXA2k5GTfEX0MFdxuhWf4Ig833LY/6F4
+PAi529OdzRmOZiqAPzzjQ3uWHtqd4W6LX6/vYOUMzYtwb4g3pQMm3yRfoUuaeOk9
+/0fe9WzqELB/siYudgyZf/oXX9bFt4bLA7bIfCZ7aJnylsfzaBMq03QiCe9iSBa6
+SmRQY/ObUwXQVieBTvHkB+BJKlnIFOztK0XA6P0MqxWrDxv7I9O2GPjJhr+PDFa/
+p0A4PWoVDUaEUlLQhka9wGpJqpYvClfklJlYzEYlXLEq6qloqpHbN2EGQcQaT6lc
+n2FZXkPvEEe1D3EZqgTYmPUKXX2lXvVTt7jHFfVYbqtilqt7Ey4BrWE46z40dY1y
+yilN57HY3RXyxm2am7VwPaL7qjIVtUiwt+9pSaJVb4E24veLepQvAEirSJvpxq2Z
+CeayiKh2tNrhkpHrRIkcYZkVWfRBF+nZPas2lIzGA4hch3l0ByJ20uWASTjQNK+P
+6LRpqLGgAC+W6SgOw1QzEt2v2bsld+RbaoNxPeWkEX4OlToXOyDPtOAKUylsouOS
+KNrMxYZIN/hHxkQYkCc28O2OaoFLBA0pD6nPT6R1HqTda9sWPcgNTkWvriliqVX4
+e1JWm8pOYmf9LmbqbREZY7Bu51kOrZY5h6CS+JHQcmgEA0VQObumAZrPo1c6AQAV
+JhCnXFKvmfocdluaNihSYw4upwIlHCT7SuSl2rRSsaLIdXzh1EvYhkN9pr/dbR/5
+IKezsVzhJpMtaHiztcLfQQe6gvQRza6yxd/ws6aZIH/tdg8hEQYhzx23OX4dXXWr
+BtepNrvBKPiIeIEfR3I1ipqyAFHf7jVeLjeYWqq9B+qvgrvOzzKJGZn17ycNEtq8
+A5PWWWt4gp0uhqBPvp4wDoekLf4Ui/KN7o4nvsI+W9EZfGHrPcg76Z7MsJedTofH
+KCs9f+z9E2fXYDrvEfkmNYYAxB54LEnA2zh+itXltctjEBNMXsafNgINhwB+KEDZ
+4AFLXvTsEeSdVrxBbZYsbmxKHq18APVu1AlcWchmlpdwzg+sJQNpJYuP9wcBw1Mt
+tkVt8mMjbC7cFu+PTpK6zdaFWugLHpslFhJI2xe/V5H72bObj7V4+Lc42Nx3jPip
+nwPT74nhXDk+k3DBVt0fkKxN3tPVRQ+QuXpQ1UpC1xKwmsoKIbq61VsZQJQ9hzEf
+Hrc5LkSsxng8NbiHXVjauqogPP7a0S4TS4lUgHCGgH4MHA2pGkjC5QWFo3dCbOUA
+8Eq2gtz+kMeB1/7V8Lh5tzhjJe6mYDvmScgkQ7g584XOXvSUEHoR93oG/5Ewb8Zp
+Dc7UDKU+ecrKudlcm/Ef7Ed2ADPJyOMN37HWG87HbAHyhmAq99yIDpYvaWpXh6IG
+/dHcQPlCqUAlJksObZsp3n3dg5GlmQFz1/YCVQFsSecNA3SClVancAf3b6/tGf4y
+WyFwRIbbKtA+WcqreG/8AwsjvuA+J4aSoBJZtILN8AbEayKigMbemuG8Uy+cpvzh
+666LhaUKi+W6+PxMymjef4m38Lyp6Mun2diMmKOxBib6LMMwdz/bylpHiNm7vth+
+Z9lwxuikCeEWdP4Ngk9dUakt+b5picI/lby6AFmiqDuqjGK23/AaOVMaffYv5O95
+VXBKXHZ4nK52hdnHnKXeHf+i36Qvv67+JFiyWvRiPc6CGM2FVDiaTjUPzhjgMp+C
+5d+trxCHGSfGI4715B9HDzYZ1kZn9s27KUxHrqEGR9ic5yy4D8E03OwLX64zaenh
+QiNbhJ54YHGWkw4T2vqFB+Fe1G8VMUyd2xdqH71MhLDu2ykpazP94lNnL28zpJc7
+ElHZuvurbc7AOd4fUkDMYDswMI79h6v7KKMOrgP9n/IF4G0SPI9ohEmPJXhXeOZR
+9pFFMyvsoFEWdesTwT+xj8RqilmCeiYZQMaPz8n7o1aFzNvVFYINIcpc3mZCQe8b
+lrCVCHR8KWbwDn2WZtVFhVYAAu+xoQAWqF8Hlc4a2RvpE2jGJ28IFq2nqxeo5fUW
+kAYUu995wz08CVWI+N7csgQgLRhKluG1e8/wMSonPwrUHjg9he7E8hKQnD9qkchf
+mYbNpruNqbjUa79NtGiNrA7ywB0FE7ZWnf65rsfMYS1rJURcyKCYshzeyrANa6hr
+MV7yzStcPyBIEH8k+pLmTvG1HptIlUjWARaljiz8N+rtpLIP9dwLtWdN68DQ2w7N
+pMjRPxwkz46yUQWyqrRfV/N7MQ1aTmo0IpwUF/UiXiqHQi+ZcCzroO508C4aAzi5
+4F4kNyqIZNJz1htp3SDmkl63ODfp/mDSLm06xQnbvpPWw21Db66D8LDY/KLVDCKF
+2Ioj2KlD3c9mHOzWNDzwuN/P3DtqD8jEqld3SAuJAb3n8U+dVx4Yh5n+JUJDGg2S
+U9CSF/SxyIVdHIzV/oGvjNl0cexemxJdUjiMMXu4gT6gkucEPnyBDRTRwOWRahII
+EfWYVYZXMh9eO7KyKh84d2rQNF5rsYza0cPxcIkq12jhKjmMJE/uzeRO8c/KORQy
+U6XJuXdGEMlaCP6TeJzGy+qT+TRj5tTuBWjiR7LxM6RhSez/EN/vvPPTZlUvnBqZ
+m5ie2K6FGpZHBNY5Zd17QR+KdvYqHvDhc6Bz8HhGIAt0GWs9kfvSwedg3PHtPwsa
+o7fjCALUaHY8qIhAqSuGOEfFrPKo/PoRY2Gm3kJxt2SDMxjpO3uxDl3L9otuVVPc
+YQOL5qP14RTwOr45NgYBc0MLBdieBDD2uIpaIqan+DElHv/1kb0VijG96WwuoW9R
+MLLMnELXgA6W7+pULop7A8UvJ6ltKttVZ/Ce21B/LN4oCdMJehlLMbNCERlJ7+uJ
+GWQmzSO+IlUW42xFzcg3WES6UT+tT8qSlJRpD1IcPCoWBSCliPcU5v6k+CppZ7k6
+GHrFwTmvLyA+3Zv49w8j4bBYBtygiARTSPu8ZY2YzXM4u9l5CxM6Z5npG9riLs9W
+hZ9HSHURvilDcrMg47JFRwHz3NFktF7X613WJ1xOrqe7RytP4JROQThnAQcEFD15
+R1X2H5V1PbWCjzJ9MAvrpN7fl3+i7l9h5cfTmIujrAsLrDdA0cpzcTCDXzMng9x0
++aPLRwAXPL2C2vi9ct5+Hnf3oC7uz4Au54ox7th/ojl5IOgILG1fYXyg5S0P1qz/
+PCABputlHkAvHNrtqQ8qBRlZLtFs6ZUdtGHb/xV9puSU6/9MQS0+XfnVLDy7na7D
+jk7cAMe4XWp/sJopc9yiUjUXahhSILNIaI8ieaaSGgZeLvMCN48z7/i9MYJBpRuE
+6SuPBkMPRyVsbtJX+qVqjgtMNaCXxQgEBbAvFrdAxGvHdn4VG6n8xrhp00JesmRC
+89X7b4b/1wnbByGDW4oQMsSR59+gPCorF6twa30lpMbkee84QGBDwmOh4GwAziXU
+e7FPryZrSc/DexWLIiBmkV3Jfc+znG0AqsJwjkjQhEsK7QoZlqoALIAAIMgxNx5z
+1E51wykWPrYF1uiyjjeiCizBm6lIgwTiez3LmeoeCm0042YYd0BOdtd2yrnMETI8
+TYApJw+aA/IiTq8Rf9yyjkTaBZYazf7e/Htd90HCggTiHNJzUDsFinXyvaA2TbH5
+9tgs/Pc+PZVzIx6G5HJbvrvmV56MsM8shqAXgZQmXfo8R0f9RJfu/yycQCzZ9Pym
+u1mksN1TuYivhlhHp80eNiK1pCu3UihUQKzi6/utS0K2ij8BVq6j7B+uXL63FFAj
+3lTJr8d2JO5HXSoVsk83zJ7f/BMHL9ZmEseBBc7i74RjLNwPsd3RRHmzCGROTKwL
++xa02poF/SWdb2DmiDpOV2X3HqJBxRdO18g9Z0xMNAOMYyoxafWrCE03/mnTxSb9
+7U2fhmiVcrU+1EMXO8Hvsz2ElycyiKhe8JLQykHRKlAftjEIgOCFpsbl+JPTt8Hs
+zMWjd0e+OTgwOosMeUPLjxOM6GzF5XF0E+176cEBPa4uRvCZqwV5C4DEoB4AmxCk
+T3Vxo9lhOMcfUkuohoaSdpeAzajBUybSbxUVsLMMiPivV/Ovw24gTWuEm4dVs8zW
+KNOrevjEF0c6ckiLEXMgxO7GUeDQEaHX0uD+Taibw/Axm3r+PED+URTToRPZJ0Ix
+WXY7cl1unpFibFtQdFmOUhD3reCCNPMU38SwgUrJ6SDrmOHqJPYPLWb5JXTzfxnX
+kkqkLfK8HHtpmgjxu5AMIxqnpEAw3Jj6DQZEcA+JPmF3xyTUq3SdXXip7Dtl7m7o
+DMeXd9C4WC6HbYY8EuLKJlgfBXRiyQKmpaPowBgtDoZ5oDdkH6QvKJuKOnuowUAw
+w7Nhihxe1zWlnPLbHsp0ciIWlhiT1onZFbawrLacaPKWHr3ucEdbiy7h0iP2odMl
+sJKRiWHyr9JwZ1lCmWXgHadGj0G1/blhiYghwVgWjyab1SpFHw16ilcmwueEKz2R
+6p96mL1etRdAVNvuKWf+kgmW1OE7IBQ20NYxbCCP55j8P41zsot+bA/iB7b92FwK
+5+bLKxl1JbSrj+VF5+eL5u6H1bNIr7gRaA1AIEUyMXE+P6iLpOByTn0J8NIhW9lY
+6b7ZuiJWI4WcgPsHu8aH0RF3kkxByxjkvIOWCDe0nZrAQmN4o4aOgF4ARNpSEt7G
+hsobClwbDPL07sLHdUfd+DfzU3bgM77LAiVHMd+0D9IpgB10/8U50Qj6SGER67Yy
+7vgxwO6uhTbgLK+NtxkUIXzBxSGTbbZ3DI2MiDfv8EJHHxKQv+5WNG7/Twn8td4d
+zTyuKfzRGq6j8JOLw1Vdw2isnywpavspJ5EjVMH5cCNsGxbvc6k43Zdpfm/hzILg
+kq7acXkWV/WwOcesw+G2GwOOp4+/Cm0+cN1i/KzZCplujoJ2vle4uce2VOME65XS
+aWTVf+6QAbataYnlGjPhpW7IwwcztrZnRtnDBcYR3TR0x74lqab8HIned+q7kAcL
+BegXAnsnW95Ba9nlLhx7TvlpfzpidEOf6NY9fLsmylpTY6IMaJ3UaaeC+JWQ+Ky+
+3FBTaTXuq2H7c8HeeDLYVbaUCEW+TsmwYPb1c8ceZqRMRVhk8H/Y5Rp6krSECb/a
+nLtubwWvU5u47eA0paEyHkonm70YmStN+cmX+IFxbPLPVhCEEVtbM5MmYlszlGBB
+Y8eJ3VRBxILwFefLsFHMYecQcpsJY3m/I4JSXP7zJcWxTx5X738ivjRvIkarkoIi
+Fl0W5QcrkvcBjq2eXpC9LVeVzrbQOsEQmks3FDwQuCyTdvTuN4MqVA0N3S51m0FT
+3r0winMsv1gVadp/3BSlb0BDbn37H5bNL9OvYqzP72JksoLSyFdJUte/n5Eb+jXJ
+IdqOp8gGHAYS4m+yifmD+OXUq2cb432RdBL4IH2Vs5JWO/1KaP9lwuzH+JFPuL1t
+TwSq4mtSkxj/DpTwB/C5Bk1VWcvSwu4ecHW/JW2Eavk08wxp1PsKn7w89EOXqEY2
+CWUOpQsm4SrINRbdRJGjGc42l7HVal33F91hK/iQBUFqhH3gzhSFT0yyqLVvjFkR
+eHEp/kWqTPUQNwIBLRc2ktCEzPgOnj2pz+4CgbGuMTTOmLyBYIlY+bUm6BjcnKaN
+r7oBWpxc/jMRJ9mgqoPkyC68+Ym34rUmd9MoEmYV1QT9xjjyxAKhd0wU/kFqsvli
+spvX+4n7ZJc0WrdUHvg8tWunyI/EVy0eH8EVPeq7Z5VMoDnYlzGB1Z5+ZwtHf3he
+ucWTrfBzr72o/8AIlUIYCxwT0N/U45BKVM8trsyE1DpMt0c7H5qRwhil62vgFiZm
+lVEzMjV30ZhefltM3eqZ5bhZJZ0pOauXqTIGqyTMNrp6ebb2/BG9ah+PTGtIfYJn
+7vEXyHvAPvQO/8khgEOzpKjd/E3ux5k58SbORGQ/yNnV0LSAVa2Wj8sgns2qD3yf
+LhiwXStPbfGCkI6fgZwp9NmS+xWI+7eG2ede1IvNvcMtyhKIgGhN28QwgFzElKXv
+qXxqRtiUCLiGLeM5oCeieIfFAGWpet1ey4fDIK+pwIRmyhH8cjrn6A1mRN26Frzf
+J8jye/x9DhDsqogq9aFa9mXATsbfrmaTrVXI8pyXh1PeLooaz3ZaIerFkWd9/gYq
+wU3I0dgkn62MtU5V0srRqFChw12T+S62yAKaSTDBk5Du41Dxpo8k2kZtGINfgR34
+lffg3dLDNM616tGAd1u3zNDCRY0WR3WLdCLWKk49csYcljGObXYQXA+6C06sFLIa
+ZsLCdZlca2Y3nkXTix72MWUdXCX7aQvW8DdCNe/VfQEFN6piaq3Qlc4M78Wv52mh
+dzG2FUXky17YCJ1LIWSrAZPpkWUnjyYZ9kr95A2KydbUqgseNDpxYFgUGZW0yTGO
+d4mNTI4C+00qcRqa+0K69vLK8nHM+fCI/jSttQmg6NPRp5DZswaiubjbIubWBYwU
+fk1PE71y3XMb38/rR1AZOqJZhH4uglpJws74nlzZbcKhxrnNdkkqGdpvx8tq3COP
+0jxXqQLlhCXU09d/393YYlLgIaZMYSRo18MMXDVrnVaWwTic2ZZRLu09/wahYapy
+z2WLmD7+P6X5+MRX03Gq6oDILTxm4qD12eeAryj8EaH4Rto6sEIHH2c344MBN/OT
+TNIIWsW35RtOYJAl5bfLCe3g20iQm8bLhW7oq48FZIJbEdppnwzkWKf4k0hu2uAF
+RJ+yHvB6EAJxmB7/V4PEWFXplnrcoyWwgV4rzQncbEsQzP6BEfFYJmZVGGZhJZ4m
+8F1YNs+39u4+Lo9yxMbyzu5lcn/oXPV1+Qw4ksO4LE9kAcbN7Rwxl5LEOkWuoKXh
+Wy2mNe1KYCdE6r8ClgVFZI/w72HcRienlL2U+zCnvazJIaGw/6qChxAoNaNzDVII
+cGiUCg94ESrvIeSC9L7W7qIIlwwC/e2JFbT+ufrJDrge4jM6sY4ATrIaeGT2KQ28
+SvfQPN1TTvnciINWfP9+920+gsBJYqWE5rJ78JYKDSg0SIbDI1WYuaNB0cWEkCba
+dY7Iwu+Ri1mX9CRPXGOFwstAh97VE8VsXJYTd9hGqoGHNKzP0iztdrjSd2FRGLHf
+J29KhhomhghqBprV2zd5av4990tX9JJpHJZjIZVM64zrmbvHJZQQgb4ZnKCMBHoU
+i355HIwk+uF+6JOounKVTJjkGG8FmISZh2oiUIsqEsyqmxW5fLvem8c8MoBRFEHe
+whxbzpdRCqntabJ5JChVk7mXFFefK5qaqB93g1ASO9WYBYkHX0/40Ky3AIlc4Pb4
+uyZsUA15UBxb2ZPCH3OHDd907ZuB1NM3VFVLMEMMravPH4pAlt+pPSbZbL1y52h4
+jbogLE7Y7xel8DKpDp69EYskcAnHboOEklqozuKtSvshauS/3FjEZ4jlEBn3Pc9P
+rvNRE/VGmR7qZF65/NtFKQISY8TNv8wJw4/Nx1I7kxOSqUkxWZweB9N5BOkP+mo3
+MjG5bHhK/Z/G9R5V2Gatpu6tLcuLznWnlhqRR/FMZYR8n6NZ3ccrNMKRVdHtnPA/
+8pdNNB6w3sJuzd7/bE0qFpArs6HXL5dAfGHkCus5Dfhwp7uVdGTSURTI3mnMtP0P
+NeqyB3k328O5dvH74MIWkMFQe8QJDZi8Ko96SuNKjtFbGmTBcJcx5qgrS3dAyBSV
+qrzQgxD2mA1OlYNNo+SirZAli3SQj4is6lAl5M/fCaqamVW19Lg5yiLbIYe6NBdJ
+g/8Oe8b0/sSHMSorMK0gJ5+YkFrOcxycYlxZT1WXBFenJ/ESvZD+YB0cfPSj1iIs
+iV0A6/eo4yqiKRvLb8/0i+EFx4Yvs0vmRhcLfOo62lz6JL0fjCtsnlJAcAK4JTUP
+GGohXm99velzGbsNUntlSJLFb5JNeKwRKWtgrU61x6G3kDKQI11/UvC4DQbak381
+TFDTzT4h3Si5r+0fPxf9OfqG3B3OKEEPDPluiG4/OWGfTTphHipvyrumz8t1poZ7
+uOnemTpubMa+BtxoeTZgiZkD9Y6SL3i7HElUMNehO/ZcSi61RE4Hyob2LLNDW3/R
+oWCpUEI9mUHolxjS3VMBmabAhKlTUZf+p0CwkKRpA9dF4S7kvs+hrgfzLk4RbMSD
+ZacUbV/jwSnF92Huyu2PrudxC7C4vnK1nMKgwfpdTaRe0WddnUbrQWP4xsWwq2D1
+xisPyf2jXruNpwnTrMeCblCfzhsOGhyrajE5KieagAwU3pPM/vJU8WDV077Bkjl3
+QPgzCTF+i2jiv3HNiBHFREcl1Sp6kp871nmPSnYlaxykgqXln+mJo9idP7f+nvot
+TePjKZmt8DYKVdyaidcEDlwzdW4D/NcntDI3VKBiAAVlAJ1D3hUBb3GINSnLF/bn
+XfB2lHLkoFUsOi6WVg6Gjwo/iEA4VHjn+JNPOOOCnmgOnGgpTM2i8VqdJnUzunwH
+UiqdtK5tGZq3E2ed4r/7xdarDVknuNGSKs1gRtsVZYHe2ZiTeCwPvaAY2VD2G892
+e41Me2EvJTF6cRQ5bwtD885Wx/aYZoP15H7n2pvItOTkkqt49xEnsG4cZAK+Yt4o
+8ZWOREp47ialkWvhFsqC1hyqUqvnxf/F6T7hDoqJCcLGE4WZoA4THJgkgPL7XXo8
+fOScvsrJGSIZFlNJlk4JtTU4VnwPnlEPpklfv6sIjUMUuCx1ICNi7J3f4gBAO8bB
+vjI82rmaWiJ5ng9tfacxjS+8b3FEw62PfxxGLl7dkbc9VkY/shptBUufKwQqmDq1
+b4LXs9OIB0iK9OopqTDXeVzIN9d+sP0OUp7RUwJ23+csmeKuIROSgT2N9p6Ze5HE
+zJKcgZS+aNU4VZMyBJtgbu8eIwpDrEYmD7wI3MNYFBwhSfLIoyia/7y/275USEBb
+d3qeioNw6lbmaxdoDdjVK/V9PjrrrFYUgvgtaXxs64k1ZzNQ++qYp3gh+Iup+msm
+pibIVjVynz3O3cSC1rgHtLujbH1jsIJs2o9CWYIpFDlO+agDaaM3ic2CIHqJH7i/
+wMXEihtPcPMNj9N04R5h51VvLTUq2+Q0f5ajYPPYdLK8eHevQwTGi0qPm9eCjIPj
+AnXGtA0z0MSrdnMOBoA8TeEFaPvO13jV9bbsYcxzT1DVbGlABLkx83Nj2iMonMaJ
+VpjBkUl/DMG+lml88J47Aj+fbtBArWt746seoupMpBJ4YAuWoEjbxOCTv8WDKo3S
+vX7MmkuZt93QNoB6kW6XkOLljzkuiqYkd5KwsboV/Zn6ch37m84NKNHePPYpjvFB
+0Ahk05ibeq7Mv6fMkuO/iyf8qOTsMbJitw1VVCTOLQMuO0uuVTyRdHW8h9XrDDxo
+Bh3ZBV6fleojaaRGCqxzwrQVc3nbKp1OWlffp3bXHFPwP2s27Rs7qctLkxBHvREF
+Rcy+8xyKMbDlbtUK8Ko/UdTBkdQj+dfpIU5yIQm4nXNYrp/1wwDcOFrHyYc8tB0L
+WDXbHFMotfkZb/yguJJQS4xxBHc5tS2D3ByGcDu4E1nihGI5ogQP6OyQQ9PEwVfS
+d0fqQnGCyn5fZdBt/x2iW4RCidEae2bURtyGNLLz+YnicW06vyVWbXSc+AzkvjQd
+rmqNC9gR9L/rOJHn8p90D8bcQQOcdTwTdq5z0bNmNPCY4U2qkNzxvHDyjD8c+UTO
+6aDUWLbgfGvhAQOP0IX11LyYTn0W+wGMM4pf+z3dFoY8Pcdl6ySIpuhsSZsE44la
+m7lcULpeQRiBRS0yTBWv6xiETmHXrQdPUmKK83tfUlUdId6iK9u9lOrQiLftiCHC
+urzM+nwf179zOf0+3ecwehZUSRMLztPCslvB4PIiDMLWFReC8S+3476fG3Yb7SbW
+fsH9OJ1GFrbXb2KxKo8Wf2yJumqOCEFh/PwO7chsQ9ft/W84JPaiNc/sbrp+QbzN
+sKZ49CeG/odViNGk+8SFaUBMISfoLcUM8YwPQgi9gtsA8haRNjUbEE7S6Pz2GEh9
+th8Lz1zxISog/lpYatagR3cK4tv+bntcu7RgzbJxxXlobV9BFs1BBxwGWs9tbgxH
+eF6izKgB1nq1w+GmL9deUNqKNUUe+bIYr9h6scTzOqYqu0FQFm8OpKWtmOAdu+p6
+gezKKOBLa7CI0er4bl8/oVUSU8YP1l6Lx++zxbRl9s7L+/U3QQ64zhviMQDDeAHz
++MhFLneCKgv72HlXBYe8p5cXu5y47r13eS7FLaV7jktwLPYqAMFWdu3ySquEx8JH
+ylJYPw4rYuIoAijcKlzM8/aD4kgjZC9Jm55fLU1scECvEvT/iOLa6OsU4Sfo4kJH
+xAvS4nRCICTMgqYqju/Xwjj95OXmiiDCfD3uP9IIBZqZkOpgVQcuecfrj+vVWnK7
+2rqZ2UPaIP7ZJKkwFfWp4lHE/JqV+HTSPapMihcDmbrHreXQVdK1XExJA8gEjTlr
+c+IbfV3uw8LB7pY07XO86XjucFGZtDn2p4zwjuGBcqIJ4glhrWOhZd6kLNIFrA8h
+yTBmGe5khG08ssaCpuDV6zoH2GQdSm0B9HpkMJsRSEZAt80cmCPRFtwUg4gi7Huh
+wp5smyG1q9w45X2gIYFXSUYOgbme9EriCXkdGrd5Kig7GQUWNPkjYSnGKe1vRm/M
+7KC3GXK+0DOdZxXtAB2JGOPdaKEBgb+OCj8sLy0SSyt+1+dfJQ3BvPNL828dMTyV
+uxquSDZCrncGawlxO89rTx28ZrjXMrJYA1ER7FUX0h5YpA3TWSKzh0H52dHdNAth
+Eq5Jb9IVA8agvMaqvQUjKQFQdwiPwz8NsdVHVEFJEF2DqEx7bqL9j1Tmw+4AS+DS
+twt3aorVWoeMJQbSpnuCq/TdrhFLQr75Llg/k/d51nYAcLwE3QJf3KbAlEctGTW8
+lxoHixDLGhy6zuXHZAYnZ2b46votlBd3KZpU1TvQEN5CQqEqsuuwfY/2clS0zuHf
+B/kkUuLU1laiXXJCTEHbDonVo8kNxoe8H/rEifArq2E9Nhsf7GwJCt+vEn9QOhl0
+1prqSQBaSA92F4OW8F1pOlZbCJ/h2kX1Cjv/Ll4GaVRceFdLAzZSldmhsbgPqmg+
+nrJWiOwqokwtDTO+j03yumkidVaC/A+yiz0+FXfoUSQj6cgBt4bTtQzrcwfIBF0G
+ZKIZ7iV6wQH0fJwI0wH53WesZMjdCgPad3DLIf19KJPv58BltFne0z3M2TAViAt8
+3kub0RpFYnmjV6rMKKOgkP80vN6BY3DPgoiRqsvjPVsn+BCzEhjVytg5HbTiJSfq
+1GP3DaiFG5UdfEi0+cvpGBVa6n9E3LUTUMvVbyCp/EVILQ+RqcMtm5G5XiE7PDWk
+NVGVfL9CLsP1Ao7tWkoi5lYBc83TDHX3fdKHUx5BKLnnA1DG97TKu31ZOMm3s4uM
+C0AVYoM5jBpvt3ggVpkN0G8nYYntcARd/yuJ1ENBIxhb0/3mR10NlBNhivkRKU9f
+T06AhmhrMyNGQyur+/sNc28roiJTi9eKNwnKJt3f1NwXlzyPGOv3AQjVx1fDv4S7
+M9fM30BvJay+ef+UxWC4/q0sGw+KWg42NfjhdKw6Iv34G3Cex2eOJ3o6Po9vq6Hu
+BkTYIXw7sx/crDlHbYjS1iT3nonRoDUwqum74jGV6lYhtxF/VQxXdyPDr1JiDc6j
+a03l6WwOQNMqM6d6xec4dAjD+MD1qUlCT+1si2xqjhSNs8vk7QfRnJaQomXXDhNe
+FKy2/xkvHLr51ntqt2Eqm/6cGHv+n7pFLV/Tj7D6Gantu5oW/0tsoyjTsSpvZmal
+4t0lWj1FyTOgKhx+KdH6hRmsB28vZ6DLbmrndUIeO/3dA6+wPQzQUuidsgg8JY+i
+COVEAHBYHDT8n+R7JGc/V/vo3OFFD2iqmSp4aM+0zp9mn7YHnGC0Cig20epLlEqH
+mR/yCjtQA0Ec6gLopfBNsuQ8aD28/MZvezm2eNKWIGYdsFpD1cNgexV1go2C6k0F
+mr98Uw59UJwAPsNsN0tGUHnGrNP9E3eJCroNFQ6QcZUk5Q/BVX9SQnLmrP+YnEPb
+jCfAfy89qiEJWL4WkVsQ054y3VgTbdFDwkXkPeRCTDgE8kzx5Lt/bn5WTbS2zFlE
+myQHlzh3buXBkea/UPMzIDEgV4T/C9HorrNNTcYcyXUDEZgEgH+8xpjzvuK6euA5
+PGuO4YixC0pwPVj0bJfeuUOsvzxIEK+0Dgp3Gt/3pVwEqhPtGpJSkl0nnFOkc0vk
+O95Gg9WNGCP8Tev17Dsv3kjHYknr65GDl/dRR4DIr9u4QJf8/9qo8C4O2IrJegzA
+i8eqOL7hDWwZvYWpEz68sl/+w/7LLrrJ2pjP2Yf+/ppQcnsCFtIjONE66X2GNHMZ
+9QfhvVoBqA9ypgBGjdQOLOVBCchIgaszJ7kgLtguAVkv9rpE0/T+/kTAcIYTNH7H
+Wt1KlQ62Q9pMgNjhsSBPspXJnI2/On4JueabYthCJ9HVmlAqy8A+HMNKVJH9ADaO
+gWkZkXZN3c5wBp0FQp4FJ/jyOKA9SH/7D0lMwnZeAAbfm9Oub6vd9UwTZNCoHpnM
+pJe7C/j+oUqVisIHpkaA06cQWpilHqQcFRulRw8OHSj+SJVNek1txQQLJXinJLG+
+cayZqhpv/8MxdaxuNkk/O0UYtM2XErrGKf73tfxRvjXqSOjQDmMEhZNHE2fSAoK1
+1k3xrFHQeAdbgy1HiOmxK/qDlIQRbOBuFF1atltsHhhmoAIEWDgUzeAdWRtdh4t2
+dhJQ/0K90+UV5Zmj7qIfAN8r8vW28cLl2c6ksHBfvVGxbYNIO5mlSl/BIu+k9Qk6
+BJc5F5wKRik1TZ2oFVLHC6Sxa2Pblm2CbIDIK8Ful9Os/noPcLADRympqnFInqRf
+WLw5q5AkObx7z1hwHSw/O76SUyc8n+f0bIgA8cn5A81W6GDs7pYJEUbwKXRO47Gz
+YCGFJh/KM34ywRtr57+Ky7znXVsWjhHEYy9/9kpw39nTTkp2rcfsTwqqUufBqKv3
+ebiZMXBAhXPQA0HyhKTNmI/ksqZiy9zEX+mo3RJamX7cAA+naB/I3QqlLiDXgbim
+z/fTb/u4IhKAxpN93e0xnIRTlkhejtuNBU4TfWDXDPgv8EBn7M9qSSJLpWPaYdNH
+XM4sK23VY0zyL60rgP0HrLBzIvKqUCbHYSHrnzUllpK8w6JYGH4DzHSQGsoTG8x6
+Qd/7ywd7uNqgZqXdCnjXpun0HQK5Ay7/Y6uUF2bH/Ytoqq05g+kdoR5kgKG56oXA
+5tf2tqQH+WP31DRTm0eEj6rGi+Bd6zyykytjsiyhZbSPvG9z0UZkCU7bjdxILKp3
+kcv0JWB1K0/QjvaMVdZ9TNg1CdBcpdCPwRepI7ZIcGnghjQhTWQmZGNbLi9DxTnU
+Z9kEqG88XzROdq7Yh4Qe5bgQOeVY0YoWgnq0G06hvnrqxVbR78IauDzgXoqBYd85
+DMOu0FOXuyPsMAudi5ceDfRJTbHI5HEzo5ycbP0sZsaps0ubRW+/3Kv1oGZUMzpd
+OkQ5uzuaqqPGVSXyHOfAkR4BgkbS30sFbPwr0fGW1J/fNjeZL+IbG1HLok7zjjbt
+gw5ih/AzSO4mGzduIzOdSpgl96WpajmH++IibgnMd1RmCGVz+pbg9O3E4O6/dkA3
+8Wc2ZAuVMIVEDSbg5nWQOr+sP5+WN5yQqQkW5q55o+TBCKnLBMisX6GfHHHSrqeM
+zRCwr26e8Pq7ufol10DedGMGv3vvwqzhaM6POm/NdQm+lpWgaA9rxde8qDHwHw0g
+6UFBdeWC5eZvHVRYM/khOhZvZBhfCIx+fF3Tr0eqjOF5+caQhO91Ml5I/CAjTldI
+yaYTFpmQ7Nh1tN2YrLBe3i7qR7gXTvZjPlQpS7kjftAitN4/HMsp8oI/Uaj1pYTl
+a/aL1VbV8bqxMKDAxRNYc7b2GY04ColnYj9GNFzxSXCQflkSbMbAOxGeb2u5kmRt
+oyjN3/tg6qxCz74C7BDmUPrzNSRqjBHsJV3AnUfdicImDYqyz7x8MfdPTr80Hmaf
+P/SnnVPf/IPOGkebZG+O6Jg9Uc7jgdSwRvOpSVHrUjIB0nsds1yGXJqjsOliBdoP
+WOr+GusfL0sV6pgQKl8cLWUGzgV42TviBesU47yC3iy8iQtvXI1IQvlza3qVTUrM
+u2+8WN2DfgtNJvwnbA72Bfo0ccf+dnJKu2Q0pQT/RkS7CgmcLfplMJJdk1JH5hM3
+Pp26TFCr8dsY6dRHVCRabke4feLDlDZcIQs4Xy1dBlulJePn1TcXTSahuUsSBU9i
+KXOvV/pen+QOdHTjbWlQsAMiod1oe+AkV+UWveJdC81zrhBi6l2OLvpsiSbNi6qY
+jQ7EeNWXMIk3UOKFcLi25pGwFqYXEVKlbPcIk8yHgPDwpp1laZ1NbF+mvx0D1nup
+O7Qx1uqL1Dl/yaI95HCI9/OEIpYs9GxskLKwMj/IogCpd7yYO7O9WNtJuk+ydqfs
+AT7WnHY1fidh2LhHorYJ/a3lOvjz8k8f3ucQR1ToeCau0MGopemoIBr41N1eOBSl
+hj7xuluqXn36myuJysBCPCX0kpAqY+l5HCz47boWkvSDOdo99ht+QYaK3iCxlDHL
+FEqt/LgQhPThuwmvUK4j5xbgdjGXU/FB+aYBknf0JvND7rxnlhW/f+NrpzJQGDKt
+QFX/VR6gcryLpZueDnBzrIjDlCBHmRigunBvu68U+1NsvR4HCQfMVLZTnY0Lt9v/
+FE/xu8D9tJ8vxy/tPlUu2Qom907Gx/tetqg4xzuUpGpjU8FpaHGPuxF09/qFVy2o
+n/iGZCKBSCWWJagtCS2EtzLqOXlZXAlKb8lG1cGvTz9WFrIJE89Ew6oZQS2L9YdG
+rFzd8gyTOGwrtc6zAf7FG+rsHiBEl3jh3ugZv9ASes6VMn2h88Zx9coFVAWkdWBr
+8VpSLHCTLTCojaMAsfYKaJZm4lg24T0jePiT/jQNlkLdepYeqdkhw4w97+jlmJt4
+fNDLqefNfQgh6NJmauHnmLz6jdPRxoDU43cb3PxatUw7SFsAfuatzhGW7l379IdG
+Tw3m16UDdu8RvEJHrr7KYI0DzU0IuYgXEg5JXdiaACeBRG3P988NeSGO107FulQd
+Pv7Yb8xS/x33DIv4C1/hbvFlMC148a4XHIjlJqHyVYff72epajLTQHWQIunREon+
+3dzlVv1V9gtfdHDjLdWcAzFSGicgdLSszwyI7ewOACXW7HWwPUe0mYp0i7yNzQBF
+QHoEz4ycR89g/Xl1oNlqu96KmLoYt76AW6NOKKbOKm9345VIdwEbCBmO94g+wtJH
+VTUqpqBuHj4s4AmrQuOC10GA+ibF+2m7On5PRuelCWEObmIPzfIJtb0dX3tbFfX4
+G7RblS042U+fNwsf2/2if4ctoF5hbLmIK1Y1S1H78wY3Cbjjw8N+EBQTVgNW81vs
+B84CDv8ehztEqL72NIU6MtuoMfPteTRKJpDS5hUerBZUrBqtWOwIRrB5YETWqFSM
+cOXPZJysCHb415bWO1vo4INfh7xWHn58CCdCHz/FZEmuDL21hojoYPEGwrva95ux
+00NlJrSCO0h2XQkD3x/wgjOtB/EQRmKe/4O55YF14S15FhENN8tIf+u1rZf10Sks
+wI4cRFeTuTEW5kq+99XusjX9lCn+m+YooYwN4Am9SNO4G7gb8fEzK4sX7PMsGKF9
+FaOOC//tPugQU5PbHmIfgyGDJZxAc8tZ8R+df+SSeVpdvkdndlXXI4C/gnOgCKle
+qZvO2nWj4w32uvFr6Qj/WmaNelya0ZwEIjqr+ypoQj+A25bEeNSjTZeyDB2O05N7
+idXcJRSmzKzen3pwvJQ7IeYhpVbLMufzhf+pMhB7I7tntCx36Pt24IAw2e6QR/Cl
+korH+RH5yRhCCTDU0LRXVbwbByrhSxANl8J2HOCP96BgCSzFev3lGKL+SectMXqq
+761dJNe+JLMAsYstEOhTIgXcQ4DOufyr03q6umFuBVPn4393KmekAr/yz41gO7uP
+fhds99nZAeIv03xtA2fsmNTmXH6hTMUtgs0BkVt/+88Jy45xD3Ndrjd1fBxn9WnR
+gZ73+6RsDjsFhpEez8pL3thFRn4cZDTSPStISFcfJXwfy6f3VPJu8Jyeb7NJVE35
+Qlm+zsoCZpCF2kxzuS9Rf0rHcuiSzYBw3gNrMqAuFWlzSHG2LIRv+dpxRZ6LSroM
+o6sfDKQemgkuvwhfLTGKNdRqaoND0nA=
+=1fXC
-----END PGP MESSAGE-----
diff --git a/propellor.cabal b/propellor.cabal
index 0454fc92..8491c042 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
Name: propellor
-Version: 5.5.0
+Version: 5.6.0
Cabal-Version: 1.20
License: BSD2
Maintainer: Joey Hess <id@joeyh.name>
@@ -101,6 +101,7 @@ Library
Propellor.Property.Kerberos
Propellor.Property.Laptop
Propellor.Property.LetsEncrypt
+ Propellor.Property.Libvirt
Propellor.Property.List
Propellor.Property.LightDM
Propellor.Property.Locale
@@ -199,7 +200,11 @@ Library
Utility.Data
Utility.DataUnits
Utility.Directory
+ Utility.Directory.Stream
+ Utility.Directory.TestDirectory
Utility.Env
+ Utility.Env.Basic
+ Utility.Env.Set
Utility.Exception
Utility.FileMode
Utility.FileSystemEncoding
@@ -209,10 +214,10 @@ Library
Utility.Monad
Utility.Path
Utility.PartialPrelude
- Utility.PosixFiles
Utility.Process
Utility.Process.Shim
Utility.Process.NonConcurrent
+ Utility.Process.Transcript
Utility.SafeCommand
Utility.Scheduled
Utility.Scheduled
@@ -221,6 +226,7 @@ Library
Utility.Table
Utility.ThreadScheduler
Utility.Tmp
+ Utility.Tmp.Dir
Utility.Tuple
Utility.UserInfo
System.Console.Concurrent
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 1b345f15..6ca133cb 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -266,8 +266,8 @@ cabalBuild msys = do
-- a binary that is fully built. Also, avoid ever removing
-- or breaking the symlink.
--
- -- Need cp -a to make build timestamp checking work.
- unlessM (boolSystem "cp" [Param "-af", Param cabalbuiltbin, Param (tmpfor safetycopy)]) $
+ -- Need cp -pfRL to make build timestamp checking work.
+ unlessM (boolSystem "cp" [Param "-pfRL", Param cabalbuiltbin, Param (tmpfor safetycopy)]) $
error "cp of binary failed"
rename (tmpfor safetycopy) safetycopy
symlinkPropellorBin safetycopy
diff --git a/src/Propellor/EnsureProperty.hs b/src/Propellor/EnsureProperty.hs
index 6c720e2b..ab624706 100644
--- a/src/Propellor/EnsureProperty.hs
+++ b/src/Propellor/EnsureProperty.hs
@@ -7,7 +7,7 @@
module Propellor.EnsureProperty
( ensureProperty
, property'
- , OuterMetaTypesWitness(..)
+ , OuterMetaTypesWitness
, Cannot_ensureProperty_WithInfo
) where
diff --git a/src/Propellor/Gpg.hs b/src/Propellor/Gpg.hs
index c48bc060..53e7ad5a 100644
--- a/src/Propellor/Gpg.hs
+++ b/src/Propellor/Gpg.hs
@@ -13,11 +13,13 @@ import Propellor.Message
import Propellor.Git.Config
import Utility.SafeCommand
import Utility.Process
+import Utility.Process.Transcript
import Utility.Process.NonConcurrent
import Utility.Monad
import Utility.Misc
import Utility.Tmp
import Utility.Env
+import Utility.Env.Set
import Utility.Directory
import Utility.Split
import Utility.Exception
diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs
index 8c0a5859..54dd8908 100644
--- a/src/Propellor/Property.hs
+++ b/src/Propellor/Property.hs
@@ -303,7 +303,8 @@ pickOS a b = c `addChildren` [toChildProperty a, toChildProperty b]
where
-- This use of getSatisfy is safe, because both a and b
-- are added as children, so their info will propigate.
- c = withOS (getDesc a) $ \_ o ->
+ c = property (getDesc a) $ do
+ o <- getOS
if matching o a
then maybe (pure NoChange) id (getSatisfy a)
else if matching o b
@@ -330,15 +331,9 @@ pickOS a b = c `addChildren` [toChildProperty a, toChildProperty b]
withOS
:: (SingI metatypes)
=> Desc
- -> (OuterMetaTypesWitness '[] -> Maybe System -> Propellor Result)
+ -> (OuterMetaTypesWitness metatypes -> Maybe System -> Propellor Result)
-> Property (MetaTypes metatypes)
-withOS desc a = property desc $ a dummyoutermetatypes =<< getOS
- where
- -- Using this dummy value allows ensureProperty to be used
- -- even though the inner property probably doesn't target everything
- -- that the outer withOS property targets.
- dummyoutermetatypes :: OuterMetaTypesWitness ('[])
- dummyoutermetatypes = OuterMetaTypesWitness sing
+withOS desc a = property' desc $ \w -> a w =<< getOS
-- | A property that always fails with an unsupported OS error.
unsupportedOS :: Property UnixLike
diff --git a/src/Propellor/Property/Borg.hs b/src/Propellor/Property/Borg.hs
index 9d49fdf4..f662c8ee 100644
--- a/src/Propellor/Property/Borg.hs
+++ b/src/Propellor/Property/Borg.hs
@@ -59,12 +59,15 @@ runBorgEnv (BorgRepoUsing os _) = map go os
go (UsesEnvVar (k, v)) = (k, v)
installed :: Property DebianLike
-installed = withOS desc $ \w o -> case o of
- (Just (System (Debian _ (Stable "jessie")) _)) -> ensureProperty w $
- Apt.backportInstalled ["borgbackup", "python3-msgpack"]
- _ -> ensureProperty w $
- Apt.installed ["borgbackup"]
+installed = pickOS installdebian aptinstall
where
+ installdebian :: Property Debian
+ installdebian = withOS desc $ \w o -> case o of
+ (Just (System (Debian _ (Stable "jessie")) _)) -> ensureProperty w $
+ Apt.backportInstalled ["borgbackup", "python3-msgpack"]
+ _ -> ensureProperty w $
+ Apt.installed ["borgbackup"]
+ aptinstall = Apt.installed ["borgbackup"] `describe` desc
desc = "installed borgbackup"
repoExists :: BorgRepo -> IO Bool
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
index ab700a9d..b9fb10e0 100644
--- a/src/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
@@ -79,7 +79,7 @@ niceJob desc times user cddir command = job desc times user cddir
("nice ionice -c 3 sh -c " ++ shellEscape command)
-- | Installs a cron job to run propellor.
-runPropellor :: Times -> Property UnixLike
+runPropellor :: Times -> Property DebianLike
runPropellor times = withOS "propellor cron job" $ \w o -> do
bootstrapper <- getBootstrapper
ensureProperty w $
diff --git a/src/Propellor/Property/DiskImage.hs b/src/Propellor/Property/DiskImage.hs
index fa41808e..29bc2d1c 100644
--- a/src/Propellor/Property/DiskImage.hs
+++ b/src/Propellor/Property/DiskImage.hs
@@ -17,6 +17,7 @@ module Propellor.Property.DiskImage (
imageRebuiltFor,
imageBuiltFrom,
imageExists,
+ imageChrootNotPresent,
GrubTarget(..),
noBootloader,
) where
@@ -200,14 +201,13 @@ imageBuilt' rebuild img mkchroot tabletype partspec =
`describe` desc
where
desc = "built disk image " ++ describeDiskImage img
- RawDiskImage imgfile = rawDiskImage img
cleanrebuild :: Property Linux
cleanrebuild
| rebuild = property desc $ do
liftIO $ removeChroot chrootdir
return MadeChange
| otherwise = doNothing
- chrootdir = imgfile ++ ".chroot"
+ chrootdir = imageChroot img
chroot =
let c = propprivdataonly $ mkchroot chrootdir
in setContainerProps c $ containerProps c
@@ -378,7 +378,7 @@ imageExists' :: RawDiskImage -> PartTable -> RevertableProperty DebianLike UnixL
imageExists' dest@(RawDiskImage img) parttable = (setup <!> cleanup) `describe` desc
where
desc = "disk image exists " ++ img
- parttablefile = img ++ ".parttable"
+ parttablefile = imageParttableFile dest
setup = property' desc $ \w -> do
oldparttable <- liftIO $ catchDefaultIO "" $ readFileStrict parttablefile
res <- ensureProperty w $ imageExists dest (partTableSize parttable)
@@ -488,6 +488,24 @@ noBootloader = pureInfoProperty "no bootloader" [NoBootloader]
noBootloaderFinalized :: Finalization
noBootloaderFinalized _img _mnt _loopDevs = doNothing
+imageChrootNotPresent :: DiskImage d => d -> Property UnixLike
+imageChrootNotPresent img = check (doesDirectoryExist dir) $
+ property "destroy the chroot used to build the image" $ makeChange $ do
+ removeChroot dir
+ nukeFile $ imageParttableFile img
+ where
+ dir = imageChroot img
+
+imageChroot :: DiskImage d => d -> FilePath
+imageChroot img = imgfile <.> "chroot"
+ where
+ RawDiskImage imgfile = rawDiskImage img
+
+imageParttableFile :: DiskImage d => d -> FilePath
+imageParttableFile img = imgfile <.> "parttable"
+ where
+ RawDiskImage imgfile = rawDiskImage img
+
isChild :: FilePath -> Maybe MountPoint -> Bool
isChild mntpt (Just d)
| d `equalFilePath` mntpt = False
diff --git a/src/Propellor/Property/Firewall.hs b/src/Propellor/Property/Firewall.hs
index 7b62558d..37063dba 100644
--- a/src/Propellor/Property/Firewall.hs
+++ b/src/Propellor/Property/Firewall.hs
@@ -17,7 +17,6 @@ module Propellor.Property.Firewall (
IPWithMask(..),
) where
-import Data.Monoid
import qualified Data.Semigroup as Sem
import Data.Char
import Data.List
diff --git a/src/Propellor/Property/Libvirt.hs b/src/Propellor/Property/Libvirt.hs
new file mode 100644
index 00000000..525dd68a
--- /dev/null
+++ b/src/Propellor/Property/Libvirt.hs
@@ -0,0 +1,210 @@
+-- | Maintainer: Sean Whitton <spwhitton@spwhitton.name>
+
+module Propellor.Property.Libvirt (
+ NumVCPUs(..),
+ MiBMemory(..),
+ AutoStart(..),
+ DiskImageType(..),
+ installed,
+ defaultNetworkAutostarted,
+ defaultNetworkStarted,
+ defined,
+) where
+
+import Propellor.Base
+import Propellor.Types.Info
+import Propellor.Property.Chroot
+import Propellor.Property.DiskImage
+import qualified Propellor.Property.Apt as Apt
+
+import Utility.Split
+
+-- | The number of virtual CPUs to assign to the virtual machine
+newtype NumVCPUs = NumVCPUs Int
+
+-- | The number of MiB of memory to assign to the virtual machine
+newtype MiBMemory = MiBMemory Int
+
+-- | Whether the virtual machine should be started after it is defined, and at
+-- host system boot
+data AutoStart = AutoStart | NoAutoStart
+
+-- | Which type of disk image to build for the virtual machine
+data DiskImageType = Raw -- | QCow2
+
+-- | Install basic libvirt components
+installed :: Property DebianLike
+installed = Apt.installed ["libvirt-clients", "virtinst"]
+
+-- | Ensure that the default libvirt network is set to autostart, and start it.
+--
+-- On Debian, it is not started by default after installation of libvirt.
+defaultNetworkAutostarted :: Property DebianLike
+defaultNetworkAutostarted = autostarted
+ `requires` installed
+ `before` defaultNetworkStarted
+ where
+ autostarted = check (not <$> doesFileExist autostartFile) $
+ cmdProperty "virsh" ["net-autostart", "default"]
+ autostartFile = "/etc/libvirt/qemu/networks/autostart/default.xml"
+
+-- | Ensure that the default libvirt network is started.
+defaultNetworkStarted :: Property DebianLike
+defaultNetworkStarted = go `requires` installed
+ where
+ go :: Property UnixLike
+ go = property "start libvirt's default network" $ do
+ runningNetworks <- liftIO $ virshGetColumns ["net-list"]
+ if ["default"] `elem` (take 1 <$> runningNetworks)
+ then noChange
+ else makeChange $ unlessM startIt $
+ errorMessage "failed to start default network"
+ startIt = boolSystem "virsh" [Param "net-start", Param "default"]
+
+
+-- | Builds a disk image with the properties of the given Host, installs a
+-- libvirt configuration file to boot the image, and if it is set to autostart,
+-- start the VM.
+--
+-- Note that building the disk image happens only once. So if you change the
+-- properties of the given Host, this property will not modify the disk image.
+-- In order to later apply properties to the VM, you should spin it directly, or
+-- arrange to have it spun with a property like 'Cron.runPropellor', or use
+-- 'Propellor.Property.Conductor' from the VM host.
+--
+-- Suggested usage in @config.hs@:
+--
+-- > mybox = host "mybox.example.com" $ props
+-- > & osDebian (Stable "stretch") X86_64
+-- > & Libvirt.defaultNetworkAutostarted
+-- > & Libvirt.defined Libvirt.Raw
+-- > (Libvirt.MiBMemory 2048) (Libvirt.NumVCPUs 2)
+-- > Libvirt.NoAutoStart subbox
+-- >
+-- > subbox = host "subbox.mybox.example.com" $ props
+-- > & osDebian Unstable X86_64
+-- > & hasPartition
+-- > ( partition EXT4
+-- > `mountedAt` "/"
+-- > `addFreeSpace` MegaBytes 10240
+-- > )
+-- > & Apt.installed ["linux-image-amd64"]
+-- > & Grub.installed PC
+-- >
+-- > & ipv4 "192.168.122.31"
+-- > & Network.static "ens3" (IPv4 "192.168.122.31")
+-- > (Just (Network.Gateway (IPv4 "192.168.122.1")))
+-- > `requires` Network.cleanInterfacesFile
+-- > & Hostname.sane
+defined
+ :: DiskImageType
+ -> MiBMemory
+ -> NumVCPUs
+ -> AutoStart
+ -> Host
+ -> Property (HasInfo + DebianLike)
+defined imageType (MiBMemory mem) (NumVCPUs cpus) auto h =
+ (built `before` nuked `before` xmlDefined `before` started)
+ `requires` installed
+ where
+ built :: Property (HasInfo + DebianLike)
+ built = check (not <$> doesFileExist imageLoc) $
+ setupRevertableProperty $ imageBuiltFor h
+ (image) (Debootstrapped mempty)
+
+ nuked :: Property UnixLike
+ nuked = imageChrootNotPresent image
+
+ xmlDefined :: Property UnixLike
+ xmlDefined = check (not <$> doesFileExist conf) $
+ property "define the libvirt VM" $
+ withTmpFile (hostName h) $ \t fh -> do
+ xml <- liftIO $ readProcess "virt-install" $
+ [ "-n", hostName h
+ , "--memory=" ++ show mem
+ , "--vcpus=" ++ show cpus
+ , "--disk"
+ , "path=" ++ imageLoc
+ ++ ",device=disk,bus=virtio"
+ , "--print-xml"
+ ] ++ autoStartArg ++ osVariantArg
+ liftIO $ hPutStrLn fh xml
+ liftIO $ hClose fh
+ makeChange $ unlessM (defineIt t) $
+ errorMessage "failed to define VM"
+ where
+ defineIt t = boolSystem "virsh" [Param "define", Param t]
+
+ started :: Property UnixLike
+ started = case auto of
+ AutoStart -> property "start the VM" $ do
+ runningVMs <- liftIO $ virshGetColumns ["list"]
+ -- From the point of view of `virsh start`, the "State"
+ -- column in the output of `virsh list` is not relevant.
+ -- So long as the VM is listed, it's considered started.
+ if [hostName h] `elem` (take 1 . drop 1 <$> runningVMs)
+ then noChange
+ else makeChange $ unlessM startIt $
+ errorMessage "failed to start VM"
+ NoAutoStart -> doNothing
+ where
+ startIt = boolSystem "virsh" [Param "start", Param $ hostName h]
+
+ image = case imageType of
+ Raw -> RawDiskImage imageLoc
+ imageLoc =
+ "/var/lib/libvirt/images" </> hostName h <.> case imageType of
+ Raw -> "img"
+ conf = "/etc/libvirt/qemu" </> hostName h <.> "xml"
+
+ osVariantArg = maybe [] (\v -> ["--os-variant=" ++ v]) $ osVariant h
+ autoStartArg = case auto of
+ AutoStart -> ["--autostart"]
+ NoAutoStart -> []
+
+-- ==== utility functions ====
+
+-- The --os-variant property is optional, per virt-install(1), so return Nothing
+-- if there isn't a known correct value. The VM will still be defined. Pass
+-- the value if we can, though, to optimise the generated XML for the host's OS
+osVariant :: Host -> Maybe String
+osVariant h = hostSystem h >>= \s -> case s of
+ System (Debian _ (Stable "jessie")) _ -> Just "debian8"
+ System (Debian _ (Stable "stretch")) _ -> Just "debian9"
+ System (Debian _ Testing) _ -> Just "debiantesting"
+ System (Debian _ Unstable) _ -> Just "debiantesting"
+
+ System (Buntish "trusty") _ -> Just "ubuntu14.04"
+ System (Buntish "utopic") _ -> Just "ubuntu14.10"
+ System (Buntish "vivid") _ -> Just "ubuntu15.04"
+ System (Buntish "wily") _ -> Just "ubuntu15.10"
+ System (Buntish "xenial") _ -> Just "ubuntu16.04"
+ System (Buntish "yakkety") _ -> Just "ubuntu16.10"
+ System (Buntish "zesty") _ -> Just "ubuntu17.04"
+ System (Buntish "artful") _ -> Just "ubuntu17.10"
+ System (Buntish "bionic") _ -> Just "ubuntu18.04"
+
+ System (FreeBSD (FBSDProduction FBSD101)) _ -> Just "freebsd10.1"
+ System (FreeBSD (FBSDProduction FBSD102)) _ -> Just "freebsd10.2"
+ System (FreeBSD (FBSDProduction FBSD093)) _ -> Just "freebsd9.3"
+ System (FreeBSD (FBSDLegacy FBSD101)) _ -> Just "freebsd10.1"
+ System (FreeBSD (FBSDLegacy FBSD102)) _ -> Just "freebsd10.2"
+ System (FreeBSD (FBSDLegacy FBSD093)) _ -> Just "freebsd9.3"
+
+ -- libvirt doesn't have an archlinux variant yet, it seems
+ System ArchLinux _ -> Nothing
+
+ -- other stable releases that we don't know about (since there are
+ -- infinitely many possible stable release names, as it is a freeform
+ -- string, we need this to avoid a compiler warning)
+ System (Debian _ _) _ -> Nothing
+ System (Buntish _) _ -> Nothing
+
+-- Run a virsh command with the given list of arguments, that is expected to
+-- yield tabular output, and return the rows
+virshGetColumns :: [String] -> IO [[String]]
+virshGetColumns args = map (filter (not . null) . split " ") . drop 2 . lines
+ <$> readProcess "virsh" args
+
+hostSystem :: Host -> Maybe System
+hostSystem = fromInfoVal . fromInfo . hostInfo
diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
index 6a6bcd31..2805cc97 100644
--- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
+++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
@@ -122,9 +122,9 @@ standardAutoBuilder suite arch flavor =
& Apt.stdSourcesList
& Apt.unattendedUpgrades
& Apt.cacheCleaned
- & buildDepsApt
& User.accountFor (User builduser)
& tree (architectureToDebianArchString arch) flavor
+ & buildDepsApt
stackAutoBuilder :: DebianSuite -> Architecture -> Flavor -> Property (HasInfo + Debian)
stackAutoBuilder suite arch flavor =
@@ -140,7 +140,7 @@ stackAutoBuilder suite arch flavor =
-- Workaround https://github.com/commercialhaskell/stack/issues/2093
& Apt.installed ["libtinfo-dev"]
-stackInstalled :: Property Linux
+stackInstalled :: Property DebianLike
stackInstalled = withOS "stack installed" $ \w o ->
case o of
(Just (System (Debian Linux (Stable "jessie")) arch)) ->
@@ -182,6 +182,7 @@ armAutoBuilder baseautobuilder suite arch flavor =
propertyList "arm git-annex autobuilder" $ props
& baseautobuilder suite arch flavor
-- Works around ghc crash with parallel builds on arm.
+ & File.dirExists (homedir </> ".cabal")
& (homedir </> ".cabal" </> "config")
`File.containsLine` "jobs: 1"
-- Work around https://github.com/systemd/systemd/issues/7135
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index e7d27de5..07787705 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -400,23 +400,31 @@ podcatcher = Cron.niceJob "podcatcher run hourly" (Cron.Times "55 * * * *")
"xargs git-annex importfeed -c annex.genmetadata=true < feeds; mr --quiet update"
`requires` Apt.installed ["git-annex", "myrepos"]
-kiteMailServer :: Property (HasInfo + DebianLike)
-kiteMailServer = propertyList "kitenet.net mail server" $ props
- & Postfix.installed
- & Apt.installed ["postfix-pcre"]
- & Apt.serviceInstalledRunning "postgrey"
+spamdEnabled :: Property DebianLike
+spamdEnabled = tightenTargets $
+ cmdProperty "update-rc.d" ["spamassassin", "enable"]
+ `assume` MadeChange
+spamassassinConfigured :: Property DebianLike
+spamassassinConfigured = propertyList "spamassassin configured" $ props
& Apt.serviceInstalledRunning "spamassassin"
& "/etc/default/spamassassin" `File.containsLines`
[ "# Propellor deployed"
- , "ENABLED=1"
, "OPTIONS=\"--create-prefs --max-children 5 --helper-home-dir\""
, "CRON=1"
, "NICE=\"--nicelevel 15\""
- ] `onChange` Service.restarted "spamassassin"
- `describe` "spamd enabled"
+ ]
+ `describe` "spamd configured"
+ `onChange` spamdEnabled
+ `onChange` Service.restarted "spamassassin"
`requires` Apt.serviceInstalledRunning "cron"
+kiteMailServer :: Property (HasInfo + DebianLike)
+kiteMailServer = propertyList "kitenet.net mail server" $ props
+ & Postfix.installed
+ & Apt.installed ["postfix-pcre"]
+ & Apt.serviceInstalledRunning "postgrey"
+ & spamassassinConfigured
& Apt.serviceInstalledRunning "spamass-milter"
-- Add -m to prevent modifying messages Subject or body.
& "/etc/default/spamass-milter" `File.containsLine`
@@ -585,10 +593,18 @@ kiteMailServer = propertyList "kitenet.net mail server" $ props
& "/etc/pine.conf" `File.hasContent`
[ "# deployed with propellor"
, "inbox-path={localhost}inbox"
- , "rsh-command=/usr/lib/dovecot/imap"
+ , "rsh-command=" ++ imapalpinescript
]
`describe` "pine configured to use local imap server"
-
+ & imapalpinescript `File.hasContent`
+ [ "#!/bin/sh"
+ , "# deployed with propellor"
+ , "set -e"
+ , "exec /usr/lib/dovecot/imap 2>/dev/null"
+ ]
+ `onChange` (imapalpinescript `File.mode`
+ combineModes (readModes ++ executeModes))
+ `describe` "imap script for pine"
& Apt.serviceInstalledRunning "mailman"
-- Override the default http url. (Only affects new lists.)
& "/etc/mailman/mm_cfg.py" `File.containsLine`
@@ -600,6 +616,7 @@ kiteMailServer = propertyList "kitenet.net mail server" $ props
where
ctx = Context "kitenet.net"
pinescript = "/usr/local/bin/pine"
+ imapalpinescript = "/usr/local/bin/imap-for-alpine"
dovecotusers = "/etc/dovecot/users"
ssmtp = Postfix.Service
@@ -806,7 +823,7 @@ legacyWebSites = propertyList "legacy web sites" $ props
, "RewriteRule /~anna/.* http://waldeneffect\\.org/ [R]"
, "RewriteRule /~anna/.* http://waldeneffect\\.org/ [R]"
, "RewriteRule /~anna http://waldeneffect\\.org/ [R]"
- , "RewriteRule /simpleid/ http://openid.kitenet.net:8081/simpleid/"
+ , "RewriteRule /simpleid/ http://openid.kitenet.net:8086/simpleid/"
, "# Even the kite home page is not here any more!"
, "RewriteRule ^/$ http://www.kitenet.net/ [R]"
, "RewriteRule ^/index.html http://www.kitenet.net/ [R]"
@@ -937,7 +954,6 @@ homePower user hosts ctx sshkey = propertyList "home power" $ props
`requires` Apt.installed
[ "ghc", "cabal-install", "make"
, "libghc-http-types-dev"
- , "libghc-stm-dev"
, "libghc-aeson-dev"
, "libghc-wai-dev"
, "libghc-warp-dev"
@@ -1016,13 +1032,17 @@ homePower user hosts ctx sshkey = propertyList "home power" $ props
-- rsync server command to be updated too.
rsynccommand = "rsync -e 'ssh -i" ++ sshkeyfile ++ "' -avz rrds/ joey@kitenet.net:/srv/web/homepower.joeyh.name/rrds/"
+homerouterWifiInterfaceOld :: String
+homerouterWifiInterfaceOld = "wlx00c0ca82eb78" -- thinkpenguin wifi adapter
+
homerouterWifiInterface :: String
-homerouterWifiInterface = "wlan0" -- "wlx7cdd90400448" is a wifi dongle
+homerouterWifiInterface = "wlx7cdd90400448" -- small wifi dongle
-- My home router, running hostapd and dnsmasq,
-- with eth0 connected to a satellite modem, and a fallback ppp connection.
homeRouter :: Property (HasInfo + DebianLike)
homeRouter = propertyList "home router" $ props
+ & File.notPresent (Network.interfaceDFile homerouterWifiInterfaceOld)
& Network.static homerouterWifiInterface (IPv4 "10.1.1.1") Nothing
`requires` Network.cleanInterfacesFile
& Apt.installed ["hostapd"]
@@ -1134,6 +1154,8 @@ laptopSoftware = Apt.installed
, "yeahconsole", "xkbset", "xinput"
, "assword", "pumpa"
, "vorbis-tools", "audacity"
+ , "ekiga"
+ , "bluez-firmware", "blueman", "pulseaudio-module-bluetooth"
, "xul-ext-ublock-origin", "xul-ext-pdf.js", "xul-ext-status4evar"
, "vim-syntastic", "vim-fugitive"
, "adb", "gthumb"
@@ -1203,15 +1225,17 @@ homeNAS = propertyList "home NAS" $ props
& Apt.installed ["uhubctl"]
& "/etc/udev/rules.d/52-startech-hub.rules" `File.hasContent`
[ "# let users power control startech hub with uhubctl"
- , "ATTR{idVendor}==\"0409\", ATTR{idProduct}==\"005a\", MODE=\"0666\""
+ , "ATTR{idVendor}==\"" ++ hubvendor ++ "\", ATTR{idProduct}==\"005a\", MODE=\"0666\""
]
- & autoMountDrive "archive-10" (USBHubPort 1) (Just "archive-older")
- & autoMountDrive "archive-11" (USBHubPort 2) (Just "archive-old")
- & autoMountDrive "archive-12" (USBHubPort 3) (Just "archive")
- & autoMountDrive "passport" (USBHubPort 4) Nothing
+ & autoMountDrive "archive-10" (USBHubPort hubvendor 1) (Just "archive-older")
+ & autoMountDrive "archive-11" (USBHubPort hubvendor 2) (Just "archive-old")
+ & autoMountDrive "archive-12" (USBHubPort hubvendor 3) (Just "archive")
+ & autoMountDrive "passport" (USBHubPort hubvendor 4) Nothing
& Apt.installed ["git-annex", "borgbackup"]
+ where
+ hubvendor = "0409"
-newtype USBHubPort = USBHubPort Int
+data USBHubPort = USBHubPort String Int
-- Makes a USB drive with the given label automount, and unmount after idle
-- for a while.
@@ -1219,7 +1243,7 @@ newtype USBHubPort = USBHubPort Int
-- The hub port is turned on and off automatically as needed, using
-- uhubctl.
autoMountDrive :: Mount.Label -> USBHubPort -> Maybe FilePath -> Property DebianLike
-autoMountDrive label (USBHubPort port) malias = propertyList desc $ props
+autoMountDrive label (USBHubPort hubvendor port) malias = propertyList desc $ props
& File.ownerGroup mountpoint (User "joey") (Group "joey")
`requires` File.dirExists mountpoint
& case malias of
@@ -1248,8 +1272,8 @@ autoMountDrive label (USBHubPort port) malias = propertyList desc $ props
, "[Service]"
, "Type=oneshot"
, "RemainAfterExit=true"
- , "ExecStart=/usr/sbin/uhubctl -a on -p " ++ show port
- , "ExecStop=/bin/sh -c 'uhubctl -a off -p " ++ show port ++
+ , "ExecStart=/usr/sbin/uhubctl -a on -p " ++ show port ++ " --vendor " ++ hubvendor
+ , "ExecStop=/bin/sh -c 'uhubctl -a off -p " ++ show port ++ " --vendor " ++ hubvendor
-- Powering off the port does not remove device
-- files, so ask udev to remove the devfile; it will
-- be added back after the drive next spins up
@@ -1257,7 +1281,7 @@ autoMountDrive label (USBHubPort port) malias = propertyList desc $ props
-- spun up.
-- (This only works when the devfile is in
-- by-label.)
- "; udevadm trigger --action=remove " ++ devfile ++ " || true'"
+ ++ "; udevadm trigger --action=remove " ++ devfile ++ " || true'"
, "[Install]"
, "WantedBy="
]
diff --git a/src/Propellor/Property/Systemd.hs b/src/Propellor/Property/Systemd.hs
index cb63ff5a..9c9f5914 100644
--- a/src/Propellor/Property/Systemd.hs
+++ b/src/Propellor/Property/Systemd.hs
@@ -204,13 +204,18 @@ killUserProcesses = set "yes" <!> set "no"
-- | Ensures machined and machinectl are installed
machined :: Property Linux
-machined = withOS "machined installed" $ \w o ->
- case o of
- -- Split into separate debian package since systemd 225.
- (Just (System (Debian _ suite) _))
- | not (isStable suite) || suite == (Stable "stretch") ->
- ensureProperty w $ Apt.installed ["systemd-container"]
- _ -> noChange
+machined = installeddebian `pickOS` assumeinstalled
+ where
+ installeddebian :: Property DebianLike
+ installeddebian = withOS "machined installed" $ \w o ->
+ case o of
+ -- Split into separate debian package since systemd 225.
+ (Just (System (Debian _ suite) _))
+ | not (isStable suite) || suite == (Stable "stretch") ->
+ ensureProperty w $ Apt.installed ["systemd-container"]
+ _ -> noChange
+ assumeinstalled :: Property Linux
+ assumeinstalled = doNothing
-- | Defines a container with a given machine name,
-- and how to create its chroot if not already present.
diff --git a/src/Propellor/Property/User.hs b/src/Propellor/Property/User.hs
index 0b5bdddc..f6bc2c4b 100644
--- a/src/Propellor/Property/User.hs
+++ b/src/Propellor/Property/User.hs
@@ -168,7 +168,7 @@ hasDesktopGroups user@(User u) = property' desc $ \o -> do
existinggroups <- map (fst . break (== ':')) . lines
<$> liftIO (readFile "/etc/group")
let toadd = filter (`elem` existinggroups) desktopgroups
- ensureProperty o $ propertyList desc $ toProps $
+ ensureProperty o $ combineProperties desc $ toProps $
map (hasGroup user . Group) toadd
where
desc = "user " ++ u ++ " is in standard desktop groups"
diff --git a/src/Propellor/Ssh.hs b/src/Propellor/Ssh.hs
index a8f50ed0..9ba15d86 100644
--- a/src/Propellor/Ssh.hs
+++ b/src/Propellor/Ssh.hs
@@ -19,7 +19,7 @@ sshCachingParams :: HostName -> IO [CommandParam]
sshCachingParams hn = do
home <- myHomeDir
let socketfile = socketFile home hn
- createDirectoryIfMissing False (takeDirectory socketfile)
+ createDirectoryIfMissing True (takeDirectory socketfile)
let ps =
[ Param "-o"
, Param ("ControlPath=" ++ socketfile)
diff --git a/src/Propellor/Types.hs b/src/Propellor/Types.hs
index e10e0f5b..7052bf92 100644
--- a/src/Propellor/Types.hs
+++ b/src/Propellor/Types.hs
@@ -1,5 +1,6 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
diff --git a/src/Propellor/Types/OS.hs b/src/Propellor/Types/OS.hs
index 01d777a4..34ea4272 100644
--- a/src/Propellor/Types/OS.hs
+++ b/src/Propellor/Types/OS.hs
@@ -23,7 +23,7 @@ module Propellor.Types.OS (
import Propellor.Types.ConfigurableValue
-import Network.BSD (HostName)
+import Network.Socket (HostName)
import Data.Typeable
import Data.String
diff --git a/src/Propellor/Types/Singletons.hs b/src/Propellor/Types/Singletons.hs
index f2089ee8..7788c9aa 100644
--- a/src/Propellor/Types/Singletons.hs
+++ b/src/Propellor/Types/Singletons.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, DataKinds, PolyKinds, TypeOperators, TypeFamilies, GADTs, UndecidableInstances #-}
+{-# LANGUAGE CPP, DataKinds, PolyKinds, TypeOperators, TypeFamilies, GADTs, FlexibleContexts #-}
-- | Simple implementation of singletons, portable back to ghc 7.6.3
diff --git a/src/Propellor/Utilities.hs b/src/Propellor/Utilities.hs
index 33af4eda..56e7f2fb 100644
--- a/src/Propellor/Utilities.hs
+++ b/src/Propellor/Utilities.hs
@@ -9,19 +9,27 @@
module Propellor.Utilities (
module Utility.PartialPrelude
, module Utility.Process
+ , module Utility.Process.Transcript
, module Utility.Exception
, module Utility.Env
+ , module Utility.Env.Set
, module Utility.Directory
+ , module Utility.Directory.TestDirectory
, module Utility.Tmp
+ , module Utility.Tmp.Dir
, module Utility.Monad
, module Utility.Misc
) where
import Utility.PartialPrelude
import Utility.Process
+import Utility.Process.Transcript
import Utility.Exception
import Utility.Env
+import Utility.Env.Set
import Utility.Directory
+import Utility.Directory.TestDirectory
import Utility.Tmp
+import Utility.Tmp.Dir
import Utility.Monad
import Utility.Misc
diff --git a/src/Utility/Directory.hs b/src/Utility/Directory.hs
index e13191e4..e2c6a946 100644
--- a/src/Utility/Directory.hs
+++ b/src/Utility/Directory.hs
@@ -16,22 +16,18 @@ module Utility.Directory (
import System.IO.Error
import Control.Monad
import System.FilePath
+import System.PosixCompat.Files
import Control.Applicative
-import Control.Concurrent
import System.IO.Unsafe (unsafeInterleaveIO)
import Data.Maybe
import Prelude
-#ifdef mingw32_HOST_OS
-import qualified System.Win32 as Win32
-#else
-import qualified System.Posix as Posix
+#ifndef mingw32_HOST_OS
import Utility.SafeCommand
import Control.Monad.IfElse
#endif
import Utility.SystemDirectory
-import Utility.PosixFiles
import Utility.Tmp
import Utility.Exception
import Utility.Monad
@@ -42,10 +38,6 @@ dirCruft "." = True
dirCruft ".." = True
dirCruft _ = False
-fsCruft :: FilePath -> Bool
-fsCruft "lost+found" = True
-fsCruft d = dirCruft d
-
{- Lists the contents of a directory.
- Unlike getDirectoryContents, paths are not relative to the directory. -}
dirContents :: FilePath -> IO [FilePath]
@@ -100,10 +92,10 @@ dirTreeRecursiveSkipping skipdir topdir = go [] [topdir]
go c (dir:dirs)
| skipdir (takeFileName dir) = go c dirs
| otherwise = unsafeInterleaveIO $ do
- subdirs <- go c
+ subdirs <- go []
=<< filterM (isDirectory <$$> getSymbolicLinkStatus)
=<< catchDefaultIO [] (dirContents dir)
- go (subdirs++[dir]) dirs
+ go (subdirs++dir:c) dirs
{- Moves one filename to another.
- First tries a rename, but falls back to moving across devices if needed. -}
@@ -162,101 +154,3 @@ nukeFile file = void $ tryWhenExists go
#else
go = removeFile file
#endif
-
-#ifndef mingw32_HOST_OS
-data DirectoryHandle = DirectoryHandle IsOpen Posix.DirStream
-#else
-data DirectoryHandle = DirectoryHandle IsOpen Win32.HANDLE Win32.FindData (MVar ())
-#endif
-
-type IsOpen = MVar () -- full when the handle is open
-
-openDirectory :: FilePath -> IO DirectoryHandle
-openDirectory path = do
-#ifndef mingw32_HOST_OS
- dirp <- Posix.openDirStream path
- isopen <- newMVar ()
- return (DirectoryHandle isopen dirp)
-#else
- (h, fdat) <- Win32.findFirstFile (path </> "*")
- -- Indicate that the fdat contains a filename that readDirectory
- -- has not yet returned, by making the MVar be full.
- -- (There's always at least a "." entry.)
- alreadyhave <- newMVar ()
- isopen <- newMVar ()
- return (DirectoryHandle isopen h fdat alreadyhave)
-#endif
-
-closeDirectory :: DirectoryHandle -> IO ()
-#ifndef mingw32_HOST_OS
-closeDirectory (DirectoryHandle isopen dirp) =
- whenOpen isopen $
- Posix.closeDirStream dirp
-#else
-closeDirectory (DirectoryHandle isopen h _ alreadyhave) =
- whenOpen isopen $ do
- _ <- tryTakeMVar alreadyhave
- Win32.findClose h
-#endif
- where
- whenOpen :: IsOpen -> IO () -> IO ()
- whenOpen mv f = do
- v <- tryTakeMVar mv
- when (isJust v) f
-
-{- |Reads the next entry from the handle. Once the end of the directory
-is reached, returns Nothing and automatically closes the handle.
--}
-readDirectory :: DirectoryHandle -> IO (Maybe FilePath)
-#ifndef mingw32_HOST_OS
-readDirectory hdl@(DirectoryHandle _ dirp) = do
- e <- Posix.readDirStream dirp
- if null e
- then do
- closeDirectory hdl
- return Nothing
- else return (Just e)
-#else
-readDirectory hdl@(DirectoryHandle _ h fdat mv) = do
- -- If the MVar is full, then the filename in fdat has
- -- not yet been returned. Otherwise, need to find the next
- -- file.
- r <- tryTakeMVar mv
- case r of
- Just () -> getfn
- Nothing -> do
- more <- Win32.findNextFile h fdat
- if more
- then getfn
- else do
- closeDirectory hdl
- return Nothing
- where
- getfn = do
- filename <- Win32.getFindDataFileName fdat
- return (Just filename)
-#endif
-
--- True only when directory exists and contains nothing.
--- Throws exception if directory does not exist.
-isDirectoryEmpty :: FilePath -> IO Bool
-isDirectoryEmpty d = testDirectory d dirCruft
-
--- | True if the directory does not exist or contains nothing.
--- Ignores "lost+found" which can exist in an empty filesystem.
-isUnpopulated :: FilePath -> IO Bool
-isUnpopulated d = catchDefaultIO True $ testDirectory d fsCruft
-
--- | Run test on entries found in directory, return False as soon as the
--- test returns False, else return True. Throws exception if directory does
--- not exist.
-testDirectory :: FilePath -> (FilePath -> Bool) -> IO Bool
-testDirectory d test = bracket (openDirectory d) closeDirectory check
- where
- check h = do
- v <- readDirectory h
- case v of
- Nothing -> return True
- Just f
- | not (test f) -> return False
- | otherwise -> check h
diff --git a/src/Utility/Directory/Stream.hs b/src/Utility/Directory/Stream.hs
new file mode 100644
index 00000000..e827ef21
--- /dev/null
+++ b/src/Utility/Directory/Stream.hs
@@ -0,0 +1,130 @@
+{- streaming directory traversal
+ -
+ - Copyright 2011-2018 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE LambdaCase #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Directory.Stream where
+
+import Control.Monad
+import System.FilePath
+import System.IO.Unsafe (unsafeInterleaveIO)
+import Control.Concurrent
+import Data.Maybe
+import Prelude
+
+#ifdef mingw32_HOST_OS
+import qualified System.Win32 as Win32
+#else
+import qualified System.Posix as Posix
+#endif
+
+import Utility.Directory
+import Utility.Exception
+
+#ifndef mingw32_HOST_OS
+data DirectoryHandle = DirectoryHandle IsOpen Posix.DirStream
+#else
+data DirectoryHandle = DirectoryHandle IsOpen Win32.HANDLE Win32.FindData (MVar ())
+#endif
+
+type IsOpen = MVar () -- full when the handle is open
+
+openDirectory :: FilePath -> IO DirectoryHandle
+openDirectory path = do
+#ifndef mingw32_HOST_OS
+ dirp <- Posix.openDirStream path
+ isopen <- newMVar ()
+ return (DirectoryHandle isopen dirp)
+#else
+ (h, fdat) <- Win32.findFirstFile (path </> "*")
+ -- Indicate that the fdat contains a filename that readDirectory
+ -- has not yet returned, by making the MVar be full.
+ -- (There's always at least a "." entry.)
+ alreadyhave <- newMVar ()
+ isopen <- newMVar ()
+ return (DirectoryHandle isopen h fdat alreadyhave)
+#endif
+
+closeDirectory :: DirectoryHandle -> IO ()
+#ifndef mingw32_HOST_OS
+closeDirectory (DirectoryHandle isopen dirp) =
+ whenOpen isopen $
+ Posix.closeDirStream dirp
+#else
+closeDirectory (DirectoryHandle isopen h _ alreadyhave) =
+ whenOpen isopen $ do
+ _ <- tryTakeMVar alreadyhave
+ Win32.findClose h
+#endif
+ where
+ whenOpen :: IsOpen -> IO () -> IO ()
+ whenOpen mv f = do
+ v <- tryTakeMVar mv
+ when (isJust v) f
+
+-- | Reads the next entry from the handle. Once the end of the directory
+-- is reached, returns Nothing and automatically closes the handle.
+readDirectory :: DirectoryHandle -> IO (Maybe FilePath)
+#ifndef mingw32_HOST_OS
+readDirectory hdl@(DirectoryHandle _ dirp) = do
+ e <- Posix.readDirStream dirp
+ if null e
+ then do
+ closeDirectory hdl
+ return Nothing
+ else return (Just e)
+#else
+readDirectory hdl@(DirectoryHandle _ h fdat mv) = do
+ -- If the MVar is full, then the filename in fdat has
+ -- not yet been returned. Otherwise, need to find the next
+ -- file.
+ r <- tryTakeMVar mv
+ case r of
+ Just () -> getfn
+ Nothing -> do
+ more <- Win32.findNextFile h fdat
+ if more
+ then getfn
+ else do
+ closeDirectory hdl
+ return Nothing
+ where
+ getfn = do
+ filename <- Win32.getFindDataFileName fdat
+ return (Just filename)
+#endif
+
+-- | Like getDirectoryContents, but rather than buffering the whole
+-- directory content in memory, lazily streams.
+--
+-- This is like lazy readFile in that the handle to the directory remains
+-- open until the whole list is consumed, or until the list is garbage
+-- collected. So use with caution particularly when traversing directory
+-- trees.
+streamDirectoryContents :: FilePath -> IO [FilePath]
+streamDirectoryContents d = openDirectory d >>= collect
+ where
+ collect hdl = readDirectory hdl >>= \case
+ Nothing -> return []
+ Just f -> do
+ rest <- unsafeInterleaveIO (collect hdl)
+ return (f:rest)
+
+-- | True only when directory exists and contains nothing.
+-- Throws exception if directory does not exist.
+isDirectoryEmpty :: FilePath -> IO Bool
+isDirectoryEmpty d = bracket (openDirectory d) closeDirectory check
+ where
+ check h = do
+ v <- readDirectory h
+ case v of
+ Nothing -> return True
+ Just f
+ | not (dirCruft f) -> return False
+ | otherwise -> check h
diff --git a/src/Utility/Directory/TestDirectory.hs b/src/Utility/Directory/TestDirectory.hs
new file mode 100644
index 00000000..e1f961b9
--- /dev/null
+++ b/src/Utility/Directory/TestDirectory.hs
@@ -0,0 +1,40 @@
+{- testing properties of directories
+ -
+ - Copyright 2011-2018 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+module Utility.Directory.TestDirectory where
+
+import Utility.Directory
+import Utility.Directory.Stream
+import Utility.Exception
+
+-- | True only when directory exists and contains nothing.
+-- Throws exception if directory does not exist.
+isDirectoryEmpty :: FilePath -> IO Bool
+isDirectoryEmpty d = testDirectory d dirCruft
+
+-- | True if the directory does not exist or contains nothing.
+-- Ignores "lost+found" which can exist in an empty filesystem.
+isUnpopulated :: FilePath -> IO Bool
+isUnpopulated d = catchDefaultIO True $ testDirectory d fsCruft
+
+fsCruft :: FilePath -> Bool
+fsCruft "lost+found" = True
+fsCruft d = dirCruft d
+
+-- | Run test on entries found in directory, return False as soon as the
+-- test returns False, else return True. Throws exception if directory does
+-- not exist.
+testDirectory :: FilePath -> (FilePath -> Bool) -> IO Bool
+testDirectory d test = bracket (openDirectory d) closeDirectory check
+ where
+ check h = do
+ v <- readDirectory h
+ case v of
+ Nothing -> return True
+ Just f
+ | not (test f) -> return False
+ | otherwise -> check h
diff --git a/src/Utility/Env.hs b/src/Utility/Env.hs
index c56f4ec2..dfebd986 100644
--- a/src/Utility/Env.hs
+++ b/src/Utility/Env.hs
@@ -16,7 +16,6 @@ import Control.Applicative
import Data.Maybe
import Prelude
import qualified System.Environment as E
-import qualified System.SetEnv
#else
import qualified System.Posix.Env as PE
#endif
@@ -42,29 +41,6 @@ getEnvironment = PE.getEnvironment
getEnvironment = E.getEnvironment
#endif
-{- Sets an environment variable. To overwrite an existing variable,
- - overwrite must be True.
- -
- - On Windows, setting a variable to "" unsets it. -}
-setEnv :: String -> String -> Bool -> IO ()
-#ifndef mingw32_HOST_OS
-setEnv var val overwrite = PE.setEnv var val overwrite
-#else
-setEnv var val True = System.SetEnv.setEnv var val
-setEnv var val False = do
- r <- getEnv var
- case r of
- Nothing -> setEnv var val True
- Just _ -> return ()
-#endif
-
-unsetEnv :: String -> IO ()
-#ifndef mingw32_HOST_OS
-unsetEnv = PE.unsetEnv
-#else
-unsetEnv = System.SetEnv.unsetEnv
-#endif
-
{- Adds the environment variable to the input environment. If already
- present in the list, removes the old value.
-
diff --git a/src/Utility/Env/Basic.hs b/src/Utility/Env/Basic.hs
new file mode 100644
index 00000000..38295bea
--- /dev/null
+++ b/src/Utility/Env/Basic.hs
@@ -0,0 +1,22 @@
+{- portable environment variables, without any dependencies
+ -
+ - Copyright 2013 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Env.Basic where
+
+import Utility.Exception
+import Control.Applicative
+import Data.Maybe
+import Prelude
+import qualified System.Environment as E
+
+getEnv :: String -> IO (Maybe String)
+getEnv = catchMaybeIO . E.getEnv
+
+getEnvDefault :: String -> String -> IO String
+getEnvDefault var fallback = fromMaybe fallback <$> getEnv var
diff --git a/src/Utility/Env/Set.hs b/src/Utility/Env/Set.hs
new file mode 100644
index 00000000..bd835e97
--- /dev/null
+++ b/src/Utility/Env/Set.hs
@@ -0,0 +1,41 @@
+{- portable environment variables
+ -
+ - Copyright 2013 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.Env.Set where
+
+#ifdef mingw32_HOST_OS
+import qualified System.Environment as E
+import qualified System.SetEnv
+import Utility.Env
+#else
+import qualified System.Posix.Env as PE
+#endif
+
+{- Sets an environment variable. To overwrite an existing variable,
+ - overwrite must be True.
+ -
+ - On Windows, setting a variable to "" unsets it. -}
+setEnv :: String -> String -> Bool -> IO ()
+#ifndef mingw32_HOST_OS
+setEnv var val overwrite = PE.setEnv var val overwrite
+#else
+setEnv var val True = System.SetEnv.setEnv var val
+setEnv var val False = do
+ r <- getEnv var
+ case r of
+ Nothing -> setEnv var val True
+ Just _ -> return ()
+#endif
+
+unsetEnv :: String -> IO ()
+#ifndef mingw32_HOST_OS
+unsetEnv = PE.unsetEnv
+#else
+unsetEnv = System.SetEnv.unsetEnv
+#endif
diff --git a/src/Utility/Exception.hs b/src/Utility/Exception.hs
index 67c2e85d..bcadb789 100644
--- a/src/Utility/Exception.hs
+++ b/src/Utility/Exception.hs
@@ -5,7 +5,7 @@
- License: BSD-2-clause
-}
-{-# LANGUAGE CPP, ScopedTypeVariables #-}
+{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Exception (
@@ -29,11 +29,7 @@ module Utility.Exception (
import Control.Monad.Catch as X hiding (Handler)
import qualified Control.Monad.Catch as M
import Control.Exception (IOException, AsyncException)
-#ifdef MIN_VERSION_GLASGOW_HASKELL
-#if MIN_VERSION_GLASGOW_HASKELL(7,10,0,0)
import Control.Exception (SomeAsyncException)
-#endif
-#endif
import Control.Monad
import Control.Monad.IO.Class (liftIO, MonadIO)
import System.IO.Error (isDoesNotExistError, ioeGetErrorType)
@@ -46,15 +42,7 @@ import Utility.Data
- where there's a problem that the user is excpected to see in some
- circumstances. -}
giveup :: [Char] -> a
-#ifdef MIN_VERSION_base
-#if MIN_VERSION_base(4,9,0)
giveup = errorWithoutStackTrace
-#else
-giveup = error
-#endif
-#else
-giveup = error
-#endif
{- Catches IO errors and returns a Bool -}
catchBoolIO :: MonadCatch m => m Bool -> m Bool
@@ -95,11 +83,7 @@ bracketIO setup cleanup = bracket (liftIO setup) (liftIO . cleanup)
catchNonAsync :: MonadCatch m => m a -> (SomeException -> m a) -> m a
catchNonAsync a onerr = a `catches`
[ M.Handler (\ (e :: AsyncException) -> throwM e)
-#ifdef MIN_VERSION_GLASGOW_HASKELL
-#if MIN_VERSION_GLASGOW_HASKELL(7,10,0,0)
, M.Handler (\ (e :: SomeAsyncException) -> throwM e)
-#endif
-#endif
, M.Handler (\ (e :: SomeException) -> onerr e)
]
diff --git a/src/Utility/FileMode.hs b/src/Utility/FileMode.hs
index d9a26944..7d36c554 100644
--- a/src/Utility/FileMode.hs
+++ b/src/Utility/FileMode.hs
@@ -15,9 +15,9 @@ module Utility.FileMode (
import System.IO
import Control.Monad
import System.PosixCompat.Types
-import Utility.PosixFiles
+import System.PosixCompat.Files
#ifndef mingw32_HOST_OS
-import System.Posix.Files
+import System.Posix.Files (symbolicLinkMode)
import Control.Monad.IO.Class (liftIO)
#endif
import Control.Monad.IO.Class (MonadIO)
@@ -69,6 +69,7 @@ otherGroupModes :: [FileMode]
otherGroupModes =
[ groupReadMode, otherReadMode
, groupWriteMode, otherWriteMode
+ , groupExecuteMode, otherExecuteMode
]
{- Removes the write bits from a file. -}
diff --git a/src/Utility/FileSystemEncoding.hs b/src/Utility/FileSystemEncoding.hs
index 444dc4a9..ca6e7685 100644
--- a/src/Utility/FileSystemEncoding.hs
+++ b/src/Utility/FileSystemEncoding.hs
@@ -12,6 +12,9 @@ module Utility.FileSystemEncoding (
useFileSystemEncoding,
fileEncoding,
withFilePath,
+ RawFilePath,
+ fromRawFilePath,
+ toRawFilePath,
decodeBS,
encodeBS,
decodeW8,
@@ -32,6 +35,7 @@ import System.IO
import System.IO.Unsafe
import Data.Word
import Data.List
+import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L
#ifdef mingw32_HOST_OS
import qualified Data.ByteString.Lazy.UTF8 as L8
@@ -120,6 +124,22 @@ encodeBS = L.pack . decodeW8NUL
encodeBS = L8.fromString
#endif
+{- Recent versions of the unix package have this alias; defined here
+ - for backwards compatibility. -}
+type RawFilePath = S.ByteString
+
+{- Note that the RawFilePath is assumed to never contain NUL,
+ - since filename's don't. This should only be used with actual
+ - RawFilePaths not arbitrary ByteString that may contain NUL. -}
+fromRawFilePath :: RawFilePath -> FilePath
+fromRawFilePath = encodeW8 . S.unpack
+
+{- Note that the FilePath is assumed to never contain NUL,
+ - since filename's don't. This should only be used with actual FilePaths
+ - not arbitrary String that may contain NUL. -}
+toRawFilePath :: FilePath -> RawFilePath
+toRawFilePath = S.pack . decodeW8
+
{- Converts a [Word8] to a FilePath, encoding using the filesystem encoding.
-
- w82c produces a String, which may contain Chars that are invalid
diff --git a/src/Utility/Misc.hs b/src/Utility/Misc.hs
index 4498c0a0..48fcceb7 100644
--- a/src/Utility/Misc.hs
+++ b/src/Utility/Misc.hs
@@ -5,7 +5,6 @@
- License: BSD-2-clause
-}
-{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Misc where
@@ -16,10 +15,6 @@ import Foreign
import Data.Char
import Data.List
import System.Exit
-#ifndef mingw32_HOST_OS
-import System.Posix.Process (getAnyProcessStatus)
-import Utility.Exception
-#endif
import Control.Applicative
import Prelude
@@ -112,22 +107,6 @@ hGetSomeString h sz = do
peekbytes :: Int -> Ptr Word8 -> IO [Word8]
peekbytes len buf = mapM (peekElemOff buf) [0..pred len]
-{- Reaps any zombie git processes.
- -
- - Warning: Not thread safe. Anything that was expecting to wait
- - on a process and get back an exit status is going to be confused
- - if this reap gets there first. -}
-reapZombies :: IO ()
-#ifndef mingw32_HOST_OS
-reapZombies =
- -- throws an exception when there are no child processes
- catchDefaultIO Nothing (getAnyProcessStatus False True)
- >>= maybe (return ()) (const reapZombies)
-
-#else
-reapZombies = return ()
-#endif
-
exitBool :: Bool -> IO a
exitBool False = exitFailure
exitBool True = exitSuccess
diff --git a/src/Utility/PartialPrelude.hs b/src/Utility/PartialPrelude.hs
index 47e98318..85f80534 100644
--- a/src/Utility/PartialPrelude.hs
+++ b/src/Utility/PartialPrelude.hs
@@ -38,11 +38,9 @@ last = Prelude.last
{- Attempts to read a value from a String.
-
- - Ignores leading/trailing whitespace, and throws away any trailing
- - text after the part that can be read.
- -
- - readMaybe is available in Text.Read in new versions of GHC,
- - but that one requires the entire string to be consumed.
+ - Unlike Text.Read.readMaybe, this ignores some trailing text
+ - after the part that can be read. However, if the trailing text looks
+ - like another readable value, it fails.
-}
readish :: Read a => String -> Maybe a
readish s = case reads s of
diff --git a/src/Utility/Path.hs b/src/Utility/Path.hs
index 0779d167..f1302ae8 100644
--- a/src/Utility/Path.hs
+++ b/src/Utility/Path.hs
@@ -5,7 +5,7 @@
- License: BSD-2-clause
-}
-{-# LANGUAGE PackageImports, CPP #-}
+{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Path where
@@ -17,13 +17,6 @@ import Data.Char
import Control.Applicative
import Prelude
-#ifdef mingw32_HOST_OS
-import qualified System.FilePath.Posix as Posix
-#else
-import System.Posix.Files
-import Utility.Exception
-#endif
-
import Utility.Monad
import Utility.UserInfo
import Utility.Directory
@@ -136,17 +129,22 @@ relPathDirToFile from to = relPathDirToFileAbs <$> absPath from <*> absPath to
-}
relPathDirToFileAbs :: FilePath -> FilePath -> FilePath
relPathDirToFileAbs from to
- | takeDrive from /= takeDrive to = to
+#ifdef mingw32_HOST_OS
+ | normdrive from /= normdrive to = to
+#endif
| otherwise = joinPath $ dotdots ++ uncommon
where
pfrom = sp from
pto = sp to
- sp = map dropTrailingPathSeparator . splitPath
+ sp = map dropTrailingPathSeparator . splitPath . dropDrive
common = map fst $ takeWhile same $ zip pfrom pto
same (c,d) = c == d
uncommon = drop numcommon pto
dotdots = replicate (length pfrom - numcommon) ".."
numcommon = length common
+#ifdef mingw32_HOST_OS
+ normdrive = map toLower . takeWhile (/= ':') . takeDrive
+#endif
prop_relPathDirToFile_basics :: FilePath -> FilePath -> Bool
prop_relPathDirToFile_basics from to
@@ -242,50 +240,6 @@ dotfile file
where
f = takeFileName file
-{- Converts a DOS style path to a msys2 style path. Only on Windows.
- - Any trailing '\' is preserved as a trailing '/'
- -
- - Taken from: http://sourceforge.net/p/msys2/wiki/MSYS2%20introduction/i
- -
- - The virtual filesystem contains:
- - /c, /d, ... mount points for Windows drives
- -}
-toMSYS2Path :: FilePath -> FilePath
-#ifndef mingw32_HOST_OS
-toMSYS2Path = id
-#else
-toMSYS2Path p
- | null drive = recombine parts
- | otherwise = recombine $ "/" : driveletter drive : parts
- where
- (drive, p') = splitDrive p
- parts = splitDirectories p'
- driveletter = map toLower . takeWhile (/= ':')
- recombine = fixtrailing . Posix.joinPath
- fixtrailing s
- | hasTrailingPathSeparator p = Posix.addTrailingPathSeparator s
- | otherwise = s
-#endif
-
-{- Maximum size to use for a file in a specified directory.
- -
- - Many systems have a 255 byte limit to the name of a file,
- - so that's taken as the max if the system has a larger limit, or has no
- - limit.
- -}
-fileNameLengthLimit :: FilePath -> IO Int
-#ifdef mingw32_HOST_OS
-fileNameLengthLimit _ = return 255
-#else
-fileNameLengthLimit dir = do
- -- getPathVar can fail due to statfs(2) overflow
- l <- catchDefaultIO 0 $
- fromIntegral <$> getPathVar dir FileNameLimit
- if l <= 0
- then return 255
- else return $ minimum [l, 255]
-#endif
-
{- Given a string that we'd like to use as the basis for FilePath, but that
- was provided by a third party and is not to be trusted, returns the closest
- sane FilePath.
diff --git a/src/Utility/PosixFiles.hs b/src/Utility/PosixFiles.hs
deleted file mode 100644
index 37253da2..00000000
--- a/src/Utility/PosixFiles.hs
+++ /dev/null
@@ -1,42 +0,0 @@
-{- POSIX files (and compatablity wrappers).
- -
- - This is like System.PosixCompat.Files, but with a few fixes.
- -
- - Copyright 2014 Joey Hess <id@joeyh.name>
- -
- - License: BSD-2-clause
- -}
-
-{-# LANGUAGE CPP #-}
-{-# OPTIONS_GHC -fno-warn-tabs #-}
-
-module Utility.PosixFiles (
- module X,
- rename
-) where
-
-import System.PosixCompat.Files as X hiding (rename)
-
-#ifndef mingw32_HOST_OS
-import System.Posix.Files (rename)
-#else
-import qualified System.Win32.File as Win32
-import qualified System.Win32.HardLink as Win32
-#endif
-
-{- System.PosixCompat.Files.rename on Windows calls renameFile,
- - so cannot rename directories.
- -
- - Instead, use Win32 moveFile, which can. It needs to be told to overwrite
- - any existing file. -}
-#ifdef mingw32_HOST_OS
-rename :: FilePath -> FilePath -> IO ()
-rename src dest = Win32.moveFileEx src dest Win32.mOVEFILE_REPLACE_EXISTING
-#endif
-
-{- System.PosixCompat.Files.createLink throws an error, but windows
- - does support hard links. -}
-#ifdef mingw32_HOST_OS
-createLink :: FilePath -> FilePath -> IO ()
-createLink = Win32.createHardLink
-#endif
diff --git a/src/Utility/Process.hs b/src/Utility/Process.hs
index 6d981cb5..af3a5f4f 100644
--- a/src/Utility/Process.hs
+++ b/src/Utility/Process.hs
@@ -24,11 +24,10 @@ module Utility.Process (
createProcessSuccess,
createProcessChecked,
createBackgroundProcess,
- processTranscript,
- processTranscript',
withHandle,
withIOHandles,
withOEHandles,
+ withNullHandle,
withQuietOutput,
feedWithQuietOutput,
createProcess,
@@ -54,13 +53,6 @@ import System.Log.Logger
import Control.Concurrent
import qualified Control.Exception as E
import Control.Monad
-#ifndef mingw32_HOST_OS
-import qualified System.Posix.IO
-#else
-import Control.Applicative
-#endif
-import Data.Maybe
-import Prelude
type CreateProcessRunner = forall a. CreateProcess -> ((Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> IO a) -> IO a
@@ -170,68 +162,6 @@ createProcessChecked checker p a = do
createBackgroundProcess :: CreateProcessRunner
createBackgroundProcess p a = a =<< createProcess p
--- | Runs a process, optionally feeding it some input, and
--- returns a transcript combining its stdout and stderr, and
--- whether it succeeded or failed.
-processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool)
-processTranscript cmd opts = processTranscript' (proc cmd opts)
-
-processTranscript' :: CreateProcess -> Maybe String -> IO (String, Bool)
-processTranscript' cp input = do
-#ifndef mingw32_HOST_OS
-{- This implementation interleves stdout and stderr in exactly the order
- - the process writes them. -}
- (readf, writef) <- System.Posix.IO.createPipe
- readh <- System.Posix.IO.fdToHandle readf
- writeh <- System.Posix.IO.fdToHandle writef
- p@(_, _, _, pid) <- createProcess $ cp
- { std_in = if isJust input then CreatePipe else Inherit
- , std_out = UseHandle writeh
- , std_err = UseHandle writeh
- }
- hClose writeh
-
- get <- mkreader readh
- writeinput input p
- transcript <- get
-
- ok <- checkSuccessProcess pid
- return (transcript, ok)
-#else
-{- This implementation for Windows puts stderr after stdout. -}
- p@(_, _, _, pid) <- createProcess $ cp
- { std_in = if isJust input then CreatePipe else Inherit
- , std_out = CreatePipe
- , std_err = CreatePipe
- }
-
- getout <- mkreader (stdoutHandle p)
- geterr <- mkreader (stderrHandle p)
- writeinput input p
- transcript <- (++) <$> getout <*> geterr
-
- ok <- checkSuccessProcess pid
- return (transcript, ok)
-#endif
- where
- mkreader h = do
- s <- hGetContents h
- v <- newEmptyMVar
- void $ forkIO $ do
- void $ E.evaluate (length s)
- putMVar v ()
- return $ do
- takeMVar v
- return s
-
- writeinput (Just s) p = do
- let inh = stdinHandle p
- unless (null s) $ do
- hPutStr inh s
- hFlush inh
- hClose inh
- writeinput Nothing _ = return ()
-
-- | Runs a CreateProcessRunner, on a CreateProcess structure, that
-- is adjusted to pipe only from/to a single StdHandle, and passes
-- the resulting Handle to an action.
@@ -248,13 +178,10 @@ withHandle h creator p a = creator p' $ a . select
, std_out = Inherit
, std_err = Inherit
}
- (select, p')
- | h == StdinHandle =
- (stdinHandle, base { std_in = CreatePipe })
- | h == StdoutHandle =
- (stdoutHandle, base { std_out = CreatePipe })
- | h == StderrHandle =
- (stderrHandle, base { std_err = CreatePipe })
+ (select, p') = case h of
+ StdinHandle -> (stdinHandle, base { std_in = CreatePipe })
+ StdoutHandle -> (stdoutHandle, base { std_out = CreatePipe })
+ StderrHandle -> (stderrHandle, base { std_err = CreatePipe })
-- | Like withHandle, but passes (stdin, stdout) handles to the action.
withIOHandles
@@ -284,13 +211,16 @@ withOEHandles creator p a = creator p' $ a . oeHandles
, std_err = CreatePipe
}
+withNullHandle :: (Handle -> IO a) -> IO a
+withNullHandle = withFile devNull WriteMode
+
-- | Forces the CreateProcessRunner to run quietly;
-- both stdout and stderr are discarded.
withQuietOutput
:: CreateProcessRunner
-> CreateProcess
-> IO ()
-withQuietOutput creator p = withFile devNull WriteMode $ \nullh -> do
+withQuietOutput creator p = withNullHandle $ \nullh -> do
let p' = p
{ std_out = UseHandle nullh
, std_err = UseHandle nullh
@@ -316,7 +246,8 @@ devNull :: FilePath
#ifndef mingw32_HOST_OS
devNull = "/dev/null"
#else
-devNull = "NUL"
+-- Use device namespace to prevent GHC from rewriting path
+devNull = "\\\\.\\NUL"
#endif
-- | Extract a desired handle from createProcess's tuple.
diff --git a/src/Utility/Process/Shim.hs b/src/Utility/Process/Shim.hs
index 8c9d41d0..09312c7f 100644
--- a/src/Utility/Process/Shim.hs
+++ b/src/Utility/Process/Shim.hs
@@ -1,4 +1,3 @@
-module Utility.Process.Shim (module X, createProcess, waitForProcess) where
+module Utility.Process.Shim (module X) where
-import System.Process as X hiding (createProcess, waitForProcess)
-import System.Process.Concurrent
+import System.Process as X
diff --git a/src/Utility/Process/Transcript.hs b/src/Utility/Process/Transcript.hs
new file mode 100644
index 00000000..68fb2223
--- /dev/null
+++ b/src/Utility/Process/Transcript.hs
@@ -0,0 +1,83 @@
+{- Process transcript
+ -
+ - Copyright 2012-2018 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Process.Transcript where
+
+import Utility.Process
+import Utility.Misc
+
+import System.IO
+import System.Exit
+import Control.Concurrent.Async
+import Control.Monad
+#ifndef mingw32_HOST_OS
+import qualified System.Posix.IO
+#else
+import Control.Applicative
+#endif
+import Data.Maybe
+import Prelude
+
+-- | Runs a process and returns a transcript combining its stdout and
+-- stderr, and whether it succeeded or failed.
+processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool)
+processTranscript cmd opts = processTranscript' (proc cmd opts)
+
+-- | Also feeds the process some input.
+processTranscript' :: CreateProcess -> Maybe String -> IO (String, Bool)
+processTranscript' cp input = do
+ (t, c) <- processTranscript'' cp input
+ return (t, c == ExitSuccess)
+
+processTranscript'' :: CreateProcess -> Maybe String -> IO (String, ExitCode)
+processTranscript'' cp input = do
+#ifndef mingw32_HOST_OS
+{- This implementation interleves stdout and stderr in exactly the order
+ - the process writes them. -}
+ (readf, writef) <- System.Posix.IO.createPipe
+ System.Posix.IO.setFdOption readf System.Posix.IO.CloseOnExec True
+ System.Posix.IO.setFdOption writef System.Posix.IO.CloseOnExec True
+ readh <- System.Posix.IO.fdToHandle readf
+ writeh <- System.Posix.IO.fdToHandle writef
+ p@(_, _, _, pid) <- createProcess $ cp
+ { std_in = if isJust input then CreatePipe else Inherit
+ , std_out = UseHandle writeh
+ , std_err = UseHandle writeh
+ }
+ hClose writeh
+
+ get <- asyncreader readh
+ writeinput input p
+ transcript <- wait get
+#else
+{- This implementation for Windows puts stderr after stdout. -}
+ p@(_, _, _, pid) <- createProcess $ cp
+ { std_in = if isJust input then CreatePipe else Inherit
+ , std_out = CreatePipe
+ , std_err = CreatePipe
+ }
+
+ getout <- asyncreader (stdoutHandle p)
+ geterr <- asyncreader (stderrHandle p)
+ writeinput input p
+ transcript <- (++) <$> wait getout <*> wait geterr
+#endif
+ code <- waitForProcess pid
+ return (transcript, code)
+ where
+ asyncreader = async . hGetContentsStrict
+
+ writeinput (Just s) p = do
+ let inh = stdinHandle p
+ unless (null s) $ do
+ hPutStr inh s
+ hFlush inh
+ hClose inh
+ writeinput Nothing _ = return ()
diff --git a/src/Utility/SafeCommand.hs b/src/Utility/SafeCommand.hs
index eb34d3de..f820e69f 100644
--- a/src/Utility/SafeCommand.hs
+++ b/src/Utility/SafeCommand.hs
@@ -27,19 +27,21 @@ data CommandParam
-- | Used to pass a list of CommandParams to a function that runs
-- a command and expects Strings. -}
toCommand :: [CommandParam] -> [String]
-toCommand = map unwrap
+toCommand = map toCommand'
+
+toCommand' :: CommandParam -> String
+toCommand' (Param s) = s
+-- Files that start with a non-alphanumeric that is not a path
+-- separator are modified to avoid the command interpreting them as
+-- options or other special constructs.
+toCommand' (File s@(h:_))
+ | isAlphaNum h || h `elem` pathseps = s
+ | otherwise = "./" ++ s
where
- unwrap (Param s) = s
- -- Files that start with a non-alphanumeric that is not a path
- -- separator are modified to avoid the command interpreting them as
- -- options or other special constructs.
- unwrap (File s@(h:_))
- | isAlphaNum h || h `elem` pathseps = s
- | otherwise = "./" ++ s
- unwrap (File s) = s
-- '/' is explicitly included because it's an alternative
-- path separator on Windows.
pathseps = pathSeparator:"./"
+toCommand' (File s) = s
-- | Run a system command, and returns True or False if it succeeded or failed.
--
diff --git a/src/Utility/Scheduled.hs b/src/Utility/Scheduled.hs
index b68ff901..12ead425 100644
--- a/src/Utility/Scheduled.hs
+++ b/src/Utility/Scheduled.hs
@@ -30,6 +30,7 @@ import Utility.Data
import Utility.PartialPrelude
import Utility.Misc
import Utility.Tuple
+import Utility.Split
import Data.List
import Data.Time.Clock
@@ -265,7 +266,7 @@ toRecurrance s = case words s of
constructor "month" = Just Monthly
constructor "year" = Just Yearly
constructor u
- | "s" `isSuffixOf` u = constructor $ reverse $ drop 1 $ reverse u
+ | "s" `isSuffixOf` u = constructor $ dropFromEnd 1 u
| otherwise = Nothing
withday sd u = do
c <- constructor u
diff --git a/src/Utility/Split.hs b/src/Utility/Split.hs
index decfe7d3..ffea5d3f 100644
--- a/src/Utility/Split.hs
+++ b/src/Utility/Split.hs
@@ -28,3 +28,7 @@ splitc c s = case break (== c) s of
-- | same as Data.List.Utils.replace
replace :: Eq a => [a] -> [a] -> [a] -> [a]
replace old new = intercalate new . split old
+
+-- | Only traverses the list once while dropping the last n characters.
+dropFromEnd :: Int -> [a] -> [a]
+dropFromEnd n l = zipWith const l (drop n l)
diff --git a/src/Utility/ThreadScheduler.hs b/src/Utility/ThreadScheduler.hs
index da05e996..5b46c92e 100644
--- a/src/Utility/ThreadScheduler.hs
+++ b/src/Utility/ThreadScheduler.hs
@@ -18,10 +18,8 @@ import System.Posix.IO
#endif
#ifndef mingw32_HOST_OS
import System.Posix.Signals
-#ifndef __ANDROID__
import System.Posix.Terminal
#endif
-#endif
newtype Seconds = Seconds { fromSeconds :: Int }
deriving (Eq, Ord, Show)
@@ -63,10 +61,8 @@ waitForTermination = do
let check sig = void $
installHandler sig (CatchOnce $ putMVar lock ()) Nothing
check softwareTermination
-#ifndef __ANDROID__
whenM (queryTerminal stdInput) $
check keyboardSignal
-#endif
takeMVar lock
#endif
diff --git a/src/Utility/Tmp.hs b/src/Utility/Tmp.hs
index 6a541cfe..6e04b107 100644
--- a/src/Utility/Tmp.hs
+++ b/src/Utility/Tmp.hs
@@ -1,4 +1,4 @@
-{- Temporary files and directories.
+{- Temporary files.
-
- Copyright 2010-2013 Joey Hess <id@joeyh.name>
-
@@ -11,24 +11,20 @@
module Utility.Tmp where
import System.IO
-import Control.Monad.IfElse
import System.FilePath
import System.Directory
import Control.Monad.IO.Class
-#ifndef mingw32_HOST_OS
-import System.Posix.Temp (mkdtemp)
-#endif
+import System.PosixCompat.Files
import Utility.Exception
import Utility.FileSystemEncoding
-import Utility.PosixFiles
type Template = String
{- Runs an action like writeFile, writing to a temp file first and
- then moving it into place. The temp file is stored in the same
- directory as the final file to avoid cross-device renames. -}
-viaTmp :: (MonadMask m, MonadIO m) => (FilePath -> String -> m ()) -> FilePath -> String -> m ()
+viaTmp :: (MonadMask m, MonadIO m) => (FilePath -> v -> m ()) -> FilePath -> v -> m ()
viaTmp a file content = bracketIO setup cleanup use
where
(dir, base) = splitFileName file
@@ -62,51 +58,6 @@ withTmpFileIn tmpdir template a = bracket create remove use
catchBoolIO (removeFile name >> return True)
use (name, h) = a name h
-{- Runs an action with a tmp directory located within the system's tmp
- - directory (or within "." if there is none), then removes the tmp
- - directory and all its contents. -}
-withTmpDir :: (MonadMask m, MonadIO m) => Template -> (FilePath -> m a) -> m a
-withTmpDir template a = do
- topleveltmpdir <- liftIO $ catchDefaultIO "." getTemporaryDirectory
-#ifndef mingw32_HOST_OS
- -- Use mkdtemp to create a temp directory securely in /tmp.
- bracket
- (liftIO $ mkdtemp $ topleveltmpdir </> template)
- removeTmpDir
- a
-#else
- withTmpDirIn topleveltmpdir template a
-#endif
-
-{- Runs an action with a tmp directory located within a specified directory,
- - then removes the tmp directory and all its contents. -}
-withTmpDirIn :: (MonadMask m, MonadIO m) => FilePath -> Template -> (FilePath -> m a) -> m a
-withTmpDirIn tmpdir template = bracketIO create removeTmpDir
- where
- create = do
- createDirectoryIfMissing True tmpdir
- makenewdir (tmpdir </> template) (0 :: Int)
- makenewdir t n = do
- let dir = t ++ "." ++ show n
- catchIOErrorType AlreadyExists (const $ makenewdir t $ n + 1) $ do
- createDirectory dir
- return dir
-
-{- Deletes the entire contents of the the temporary directory, if it
- - exists. -}
-removeTmpDir :: MonadIO m => FilePath -> m ()
-removeTmpDir tmpdir = liftIO $ whenM (doesDirectoryExist tmpdir) $ do
-#if mingw32_HOST_OS
- -- Windows will often refuse to delete a file
- -- after a process has just written to it and exited.
- -- Because it's crap, presumably. So, ignore failure
- -- to delete the temp directory.
- _ <- tryIO $ removeDirectoryRecursive tmpdir
- return ()
-#else
- removeDirectoryRecursive tmpdir
-#endif
-
{- It's not safe to use a FilePath of an existing file as the template
- for openTempFile, because if the FilePath is really long, the tmpfile
- will be longer, and may exceed the maximum filename length.
diff --git a/src/Utility/Tmp/Dir.hs b/src/Utility/Tmp/Dir.hs
new file mode 100644
index 00000000..64c57d60
--- /dev/null
+++ b/src/Utility/Tmp/Dir.hs
@@ -0,0 +1,67 @@
+{- Temporary directories
+ -
+ - Copyright 2010-2013 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Tmp.Dir where
+
+import Control.Monad.IfElse
+import System.FilePath
+import System.Directory
+import Control.Monad.IO.Class
+#ifndef mingw32_HOST_OS
+import System.Posix.Temp (mkdtemp)
+#endif
+
+import Utility.Exception
+import Utility.Tmp (Template)
+
+{- Runs an action with a tmp directory located within the system's tmp
+ - directory (or within "." if there is none), then removes the tmp
+ - directory and all its contents. -}
+withTmpDir :: (MonadMask m, MonadIO m) => Template -> (FilePath -> m a) -> m a
+withTmpDir template a = do
+ topleveltmpdir <- liftIO $ catchDefaultIO "." getTemporaryDirectory
+#ifndef mingw32_HOST_OS
+ -- Use mkdtemp to create a temp directory securely in /tmp.
+ bracket
+ (liftIO $ mkdtemp $ topleveltmpdir </> template)
+ removeTmpDir
+ a
+#else
+ withTmpDirIn topleveltmpdir template a
+#endif
+
+{- Runs an action with a tmp directory located within a specified directory,
+ - then removes the tmp directory and all its contents. -}
+withTmpDirIn :: (MonadMask m, MonadIO m) => FilePath -> Template -> (FilePath -> m a) -> m a
+withTmpDirIn tmpdir template = bracketIO create removeTmpDir
+ where
+ create = do
+ createDirectoryIfMissing True tmpdir
+ makenewdir (tmpdir </> template) (0 :: Int)
+ makenewdir t n = do
+ let dir = t ++ "." ++ show n
+ catchIOErrorType AlreadyExists (const $ makenewdir t $ n + 1) $ do
+ createDirectory dir
+ return dir
+
+{- Deletes the entire contents of the the temporary directory, if it
+ - exists. -}
+removeTmpDir :: MonadIO m => FilePath -> m ()
+removeTmpDir tmpdir = liftIO $ whenM (doesDirectoryExist tmpdir) $ do
+#if mingw32_HOST_OS
+ -- Windows will often refuse to delete a file
+ -- after a process has just written to it and exited.
+ -- Because it's crap, presumably. So, ignore failure
+ -- to delete the temp directory.
+ _ <- tryIO $ removeDirectoryRecursive tmpdir
+ return ()
+#else
+ removeDirectoryRecursive tmpdir
+#endif
diff --git a/src/Utility/UserInfo.hs b/src/Utility/UserInfo.hs
index dd66c331..17ce8db5 100644
--- a/src/Utility/UserInfo.hs
+++ b/src/Utility/UserInfo.hs
@@ -14,12 +14,14 @@ module Utility.UserInfo (
myUserGecos,
) where
-import Utility.Env
-import Utility.Data
+import Utility.Env.Basic
import Utility.Exception
+#ifndef mingw32_HOST_OS
+import Utility.Data
+import Control.Applicative
+#endif
import System.PosixCompat
-import Control.Applicative
import Prelude
{- Current user's home directory.
@@ -45,8 +47,8 @@ myUserName = myVal env userName
#endif
myUserGecos :: IO (Maybe String)
--- userGecos crashes on Android and is not available on Windows.
-#if defined(__ANDROID__) || defined(mingw32_HOST_OS)
+-- userGecos is not available on Windows.
+#if defined(mingw32_HOST_OS)
myUserGecos = return Nothing
#else
myUserGecos = eitherToMaybe <$> myVal [] userGecos
@@ -55,9 +57,13 @@ myUserGecos = eitherToMaybe <$> myVal [] userGecos
myVal :: [String] -> (UserEntry -> String) -> IO (Either String String)
myVal envvars extract = go envvars
where
+ go [] = either (const $ envnotset) (Right . extract) <$> get
+ go (v:vs) = maybe (go vs) (return . Right) =<< getEnv v
#ifndef mingw32_HOST_OS
- go [] = Right . extract <$> (getUserEntryForID =<< getEffectiveUserID)
+ -- This may throw an exception if the system doesn't have a
+ -- passwd file etc; don't let it crash.
+ get = tryNonAsync $ getUserEntryForID =<< getEffectiveUserID
#else
- go [] = return $ Left ("environment not set: " ++ show envvars)
+ get = return envnotset
#endif
- go (v:vs) = maybe (go vs) (return . Right) =<< getEnv v
+ envnotset = Left ("environment not set: " ++ show envvars)