From b32beb082d502af19095aaf17a8c98dcc546f183 Mon Sep 17 00:00:00 2001 From: Daniel Quathamer Date: Wed, 13 Nov 2024 08:57:37 +0100 Subject: [PATCH] =?UTF-8?q?Entladen=20und=20Hochladen=20von=20anderen=20Ta?= =?UTF-8?q?bellengruppen=20#5=C2=A7=20=C2=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.xml | 25 + .../module/etl/bin/etl_execute_unload_job.x | 47 + .../module/etl/bin/etl_execute_upload_job.x | 47 + src-modules/module/etl/conf/etl.xml | 177 ++- .../etl_step_sichten_trans.sql | 62 + .../etl_step_users_and_groups_trans.sql | 52 + .../etl/schluesseltabellen/etl_transfer.xsl | 1021 +++++++++++++++++ src/de/superx/elt/EtlActionJob.java | 7 + superx/WEB-INF/lib/superx-etl.jar | Bin 80564 -> 80514 bytes 9 files changed, 1437 insertions(+), 1 deletion(-) create mode 100755 src-modules/module/etl/bin/etl_execute_unload_job.x create mode 100755 src-modules/module/etl/bin/etl_execute_upload_job.x create mode 100644 src-modules/module/etl/schluesseltabellen/etl_step_sichten_trans.sql create mode 100644 src-modules/module/etl/schluesseltabellen/etl_step_users_and_groups_trans.sql create mode 100644 src-modules/module/etl/schluesseltabellen/etl_transfer.xsl diff --git a/build.xml b/build.xml index 55b8482..39d50af 100644 --- a/build.xml +++ b/build.xml @@ -76,6 +76,8 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath + + @@ -99,6 +101,29 @@ ant -DWEBAPP=$WEBAPP cleanBuildPath + + + + + + + + + + + + + + + + + + + + diff --git a/src-modules/module/etl/bin/etl_execute_unload_job.x b/src-modules/module/etl/bin/etl_execute_unload_job.x new file mode 100755 index 0000000..c979c89 --- /dev/null +++ b/src-modules/module/etl/bin/etl_execute_unload_job.x @@ -0,0 +1,47 @@ +#!/bin/bash +#Änderungen +#--------------------------------------------------------------------- +# Shell-Kommando "etl_execute_unload_job.x" +# +#--------------------------------------------------------------------- + +if [ "$1" = "" ] + then echo "Aufruf: etl_execute_unload_job.x job_uniquename FILTER " + echo " " + echo "Aktion: etl_execute_unload_job.x entlaedt Tabellen." + echo " Mit Hilfe von etl_execute_upload_job.x koennen diese Daten importiert werden." + echo " " + exit 0 +fi + +#------------------------------------------------------------------- +#-- Metadaten entladen +#------------------------------------------------------------------- + +JOB_UNIQUENAME=$1 + +FILTER=$2 + +if [ "$3" == "" ] + then outfile=$JOB_UNIQUENAME.xml +else + +outfile=$3 + +fi + + + +SX_CLIENT=jdbc +export SX_CLIENT +CP=".:$JDBC_CLASSPATH" + +CMD="java $JAVA_OPTS -cp $CP de.superx.elt.bin.EtlJobExecutor -dbproperties:$DB_PROPERTIES -job:$JOB_UNIQUENAME -outfile:$outfile -params:$FILTER" + +echo $CMD + +$CMD + + + + diff --git a/src-modules/module/etl/bin/etl_execute_upload_job.x b/src-modules/module/etl/bin/etl_execute_upload_job.x new file mode 100755 index 0000000..c012db8 --- /dev/null +++ b/src-modules/module/etl/bin/etl_execute_upload_job.x @@ -0,0 +1,47 @@ +#!/bin/bash +#Änderungen +#--------------------------------------------------------------------- +# Shell-Kommando "etl_execute_unload_job.x" +# +#--------------------------------------------------------------------- + +if [ "$1" = "" ] + then echo "Aufruf: etl_execute_upload_job.x job_uniquename FILTER " + echo " " + echo "Aktion: etl_execute_upload_job.x laedt Tabellen." + echo " " + echo " " + exit 0 +fi + +#------------------------------------------------------------------- +#-- Metadaten entladen +#------------------------------------------------------------------- + +JOB_UNIQUENAME=$1 + +FILTER=$2 + +if [ "$3" == "" ] + then infile=$JOB_UNIQUENAME.xml +else + +infile=$3 + +fi + + + +SX_CLIENT=jdbc +export SX_CLIENT +CP=".:$JDBC_CLASSPATH" + +CMD="java $JAVA_OPTS -cp $CP de.superx.elt.bin.EtlJobExecutor -dbproperties:$DB_PROPERTIES -job:$JOB_UNIQUENAME -params:PATH_TO_INPUTFILE=$infile" + +echo $CMD + +$CMD + + + + diff --git a/src-modules/module/etl/conf/etl.xml b/src-modules/module/etl/conf/etl.xml index cc28396..e753a1d 100644 --- a/src-modules/module/etl/conf/etl.xml +++ b/src-modules/module/etl/conf/etl.xml @@ -1,6 +1,6 @@ - @@ -161,6 +161,174 @@ parent="Laderoutinen">Abfragen zur Administration + + +Entlädt und lädt die User- und Gruppen-Rechtetabellen zur Übertragung in eine andere Säule + + + +Userinfo-ID. Wenn 0, dann werden alle User geladen +0 + + + +User-Daten +Gruppen-Daten + + + + +tid=$TID or $TID=0 +benutzer + + + + userid=$TID or $TID=0 +1,2 + + + + userinfo_id=$TID or $TID=0 +1,2 + + + + userinfo_id=$TID or $TID=0 +1,2 + + + + userinfo_id=$TID or $TID=0 +1 + + + + userinfo_id=$TID or $TID=0 +1,2 + + + + userinfo_id=$TID or $TID=0 +1,2 + + + + + + tid in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +name + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + groupinfo_id in (select groupinfo_id from user_group_bez B + where B.userinfo_id=$TID) + or $TID=0 +1,2 + + + + + + + + + + + + + + +Entlädt und lädt die Sichten zur Übertragung in eine andere Säule + + + +Sicht-TID. Wenn 0, dann werden alle Sichten geladen +0 + + + +Sichten + + + + +tid=$TID or $TID=0 +name_intern + + + + + + + + + + + + +Entlädt und lädt die Beschriftungen zur Übertragung in eine andere Säule + + + +Caption-TID. Wenn 0, dann werden alle Beschriftungen geladen +0 + + + +Beschriftungen + + + + +tid=$TID or $TID=0 +id,table_name,field_name,record_no,locale + + + + + + + + + + @@ -169,6 +337,9 @@ parent="Laderoutinen">Abfragen zur Administration + + + @@ -199,6 +370,10 @@ version integer + + + + diff --git a/src-modules/module/etl/schluesseltabellen/etl_step_sichten_trans.sql b/src-modules/module/etl/schluesseltabellen/etl_step_sichten_trans.sql new file mode 100644 index 0000000..52cc7a2 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/etl_step_sichten_trans.sql @@ -0,0 +1,62 @@ +begin work; + +delete from sichten where name_intern in (select name_intern from tmp_sichten); + +insert into sichten(parent, + systeminfoid, + art, + type, + name_intern, + name, + beschreibung, + sortnr, + quelle, + alt_hier_id, + treecfgtable, + treecfgid, + label, + user_rechte, + rechtequelle, + sesamkey, + standbutton, + attribut1, + attribut2, + attribut3, + attribut4, + xmlmaxentries, + gueltig_seit, + gueltig_bis, + cacheapplet, + cachexml, + aktiv) select parent, + systeminfoid, + art, + type, + name_intern, + name, + beschreibung, + sortnr, + quelle, + alt_hier_id, + treecfgtable, + treecfgid, + label, + user_rechte, + rechtequelle, + sesamkey, + standbutton, + attribut1, + attribut2, + attribut3, + attribut4, + xmlmaxentries, + gueltig_seit, + gueltig_bis, + cacheapplet, + cachexml, + aktiv from tmp_sichten; + +drop table tmp_sichten; + +commit; + diff --git a/src-modules/module/etl/schluesseltabellen/etl_step_users_and_groups_trans.sql b/src-modules/module/etl/schluesseltabellen/etl_step_users_and_groups_trans.sql new file mode 100644 index 0000000..53e898c --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/etl_step_users_and_groups_trans.sql @@ -0,0 +1,52 @@ +begin work; + + +delete from userinfo where benutzer in (select benutzer from tmp_userinfo); + +delete from user_institution where userid in (select userid from tmp_user_institution); +delete from user_masken_bez where userinfo_id in (select userinfo_id from tmp_user_masken_bez); +delete from user_sachgeb_bez where userinfo_id in (select userinfo_id from tmp_user_sachgeb_bez); +delete from user_pw where userinfo_id in (select userinfo_id from tmp_user_pw); +delete from user_sichtarten where userinfo_id in (select userinfo_id from tmp_user_sichtarten); +delete from user_sichten where userinfo_id in (select userinfo_id from tmp_user_sichten); +delete from groupinfo where tid in (select tid from tmp_groupinfo); + +delete from group_field_pref where groupinfo_id in (select groupinfo_id from tmp_group_field_pref); +delete from group_masken_bez where groupinfo_id in (select groupinfo_id from tmp_group_masken_bez); +delete from group_sachgeb_bez where groupinfo_id in (select groupinfo_id from tmp_group_sachgeb_bez); +delete from group_sichtarten where groupinfo_id in (select groupinfo_id from tmp_group_sichtarten); +delete from group_sichten where groupinfo_id in (select groupinfo_id from tmp_group_sichten); +delete from user_group_bez where groupinfo_id in (select groupinfo_id from tmp_user_group_bez); + + +insert into userinfo select * from tmp_userinfo ; +insert into user_institution select * from tmp_user_institution ; +insert into user_masken_bez select * from tmp_user_masken_bez ; +insert into user_sachgeb_bez select * from tmp_user_sachgeb_bez ; +insert into user_pw select * from tmp_user_pw ; +insert into user_sichtarten select * from tmp_user_sichtarten ; +insert into user_sichten select * from tmp_user_sichten ; +insert into groupinfo select * from tmp_groupinfo ; +insert into group_field_pref select * from tmp_group_field_pref ; +insert into group_masken_bez select * from tmp_group_masken_bez ; +insert into group_sachgeb_bez select * from tmp_group_sachgeb_bez ; +insert into group_sichtarten select * from tmp_group_sichtarten; +insert into group_sichten select * from tmp_group_sichten ; +insert into user_group_bez select * from tmp_user_group_bez ; + +drop table tmp_userinfo; +drop table tmp_user_institution; +drop table tmp_user_masken_bez; +drop table tmp_user_sachgeb_bez; +drop table tmp_user_pw; +drop table tmp_user_sichtarten; +drop table tmp_user_sichten; +drop table tmp_groupinfo; +drop table tmp_group_field_pref; +drop table tmp_group_masken_bez; +drop table tmp_group_sachgeb_bez; +drop table tmp_group_sichtarten; +drop table tmp_group_sichten; +drop table tmp_user_group_bez; + +commit; diff --git a/src-modules/module/etl/schluesseltabellen/etl_transfer.xsl b/src-modules/module/etl/schluesseltabellen/etl_transfer.xsl new file mode 100644 index 0000000..96f6619 --- /dev/null +++ b/src-modules/module/etl/schluesseltabellen/etl_transfer.xsl @@ -0,0 +1,1021 @@ + + + + + + + + + + + +-- XML-generiertes SQL-Script fuer psql +--von etl_transfer.xsl + + + + + --ETL-Transfer : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +drop table if exists tmp_; + + + + + +create temp table tmp_etl_step( +tid INTEGER, +uniquename VARCHAR(255) , +caption VARCHAR(255) , +systeminfo_id INTEGER not null, +step_type INTEGER, +step_type_uniquename VARCHAR(255), +sortnr SMALLINT not null, +force_continue SMALLINT, +etl_job_id INTEGER , +parent_step_id INTEGER , +parent_step_uniquename varchar(255), +parent_job_uniquename varchar(255), +logfile varchar(255), +custom_step smallint, +already_exists smallint +) +; + +create temp table tmp_etl_job( + tid INTEGER, +uniquename VARCHAR(255) , +caption VARCHAR(255) , +systeminfo_id INTEGER not null, +logfile varchar(255), +already_exists smallint, +custom_job smallint +) +; + +create temp table tmp_etl_job_param( + tid SERIAL not null, +etl_job_id INTEGER , +uniquename VARCHAR(255) not null, +name VARCHAR(255) , +param_default VARCHAR(255) +) +; + + +create temp table tmp_etl_step_property( + tid SERIAL not null, +etl_step_id INTEGER not null, +prop_name VARCHAR(255) , +prop_value text + +) +; + +create temp table tmp_etl_step_relation( + tid SERIAL not null, +step_id INTEGER not null, +parent_step_id INTEGER , +job_id INTEGER not null, +force_continue SMALLINT default 1 , +step_active SMALLINT default 1, +sortnr SMALLINT default 1, +custom_step SMALLINT default 1 + +) +; + + + + + + + + + + + + +truncate table tmp_etl_job; +truncate table tmp_etl_step; +truncate table tmp_etl_job_param; +truncate table tmp_etl_step_property; +truncate table tmp_etl_step_relation; + +--tids der jobs dürfen sich nicht ändern, daher +-- +-- 1. vorh. Jobs updaten +-- 2. neue Jobs einfügen +-- 3. alte Jobs löschen + +insert into tmp_etl_job(uniquename,caption,systeminfo_id,logfile,already_exists,custom_job) +values ('', +'', +, +'',0,2); + + + +update tmp_etl_job set tid=J.tid, +already_exists=1, +caption=J.caption, +logfile=J.logfile, +custom_job=J.custom_job +from etl_job J where J.uniquename=tmp_etl_job.uniquename +and J.systeminfo_id=tmp_etl_job.systeminfo_id +; + +--neue jobs: +insert into etl_job(uniquename,caption,systeminfo_id,custom_job) +select uniquename,caption,systeminfo_id,custom_job +from tmp_etl_job +where already_exists=0; +--tid von neuen Jobs ermitteln: +update tmp_etl_job set tid=(select J.tid +from etl_job J where J.uniquename=tmp_etl_job.uniquename +and J.systeminfo_id=tmp_etl_job.systeminfo_id) +where already_exists=0 +; + +--TODO +--obsolete Jobs: sollen bei Deinstallation des Moduls entfernt werden + + + + + + + + + + + +insert into tmp_etl_job_param( +etl_job_id , +uniquename, +name , +param_default) +select J.tid, +'', +'', +'' +from tmp_etl_job J +where J.uniquename='' +; + + + + + +insert into tmp_etl_job_param( +etl_job_id , +uniquename, +name , +param_default) +select J.tid, +'FORMAT', +'Format', +'XML' +from tmp_etl_job J +where J.uniquename='' +; + + + + + +insert into tmp_etl_job_param( +etl_job_id , +uniquename, +name , +param_default) +select J.tid, +'PATH_TO_OUTPUTFILE', +'Ausgabedatei', +'$SUPERX_DIR/db/.xml' +from tmp_etl_job J +where J.uniquename='' +; + + + + + + + +insert into tmp_etl_job_param( +etl_job_id , +uniquename, +name , +param_default) +select J.tid, +'PATH_TO_INPUTFILE', +'Eingabedatei', +'$SUPERX_DIR/db/.xml' +from tmp_etl_job J +where J.uniquename='' +; + + + + + + + +--erst job-params einfügen: + +delete from etl_job_param +where etl_job_id in ( + SELECT distinct + etl_job_id +FROM tmp_etl_job_param ) + ; + +insert into etl_job_param +( + etl_job_id, + uniquename, + name, + param_default + ) + SELECT + etl_job_id, + uniquename, + name, + param_default +FROM tmp_etl_job_param + ; + + + + + + + + + + + + + +--Gruppe + + + + + + + + + + + + + + + +--Unload + + + + + + + + + + + + + + + + + + + + +--Upload + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +--nun steps einfügen: + + +update tmp_etl_step set step_type=(select T.tid from etl_step_type T +where T.uniquename=tmp_etl_step.step_type_uniquename); + +--select * from tmp_etl_step +--where step_type is null;--_uniquename from tmp_etl_step; + + +--vorhandene Steps erkennen: + +update tmp_etl_step set tid=S.tid, +already_exists=1, +caption=S.caption, +logfile=S.logfile, +custom_step=S.custom_step +from etl_step S where S.uniquename=tmp_etl_step.uniquename +and S.systeminfo_id=tmp_etl_step.systeminfo_id +; + +--neue Steps einfügen: +insert into etl_step( + uniquename, + caption, + systeminfo_id, + step_type_id, + logfile, + custom_step) +select + uniquename, + caption, + systeminfo_id, + step_type, + logfile, + custom_step +FROM tmp_etl_step +where already_exists=0 +; + +--tid von neuen steps ermitteln: +update tmp_etl_step set tid=(select S.tid +from etl_step S where S.uniquename=tmp_etl_step.uniquename +and S.systeminfo_id=tmp_etl_step.systeminfo_id) +where already_exists=0 +; + +--parent ermitteln: +update tmp_etl_step set parent_step_id=(select S.tid +from etl_step S where S.uniquename=tmp_etl_step.parent_step_uniquename +and S.systeminfo_id=tmp_etl_step.systeminfo_id) +; + + + + + + +delete from etl_step_relation +where job_id in (select J.tid +FROM tmp_etl_job J) +and custom_step=2 + ; +--jetzt step-relation: +insert into tmp_etl_step_relation( + step_id, + parent_step_id, + job_id, + force_continue, + step_active, + sortnr, + custom_step +) +select + tid, + parent_step_id, + etl_job_id, + 0 as force_continue, + 1 as step_active, + sortnr, + 2 +FROM tmp_etl_step + ; + +insert into etl_step_relation( + step_id, + parent_step_id, + job_id, + force_continue, + step_active, + sortnr, + custom_step +) +select + step_id, + parent_step_id, + job_id, + force_continue, + step_active, + sortnr, + custom_step +FROM tmp_etl_step_relation + ; + + + + + + +delete from etl_step_property +where etl_step_id in (select T.tid +FROM tmp_etl_step T ) + ; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +--einfügen in echte Tabelle: +insert into etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.etl_step_id, + T.prop_name, + prop_value +FROM tmp_etl_step_property T +; + + + + + + + + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'msg', + ' + +' +as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + + + + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'PATH_TO_INPUTFILE', + ' + +' +as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + + + + + + + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'select_stmt', + 'select * + + from + + where + + + order by + +' +as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + + + + + + + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'select_stmt', + 'drop table if exists tmp_ +' +as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'select_stmt', + 'select * + + into tmp_ + from + where 1=0' +as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'target_table', + '' as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'format', + 'XML' as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'search_path', + '/etlAction/unload [@name="unload_"]/rs/row' as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + +insert into tmp_etl_step_property( + etl_step_id, + prop_name, + prop_value) +select + T.tid as etl_step_id, + 'path_to_inputfile', + '$PATH_TO_INPUTFILE' as prop_value + +FROM tmp_etl_step T +where uniquename ='' +; + + + + + + + + + + + +, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +insert into tmp_etl_step( +uniquename , +caption , +systeminfo_id , +step_type_uniquename, +sortnr, +force_continue, +etl_job_id , +parent_step_uniquename, +parent_job_uniquename, +logfile, +custom_step, +already_exists +) +select '', +'', +, +'' as step_type_uniquename, + + 10 as sortnr, +0 as force_continue, +J.tid as etl_job_id, +'' as parent_step_uniquename, +J.uniquename, +'' as logfile, +2, +0 +from etl_job J +where J.uniquename='' +and J.systeminfo_id=; + + + + + + + + +drop table tmp_etl_step; +drop table tmp_etl_job; +drop table tmp_etl_job_param; +drop table tmp_etl_step_property; +drop table tmp_etl_step_relation; + + + + diff --git a/src/de/superx/elt/EtlActionJob.java b/src/de/superx/elt/EtlActionJob.java index d80b091..f19ecda 100644 --- a/src/de/superx/elt/EtlActionJob.java +++ b/src/de/superx/elt/EtlActionJob.java @@ -219,6 +219,13 @@ public class EtlActionJob extends EtlAction { } else { + if(jobReturnCode==1) + { + System.err.println(super.getActionLog()); + throw new Exception("Fehler bei Jobausführung"); + } + else + System.out.println("Jobausführung Erfolg"); try { de.superx.elt.EtlUtils.saveFileContentsWithEncoding(outfile, sw.toString(), null); } catch (Exception e) { diff --git a/superx/WEB-INF/lib/superx-etl.jar b/superx/WEB-INF/lib/superx-etl.jar index c9d26a9750d21d56243d2b29dd9b42f20b4a4a52..5868d66aff10c4bd2b889b34908f6c273b6d8dfa 100644 GIT binary patch delta 11209 zcmaJ{byU<})87RIq`SMjI|T%!yGsdyML=mJmhN6)=?3YLZjkO;K#*>b4n+ifQGQSO z{PEs%_IzjOerD!Q-0wL%J9SqG0apkZ>PqkkC;$L503cRxXAqCUh%Nf?d>`xw$^`%b z2M-@SC^;vP5NxH|j`E2MYX#mjG)jbyPCjU{Vzy5T3-2AIm=SSNe_Gq+Y@uB!Y;ybf z+Slic%O$@Qgqvi%}f1 zgPv12)|m1p4;*I*3v}er8b4Pxvy*fo%Fd`*tn4O`;c^Nm*-n5ZDp|?-BeDV%?c_dY zs-f>U2ybzjgHP;ab;l+C;|lplI|B$IkR0I;Aq1pD`0X6zC6MWnhyn^c68%87N8%fh z{gGgVV@5>&6N}nNxM;*b%v!RiS@4fk2iozIN2(fU9r#Ek;Wfiy{5G(al|Y#Y4* zK~zY2Yhwwk|B;d*ZAHNTjgWXDESmff>s0~(fE=>ML{iI4RfPOU_%)rz$|2@M8Ym&l zOhRB_dN*0J-bYJR+KsF3S0hxkBhm?+95o4Y(~D&$p6+uE%5e75?}G#i?Wg-yl_1Z| z6;E6{tu%<4aF7>`VDC-mQ$9ex!%aop*SifCs?f6EJ6n_l7NC z#Oed3K-TnG9VJPOo;ltG({QctEq+IN$OL%*+D;OUOmFO|tnW(K>fW`HB%F}L+LNn0 zMf!a+ov}#JbwW0&neN!U_Jw=t4=+j6?s-@5o~|lsnBtllm zXxKdX(eD*fsU=FOw?njv@@6c}_cTi)vquYtV@<{SSwJcNB_AUK62=~mNmNMjrPuYB`!Cn4} z(49p-wLJCBgO7VfVy(bD{46OTf_!Mb`*Sf>*Z9u!H+uc5&l&Cgvp2K0uJzfnNXw&D zg=;JWShZ4nU%r_>jx5T9*h)d%9s0xjzWmf2Viw)*J>;91oAyGft+9;Rozor#*Jwpt zlaH|E`)*7$@2>yvQ7sL3@)C zPV_{g(;DWWX3ey>;wE}r=PrC!CZFg)n$Uwcn$64|NHOuHD<#jtwDBE5coN_CW&`iD z%n4glG3ea3t)oJ*=QsR=6vN7WaJKE{BC$ZH2*0Wzn$T2yCTYHw@b;~Vm;9S~Sz8m1 zg00~;*o*2tA7cG?97^=eUjlG`M$s`cLc+iKx8J#m;JV*Hyb>)eVsdhOkCySo59pEt ztVHpY=&N|OR?f*AYGZ#|2Ie>^PI;N2raOQ$#R;~5xD<-A^o8Zo~1hROOy#CzLEctsH;>^ zY|xnQf$G{E_ChvpdfVKDgZg-q^qZ*{-R3C1*s|ie)syX|<^ai|JdvZ%T6YZ)1^TwI zs+0^0Dg~~S(U-coOZjEu4q%6QXvU(75Rp5+%LJRs4;ERbf@V<`8b14s>BLq~-u?1GhL zXTv9-YoPGOjjH=y9VfI*<2h&zr=@)2K-_<$&@bE!dk&{i56b3cl}Uh(zV%zhZhmbZ|6vxrS+jAx%~ zo5#RmczfD*82=oorTgMJG^waOVb;Z)x){k}kJ%%udo}YjdGvrBJBfeTz2;&J??wf> zz3Q7fR~aMhQX!%a9PiF6fpFmJxCv5OU*8 zWQv-kj#`gs;eH<>(W*?u*vVwpW9BtupGW36!<7z;gv?cw*Ajv8=UOVe%UZnmKu1v(#w<6em! z{m#(RWTY}sANn-7YQ&E@@MCJXIrC^Nx9PWq(axXF-8^fEBhPHB(eMJSa@fVk5Hh0Z z`x7p;?7&8gV@_`U+98$=2e?hB?~k?2d$DZySp_T0-rPl+T;Fs z<6eGsmoCuquAspPz9RTOPDZ~PQ3;t@ltKqd|E}4O#6>0=Y`6u5wD;v#+&5%!m6_a` zkc68GO|w(8rkZaU_RQ#pj~fs9l^Z##_0DFHr`M&#VZR4WMTKb+L9=L!;8wQu6MVHL z7HN#|sovlkS04xz>cyh)Q_c2s>0P~b(mCmGLzx9f*jX%?#w)IKm}N?vRT^*t#p9JM zraDX8sk%uzIW)9Fte!(PwBFz+H$TC z)R)@Dp=BQQYJqyhnyPCbpP1V{X2=_az0xX}RG@nV-Y3d56RLeJWMqC}zI*5T+Fyo} zuS~k6mI7ZpJ;+0SmE|QGA}6fYUeM?~My<#}zeay*MPL)w%RWUFqEh zG>3W%DvY(UGt)leDqqq&Q~K@a)X!-Th`-odd5c_CG!yWB4yPu&Cz^LOsi&3|g+ z7gKTSK#5WQOe@-0{PpU+R}1TULD4SLgaclAc5RqM^u+>bqOHC~v&0g_fUFf0sz1Kd#Jd3N}uRRUY(`=S@QAZ)M?`WA_o zmWuJod=%?k^w@Ik_*|B1{^Zn@2B(RE(#P`;@E5UZx1@WQr+T`jWSo_vA3Vp!Y(?Nn zoI31N>a;djF7hwgYaB3=osoG6jm**n%k8)bj&~>c`uB%)3vV-JJUZ~d72_ll6p#y8 zWq?bfvOV!5Zk(~Vix7m9&0HGduvP4arAF^G2 zGV4%V%FN5+d80)Z-8CSYBe68yvV~0NjkfrWmdOjPLw-rcwqcgZqBY3q3)XW{vY1aR z0+!XJZ@s(*RhL#wzwtE=DEfQh_xK2hkP7QMyRIkGGD)JgS~1BZf!?K#R1SU7eyIlq zTQD|}Q;w1^AIEfSQ3ju^e|m?{Q8Odne@Ull)>Qpl67LUh~ zVnGSeZhEZ~WuW1#nmL;-$~x%;r?Z}%U+jU_BJ#2Pd8ZEF8VIGXXzTN{_0Is`vDuUP zWfSv_p2O=G*T`V^^?VA()v}>^S<~Nfnb*pl~^&=sc_D!6#Rj(Ef39_Ol)>R-v>ZQ-g6$n&M}eR$md;j& zN=6Egb|*#FMX(fFAry2Z6hL~$=J08xiMVQ$plvMa0~Z~M1LXbl!lykSv1q6LHJT9{ zE-jQpei*KVKTVZWmWU#E!gL$VUOnyq6Ft^vuH>LlbpXt==5KGUZK4qdrRO;%FlvyF*LF=AjW2S z;y{R6R%d&Q;S2p%GBbTGWV>wxOSl&Q<`Ptw*%T@cKX1o+`turId&93ST#{}q_UD$X zH(YiBKjx6#HSI08)Mlc0V#1;PGd_?zAiF3NU;8rW25-!6?;4jJJPiINalhv3|NU)n zj2B^MF9r16T13Jbr(Q&YRYc-DMS{q&UD|hyPbbe>n>GXb;da<|Pkg;sdNR)61!&>A zdKH(?pqb)7-O3lv`Lqt=xOb>=f^;U62+-Nf zfdYmq4Lt%^*zS{CdM^pkM@lp8IJvu+%~zFWImxj&beK{fDlyl%yb$Z}h&p;*lVCsG z#&MU5J;`Eg^ysfNx20|4a7YI=OLO2-;ff`C?VkCAh{60qiV7-wi-g8uXgM;i%fW-7 za+oH^^SLzxLrp15_AH2?aaei&eG&&6l1X(N;SO_4;~cya-n{~lT<81Qocp_3g*PMJ zTg(Dio*q7*Wahkog=;FFB`&F+j!$D{q^BDW98`1TElM{eaop;@RT_M2UYd+amF%Ua_;QXlm_|DibF#9$-;?kv=yl7Fu4^Lc{+W{WJszdK{+iHU0Xv^BqgFaEo4fXM3$c~8DuNQUZkL{#%uF* ztWZahL4<=hB8l2atLWS_N|y>MVYZ)%*Ti0{p5=gMt@6!^VV8L%T@1I?lGwzsAso)+ z&5i3<(7DEQEuyWMb0%b0a6C1EZo}|IcbKylrrg|?Wp5RV+bc_^t|>7ydyp4LQ+rJ~v4;@{@UwaypN-w%?9?s-xx? z=){9_I5gOw5rsBB_M)1R*4jV5*6Y<4e{4LpF!4eKBkk^%C0$B-{PKGqCkdkF96~wM z??emijI^HO#6Nsg<-j4YiEOWkh&2d^P@c39q41Tru*IDu`5302wIFU%}O}=g6iCo7f4w2v6TVqL5IP7ZLcDBTrJIX5mMa}rNhqs(^yGEk;5ZkFm zpQ6&B!Rz2xJuI{`U%G{YtkgA?%30lKikvUm?@*uquY z;AQXY#XIvLvffk)D}VEEH6!JrPg-7c)3MvlThyIa;svh>_Dk-PIA zem@FydZ$`tIyqCenhLp#Zx(+irDng3Vt=$JYqWYMb~YHrH21zvZW9)g^h6E>+^aU4 zj8V7SGe#}Q`M?HlcxC3kNp#YUy@C|&h2`bTWVb$*8Z2+IUdQHbiD$sTk`LP>`$ROW zMHIV**H2V0&+#hifH`WQdS&%JcE}nbc7K+znw5*1T-NB&;OC_eJS~j0YX0#b9+F^k zqOIrz`ks=tc=twCu7BI@wZ(g$b1@>%Ttc~y^9+L$78y#gO$jlwxYHaX(s|j1bvQ{B z&NG;l7gH&ptS4uYt;0x`&Dj&5FE)qg?Aka)jj4+C3{u|7Vt3WQdbyDAZ)W6Yv)T2~>|4a$cV-Vx{k*ErqO++Z zyoWc1!w=Nt;;zgtRmZKb6R3rt=LBMCx^T}b?Y|7ZDrL>g!PRd{vV;$oy&t;KW|XoD7}qtdO9f$n z!g$KIqUg#5LrQ*;o9Uh8qgYb__Ff<`Y^ZL(i2ZP*AKex1P3?7S1nCs`yrfT z_s)16QwN4YSTQn!&(3P%%XoBzDV6+TCvcF@9b7HA#zpMstC4q9hda;#)5`m5OE&HJ zwt96#+wEDn2(#ZkRgBTnC)4U#TIY#b`HWrqZV9N{i zd^^~&OBsp6_cD#kCK8#d5^>vBmRwAj&<)OqPOYQD#I$0xJ!vz3bSfA3XSs?@D;?@} zsbEmVqS=^kt#*A{elnaIS>;X{qH7LF1GO&C6g`*{z2if1$(k!C2@=UnZre{y?&49Z z$Q{2EpIKi^3#b*SNEbF>E3iiaaIZ<#^}Bh)(p4F&;kw-?xXMDLc)%+H6F`3Mn zma6NHuXiC8y#Cs-YY1*||LsdjXduH9I=FPwZffDONCes0-X6_eeO+}C^73i2$hFrZ zQsKc#$#as94{(Jdwp94~pj<)e7IvM$hy;6I`8&4yV%(iCNEVlICUUO;!$EBXu-mOm zY4lBGq!FPn-Tt?#ODGquv57QuhYls71?>1SeO<@MD7v_VReTp8B1BE!aUXG}$bc<^ zm25aoC~`+Ewj&r=3=c>S*Siv0n2wD0!b&8j3>r@cOFE=F(s{96)!46Ps&CCbwnT>Y zuC()#HG>W1cwxEP6}pp}#X)Esvl6z=?k`S@LELy!w=S9AR2gh$K_^=?NIWS~s!Q)L zEKfea%e-cOBO>WFe=bTnu}v8({sp|(JbkgX(FV_If@x~&ke{FIn2&X@%O1KcfULPB z9c{#9ypOAwWPu~5HzoiwG*BScGdF&; zV83Hgu~DpmLs4?D6e>ISnb+C3amK(Md*THZKSc;Ahi3K#L>t#~7A>{B=ry<=F=7Qy zCc68@rr&9WOR6G>n8U3xCEQ2v{WA$f6s5XhJ(;vh)gJi~8-K$} zjKI-!+cd*mjL?^|b3Y@?(}&z#=OGP+G1aj6WJ3k4)2w~fyDE8iN*@LR0k=ey5*_tW z#5anet`@WeJvbnX`$Lx~`!R4t%|O$(7&GJ2NA~Rkcc=X>wvA*}Tp_`@073%yuQ5yz zVWW}?9?Sy=*FMiy)~;Pz8ib3PuT_1cIi^-7BA=?{KTmR-2lj@=cf-{N##p^CxX5>T z$4lOr6qCK-c;cfRli>a@@}R^ah*1il5I)(1E(FMeBSYEk^E^A=Cc9=@+#F~zXViU z%nU59dP8}w+4n^IHLx6TOiwW`v;RBBVhE5yHMeY*bC2OlX)#Z=Z~#`d&+IB9UNxQr zg~{n}q=pf9=BmLKE|Wy$@r#|`ok?N}R$TaFar%XJVo}_g>lAWmTpgge7PR0PIwgU0 z^~x+@{Gf^!05t8DmHCvdHGV3r4Og{>s!aUrD&nYUvdy8YqQQZX61gMB zAp%pK8!`IlrWCQ=f}IBj@YYY1_vd3>~NcoZYtAlSBA5(eJ=tZW!f3;rnjruo!r{l#&g>A zc>XHlkxV&x^-;1TaT1-|z*QRJ+aAnl`EVJ#QmOE;E;zDx2A zy04`8unWTltIvYFinEG1VZ4|1?=k!iv(=AxUm0^2V;`(G;dR2nd*LJ9w+N&#kbOmb zz6{B6LTnGKSCdoNxP(Qas9kA$JZVRxhc?AmG1$=acY{+yv?UJn5D_fw- z2;6!|B${(<@fR|+tIoo8dC_0Gyi8$}+Vpc#+c9$kpInx&9P@VO*9^k{SWVDM!C(iJ zIoJs6WbTxlBA&Bbu{NyT0bIsTo ze<|w>EG0_rCg8S7$NS!bN|M)bF9W(S%vr7RJrRR_7}ZcJW&NY#SC|-mn@ab&w+dtB z3zM*o7cUt!PjbIWOnye%(#wW3@eY~!NfxuuTB>0Nj|`S6gEiI}9{C~qVjg`hSY6Az z^AgzS7|#zC&d%C~d!O`k8fht3Vn_NW0cjG00-Q2csawu9<6QZ*9Y>WqP|*!8(!2QN zhiH9eHAiON)jJmPQr}=x+--7X>O5=DOEUzVDPGAsZ{L2MaXh{K`7Rkx5RC}j6XxTB z@P(scJIc$lF`k6B3rZkLw0A(aF9 z7CbIq{$#_G1KD`bR;~4i?BwMN^7f6Wdx|IC$NL@zm&p@!kYM%*fPk7YXM1B5hT*=I z{Z{V0ucW%R_JWk_bChw1Sf;;sC^XWI6HDf*UpfGJzzO2+EH!OCC>jABF&a?4H8AZw z+Kv$fKY8&yo)QDcB97Ak_MGanQI{)v0{le*n`0I_$Z>P@F><8MBr#(0X5^aP#k2Ly ztWmMeG(@xzb1?H0# z-HZK^c6OKb`NCi$sYK7W^L>}v@z|om{=)u>esY)i@x~cV=bYv)u@sK! zA7>AHj&eU)cl34y-)@Oa0?`WBCIc)l9QcAmXMk;@>^mBDL6Nq^u?0lK;DJ*jS>vKx zF;n#Qc9=ScUXN$MVmd2~4Yqs!oIm?r)!GnCw^x}!R_WXspDT`_COWM|XlVbfU6ct8jT-dQ0SUoS(gh@Gi*ObP1DxKwjqg=TT?}1&l zWf*gA9&^F7(iJLA6Dq|3mOo!;3z%5%`JpQjaMEA=Q>Yj7g2gw0^xD&50~*)aKh~BR zyVK}_4n}4%dmGics~afv`uf_VXD4WVw}3lFs~->c!8x5faGoUeOeCN9D&I2@d)p$K z_lM9Xjl@(_q8fkY_Dq!9R^z!rKlv@|rs{qD8CteOTgZ*uicMP|*gB2jSO4KeCqL4; z=MI&`Dp@ySiq~oI4$wPZ80iOG$GBJuCqLo2)$2q~LBSkfF|$`$gL-Mu3!Rb9INKOeeNl%rxiOG9b=88tH-1x?oXT4Eo_9?^Scj} zmuP*4V@W?7z+u7Of=L1!YBkc-HrrPqlRu62veYs^d@1;zt9;_VCr&6X@r)1iQ?GW>3)#NtvVAgVHXc0Hx{+_yAItMZ2=B7i}uBqZ#)*jh1lFnSsH z$%RmZgXvi&wM1#VM(J!r1$jXl**l)wSykf$T@YjCm_uKp(r_zv(a0?R3N#g??&)+& zNtK2y#|<+jh=Sj@IMmA~R`CMk;05h+>zaHBif;#1HG8z1MPp!^jEs%VV$|}>KQb}DCfqs=Om5VK z>AjSpt%)uJ+%DNK?fc-B%HEE7pEMikUw}B|a@FNRj7K9Oi`LnFO@5fBqTyCD9W}OA5DfBGjkutv8Z* zUh(U;@54GYUSuK?r#47;*}ki#xK*(soo%XD{sDBVFh_ngVT!6st$7($j0&A2Vk6{)1%=kH1Gt`8H89F6lb0Tz z-$}dBORE_BpJYk=QYg&cg^RToSCCj2XFxc&Lu>v8Zl+9lZP_locOqLf7sJ@zy#NjC z^m=uvjSJ^J>C=6>PZ;HtFJ@9Xb++>(ERm@uoY~$*)Od-&ncx zpV}BFu3X^ftQr^>jA1_6(@$@SGe@##&~IhsIxK9GlS@kkvy(5;59IEMxB|vC!PE2g z@pT%@U^uR<_OCg+`1W~7wQfc%j@q~Ae0E5DsHT~nAAm2dkz3@6 zl<7mHwnJizNOWIAJ^6H(OC18UqH=r>-0am}N;6pa&&-nF?1D6JY7YhPj0(@o)leH+ zcrU(oE?>R$NV@ND1s8SX{bc#t<34DZZ}K zCx2#`wD&|Lo!|g~O9TKw1R~Xi4;ddshbjsJNo(2qz2P3w<%4r1k5tHJ+&{WV&L@!{ zdB->XkCRo6O+aAf<3Lp-2nope*y(Ic!Uekg!$l_sav}VYYLp@e=KUkKOAA~=`NM?{ zZ~z6-|C(8YqH+TH)qjtEJxs6tdp*o${j;zDM^g6>w51iNx)Kl$5B_of?SBOxxc?C z$K`+qa07AvIM&SR?4tA#xbO$G@L$Mr1m!=2dH?{`U&vsl2P6$NlJ8#uN#}bANR`k77Z)-jgz{f?@R*5@1`{Ce zhjbn@{CDB}&V;h;Zy_iyKalXT<~aBtR5j{Dy7XD0VGj}i6Rk#*vs9gjOy@HK0F-|n zg%6s;59Ijc+3$Y_lpYM&r~v@fe}VdaAQL{cf7Cr1p%!>BqF(T)1R?eX=up##3_fl- z{N76V__$T|@xPLLzY+-sJplmlA1=&;nSZYWf8nk_aOl1Okm^wjy5NJB-M-&!>ff&n z#y@Ug*Wb=UNdN$pX8-{GzvX|2p#~Z!2;}?YhQ@|un+65|F!uob8x*S)3b zd`G1J@R6XMxIkp6@&o@-67(C9hWkGV3~06Rze3mbfPljxhAs&|yvlyxQz(|mgNz(G y5UNfNr2ntG{#X^DvW2+3hhQ?}0{|3%h2s$FBLZZ`pnnKJ9x4DZ%<*ui0RIOn)Mf$z delta 11214 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 u{wOKS77rZ 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 Vi2zx!7-8+*hGl5rgdHQm{{xC9H-i8G