-- -- PostgreSQL database dump -- SET client_encoding = 'SQL_ASCII'; SET check_function_bodies = false; SET SESSION AUTHORIZATION 'postgres'; -- -- TOC entry 2 (OID 0) -- Name: imap_mail; Type: DATABASE; Schema: -; Owner: postgres -- CREATE DATABASE imap_mail WITH TEMPLATE = template0 ENCODING = 'SQL_ASCII'; \connect imap_mail postgres SET client_encoding = 'SQL_ASCII'; SET check_function_bodies = false; SET search_path = public, pg_catalog; -- -- TOC entry 50 (OID 89264) -- Name: plpgsql_call_handler(); Type: FUNC PROCEDURAL LANGUAGE; Schema: public; Owner: postgres -- CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE c; -- -- TOC entry 51 (OID 89265) -- Name: plperl_call_handler(); Type: FUNC PROCEDURAL LANGUAGE; Schema: public; Owner: postgres -- CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS '$libdir/plperl', 'plperl_call_handler' LANGUAGE c; SET SESSION AUTHORIZATION DEFAULT; -- -- TOC entry 48 (OID 89266) -- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: public; Owner: -- CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler; -- -- TOC entry 49 (OID 89267) -- Name: plperlu; Type: PROCEDURAL LANGUAGE; Schema: public; Owner: -- CREATE PROCEDURAL LANGUAGE plperlu HANDLER plperl_call_handler; SET SESSION AUTHORIZATION 'postgres'; -- -- TOC entry 4 (OID 2200) -- Name: public; Type: ACL; Schema: -; Owner: postgres -- REVOKE ALL ON SCHEMA public FROM PUBLIC; GRANT ALL ON SCHEMA public TO PUBLIC; -- -- TOC entry 5 (OID 89268) -- Name: alias_idnr_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE alias_idnr_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 19 (OID 89270) -- Name: aliases; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE aliases ( alias_idnr bigint DEFAULT nextval('alias_idnr_seq'::text) NOT NULL, alias character varying(100) NOT NULL, deliver_to character varying(250) NOT NULL, client_idnr bigint DEFAULT (0)::bigint NOT NULL ); -- -- TOC entry 7 (OID 89274) -- Name: user_idnr_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE user_idnr_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 20 (OID 89276) -- Name: users; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE users ( user_idnr bigint DEFAULT nextval('user_idnr_seq'::text) NOT NULL, userid character varying(100) NOT NULL, passwd character varying(34) NOT NULL, client_idnr bigint DEFAULT (0)::bigint NOT NULL, maxmail_size bigint DEFAULT (0)::bigint NOT NULL, encryption_type character varying(20) DEFAULT ''::character varying NOT NULL, last_login timestamp without time zone DEFAULT '1979-11-03 22:05:58'::timestamp without time zone NOT NULL ); -- -- TOC entry 9 (OID 89283) -- Name: mailbox_idnr_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE mailbox_idnr_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 21 (OID 89285) -- Name: mailboxes; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE mailboxes ( mailbox_idnr bigint DEFAULT nextval('mailbox_idnr_seq'::text) NOT NULL, owner_idnr bigint NOT NULL, name character varying(100) NOT NULL, seen_flag smallint DEFAULT (0)::smallint NOT NULL, answered_flag smallint DEFAULT (0)::smallint NOT NULL, deleted_flag smallint DEFAULT (0)::smallint NOT NULL, flagged_flag smallint DEFAULT (0)::smallint NOT NULL, recent_flag smallint DEFAULT (0)::smallint NOT NULL, draft_flag smallint DEFAULT (0)::smallint NOT NULL, no_inferiors smallint DEFAULT (0)::smallint NOT NULL, no_select smallint DEFAULT (0)::smallint NOT NULL, permission smallint DEFAULT (2)::smallint, is_subscribed smallint DEFAULT (0)::smallint NOT NULL ); -- -- TOC entry 11 (OID 89298) -- Name: message_idnr_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE message_idnr_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 22 (OID 89300) -- Name: messages; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE messages ( message_idnr bigint DEFAULT nextval('message_idnr_seq'::text) NOT NULL, mailbox_idnr bigint DEFAULT (0)::bigint NOT NULL, messagesize bigint DEFAULT (0)::bigint NOT NULL, seen_flag smallint DEFAULT (0)::smallint NOT NULL, answered_flag smallint DEFAULT (0)::smallint NOT NULL, deleted_flag smallint DEFAULT (0)::smallint NOT NULL, flagged_flag smallint DEFAULT (0)::smallint NOT NULL, recent_flag smallint DEFAULT (0)::smallint NOT NULL, draft_flag smallint DEFAULT (0)::smallint NOT NULL, unique_id character varying(70) NOT NULL, internal_date timestamp without time zone, status smallint DEFAULT (0)::smallint NOT NULL, rfcsize bigint DEFAULT (0)::bigint NOT NULL ); -- -- TOC entry 13 (OID 89313) -- Name: messageblk_idnr_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE messageblk_idnr_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 23 (OID 89315) -- Name: messageblks; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE messageblks ( messageblk_idnr bigint DEFAULT nextval('messageblk_idnr_seq'::text) NOT NULL, message_idnr bigint DEFAULT (0)::bigint NOT NULL, messageblk text NOT NULL, blocksize bigint DEFAULT (0)::bigint NOT NULL ); -- -- TOC entry 15 (OID 89323) -- Name: auto_notification_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE auto_notification_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 24 (OID 89325) -- Name: auto_notifications; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE auto_notifications ( auto_notify_idnr bigint DEFAULT nextval('auto_notification_seq'::text), user_idnr bigint DEFAULT (0)::bigint NOT NULL, notify_address character varying(100) ); -- -- TOC entry 17 (OID 89329) -- Name: auto_reply_seq; Type: SEQUENCE; Schema: public; Owner: postgres -- CREATE SEQUENCE auto_reply_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; -- -- TOC entry 25 (OID 89331) -- Name: auto_replies; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE auto_replies ( auto_reply_idnr bigint DEFAULT nextval('auto_reply_seq'::text), user_idnr bigint DEFAULT (0)::bigint NOT NULL, reply_body text ); -- -- TOC entry 26 (OID 89338) -- Name: config; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE config ( config_idnr integer DEFAULT 0 NOT NULL, item character varying(255) NOT NULL, value character varying(255) NOT NULL ); -- -- TOC entry 55 (OID 89341) -- Name: f_update_messages(bigint, bigint); Type: FUNCTION; Schema: public; Owner: postgres -- CREATE FUNCTION f_update_messages(bigint, bigint) RETURNS text AS ' DECLARE new_mailbox_idnr ALIAS FOR $1; new_message_idnr ALIAS FOR $2; BEGIN UPDATE messages SET mailbox_idnr=new_mailbox_idnr WHERE message_idnr=new_message_idnr; RETURN ''done''; END; ' LANGUAGE plpgsql; -- -- TOC entry 56 (OID 89342) -- Name: f_v_1(); Type: FUNCTION; Schema: public; Owner: postgres -- CREATE FUNCTION f_v_1() RETURNS "trigger" AS ' DECLARE BEGIN IF NEW.name = ''INBOX/v_1'' THEN PERFORM CASE WHEN messageblk ~* ''roman'' OR messageblk ~* ''rome'' THEN f_update_messages(NEW.mailbox_idnr,mblk.message_idnr) ELSE ''other'' END AS "search results" FROM messageblks mblk, messages m, mailboxes mb WHERE mblk.message_idnr = m.message_idnr AND m.mailbox_idnr = mb.mailbox_idnr; END IF; RETURN NEW; END; ' LANGUAGE plpgsql; -- -- TOC entry 52 (OID 90006) -- Name: f_v_2(); Type: FUNCTION; Schema: public; Owner: postgres -- CREATE FUNCTION f_v_2() RETURNS "trigger" AS ' DECLARE str text; mbx_name text; uniq_id text; mail_header text; mail_complete text; mime_boundary text; content_type TEXT=''Content-Type: application/msword''; x int; BEGIN SELECT INTO mbx_name mailboxes.name FROM mailboxes, messages WHERE mailboxes.mailbox_idnr=messages.mailbox_idnr AND messages.message_idnr=NEW.message_idnr; IF mbx_name = ''INBOX/v_2'' THEN SELECT INTO uniq_id unique_id FROM messages WHERE messages.message_idnr=NEW.message_idnr; SELECT INTO x count(*) FROM messages,messageblks WHERE messages.unique_id=uniq_id AND messageblks.message_idnr=NEW.message_idnr; IF x=1 THEN SELECT INTO mail_header messageblk FROM messageblks WHERE messageblk_idnr=NEW.messageblk_idnr-1; IF mail_header ~ ''multipart/mixed'' AND NEW.messageblk ~ content_type THEN mime_boundary=trim(both ''"'' from substring(mail_header from ''".*"'')); str=f_get_document(NEW.messageblk,mime_boundary); INSERT INTO TEMP VALUES(str); NEW.messageblk = str; END IF; END IF; END IF; RETURN NEW; END; ' LANGUAGE plpgsql; -- -- TOC entry 54 (OID 90098) -- Name: f_doc2txt(text); Type: FUNCTION; Schema: public; Owner: postgres -- CREATE FUNCTION f_doc2txt(text) RETURNS text AS ' use strict; #begin-base64 644 zzz.doc #==== #cat temp.doc.asc|uudecode -o /dev/stdout|antiword - -i0|less my $str="begin-base64 600 zzz ".$_[0]."===="; #`echo "$_[0]"|/tmp/decode.pl>/tmp/temp.1.doc`; #`echo "$str"|uudecode -o /dev/stdout|antiword - -i0 >/tmp/delta.txt`; $str= `echo "$str"|uudecode -o /dev/stdout|antiword - -i0`; #my $str=`echo $_[0] | /usr/bin/antiword - -i0`; #return $_[0]; return $str; ' LANGUAGE plperlu; -- -- TOC entry 53 (OID 90115) -- Name: f_get_document(text, text); Type: FUNCTION; Schema: public; Owner: postgres -- CREATE FUNCTION f_get_document(text, text) RETURNS text AS ' DECLARE mail_attachment ALIAS FOR $1; mime_boundary ALIAS FOR $2; mime_header TEXT; str TEXT; BEGIN mime_header = ''--''||mime_boundary||'' Content-Type: text/plain; name=document.txt ''; mime_header = mime_header||''Content-Transfer-Encoding: 7bit ''; mime_header = mime_header||''Content-Disposition: inline; filename="document.txt" ''; str=substring(mail_attachment from ''Content-Type: application/msword.*''||mime_boundary); str=substring(str from ''\\n\\n.*\\n\\n''); str=split_part(str,''\\n\\n'',2); RETURN mime_header||f_doc2txt(str)||''--''||mime_boundary||''--''; END; ' LANGUAGE plpgsql; -- -- TOC entry 27 (OID 90531) -- Name: temp; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE "temp" ( f1 text ); -- -- Data for TOC entry 57 (OID 89270) -- Name: aliases; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY aliases (alias_idnr, alias, deliver_to, client_idnr) FROM stdin; 1 bernier@localhost 1 1 \. -- -- Data for TOC entry 58 (OID 89276) -- Name: users; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY users (user_idnr, userid, passwd, client_idnr, maxmail_size, encryption_type, last_login) FROM stdin; 1 mail_user 123 1 0 2004-05-03 20:02:40 \. -- -- Data for TOC entry 59 (OID 89285) -- Name: mailboxes; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY mailboxes (mailbox_idnr, owner_idnr, name, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, no_inferiors, no_select, permission, is_subscribed) FROM stdin; 2 1 Trash 1 1 1 1 1 1 0 0 2 1 1 1 INBOX 0 0 0 0 0 0 0 0 2 1 10 1 INBOX/v_2 1 1 1 1 1 1 0 0 2 1 12 1 Drafts 1 1 1 1 1 1 0 0 2 1 \. -- -- Data for TOC entry 60 (OID 89300) -- Name: messages; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY messages (message_idnr, mailbox_idnr, messagesize, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, unique_id, internal_date, status, rfcsize) FROM stdin; 411 1 64588 0 0 0 0 1 0 e954dffb5171b12ac967a10a90abba6a 2004-05-03 20:13:09 0 0 412 1 742 0 0 0 0 1 0 c0627db71a122ebe2bcd3b9975d06248 2004-05-03 20:13:09 0 0 413 1 1138 0 0 0 0 1 0 a08861995f260318e27750b7630fd2e3 2004-05-03 20:13:09 0 0 414 1 1098 0 0 0 0 1 0 f5c982299a4982d3ff31d94dacdb9da9 2004-05-03 20:13:10 0 0 415 1 925 0 0 0 0 1 0 30a42d18981e3107e82e74b6d366e8f5 2004-05-03 20:13:10 0 0 \. -- -- Data for TOC entry 61 (OID 89315) -- Name: messageblks; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY messageblks (messageblk_idnr, message_idnr, messageblk, blocksize) FROM stdin; 818 411 From bernier@wolf Sat May 1 08:00:39 2004\nReturn-Path: \nX-Original-To: bernier@localhost\nDelivered-To: bernier@localhost\nReceived: by wolf (Postfix, from userid 1002)\n\tid 0C5701A00; Sat, 1 May 2004 08:00:39 -0400 (EDT)\nDate: Sat, 1 May 2004 08:00:38 -0400\nTo: bernier@localhost\nSubject: email with msword document\nMessage-ID: <20040501120038.GA8704@wolf>\nMime-Version: 1.0\nContent-Type: multipart/mixed; boundary="5vNYLRcllDrimb99"\nContent-Disposition: inline\nUser-Agent: Mutt/1.5.5.1+cvs20040105i\nFrom: bernier@wolf (Robert Bernier)\n\n 552 819 411 \n--5vNYLRcllDrimb99\nContent-Type: text/plain; charset=us-ascii\nContent-Disposition: inline\n\nThis email has an attached msword document. It is a copy of the first\narticle on datamining.\n\n--5vNYLRcllDrimb99\nContent-Type: application/msword\nContent-Disposition: attachment; filename="datamining.doc"\nContent-Transfer-Encoding: base64\n\n0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAWQAAAAAA\nAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD/////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n///////////////////////////////////9//////////7///8EAAAABQAAAAYAAAAHAAAA\n/v///wkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA\nAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAA\nIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAA\nAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAA\nPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsA\nAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAA\n/v///1oAAAD+////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////////1IA\nbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//\n/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAABwAAAAgA\nAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAA\nFgAAABcAAAAYAAAAGQAAABoAAAAbAAAA/v///x0AAAAeAAAAHwAAACAAAAAhAAAA/v//////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////8BAP7/\nAwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoA\nAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAaQBuAGcA\nIABpAG4AZgBvAHIAbQBhAAEAAAIAAAAAAAAAAAAAAAAAAAAAZQB4AGkAcwB0AGkAbgBnACAA\nZABhAHQAYQAgAGEAbgBkACAAYQByAGUAIAASABMACgABAFsADwACAAAAAAAAAFoAABDx/wIA\nWgAAAAcARABlAGYAYQB1AGwAdAAAAA0AAAAxJAANxgIAACokAQArAEIqAE9KAwBRSgMAQ0oY\nAG1ICQRzSAkEUEoEAG5I/wBeSgQAX0j/AHRI/wAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBQPL/\noQBCAAAAGQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEA\ncgB0AAAAAAAAAAAAAAAAAC4AQhABAPIALgAAAAkAVABlAHgAdAAgAGIAbwBkAHkAAAAKAA8A\nE6QAABSkeAAAACQALxDxAAIBJAAAAAQATABpAHMAdAAAAAIAEAAIAE9KAwBRSgMARAD+HwEA\nEgFEAAAABwBDAGEAcAB0AGkAbwBuAAAADQARABOkeAAUpHgADCQBABYAT0oDAFFKAwBDShQA\nNggBYUoUAF0IASoA/h8BACIBKgAAAAUASQBuAGQAZQB4AAAABQASAAwkAQAIAE9KAwBRSgMA\nAAAAAGY3AAAEAACgAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAQAAMxyAAA6AAAAAAQAAJAQAAC8GAAATB8AAAQkAACoKAAA\n/C4AAGozAADwNwAA3j8AACRFAAB4TAAAOk8AALJQAACUVAAACFYAACxaAAAMXgAAvF8AAB5l\nAADScQAAzHIAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAA\nRgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAAAAAABmNwAAAAAAAAIQ\nAAAAAAAAAGY3AABQAAAEAAAAAAUAAABHFpABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1FpABAgAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwB5AG0AYgBvAGwAAAAzJpABAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQByAGkAYQBsAAAATwSQAQAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAaQB0AHMAdAByAGUAYQBtACAAVgBlAHIAYQAg\nAFMAYQBuAHMAAAA1BpABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVABh\nAGgAbwBtAGEAAABCAAQAAQiNGAAAxQIAAGgBAAAAAGms+0VprPtFAAAAAAEAAAAAAAAAAAAA\nAAAAAQABAAAABACDkAEAAAAAAAAAAAAAAAEAAQAAAAEAAAAAAAAAJwMAAAgAAAAABAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIwAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAIAAQAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAA/v8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAA\nIAEAAA0AAAABAAAAcAAAAAkAAAB4AAAACgAAAIQAAAALAAAAkAAAAA0AAACcAAAADAAAAKgA\nAAAIAAAAtAAAAAQAAADMAAAABgAAAOQAAAAHAAAA8AAAAAUAAAD8AAAAAwAAAAgBAAACAAAA\nFAEAAAIAAADp/QAAHgAAAAIAAAAyAAAAQAAAAICeRzAAAAAAQAAAAACgEYchAAAAQAAAAIAp\n2pq6LsQBQAAAAIAhK2u6LsQBHgAAAA8AAABSb2JlcnQgQmVybmllcgAAHgAAAA8AAABSb2Jl\ncnQgQmVybmllcgAAHgAAAAEAAAAAAAAAHgAAAAEAAAAAAAAAHgAAAAEAAAAAAAAAHgAAAAEA\nAAAAAAAAHgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA7KXCAE0gBwQAAAASvwAAAAAAADAAAAAAAAQAAMxyAAAOAENh\nb2xhbjcwAAAAAAAAAAAAAAAAAAAAAAAABwQWACSgAAAAAAAAAAAAAGY3AAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA//8PADoAAAABAAAA//8PADsAAAAVAAAA//8PAAAAAAAAAAAA\nAAAAAAAAAABsAAAAAACWAQAAAAAAAJYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAJYBAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqAQAANAAAAN4B\nAAAMAAAA6gEAAKwAAAAAAAAAAAAAALcCAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYCAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8wMAACACAAAAAAAA\nAAAAAKICAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYC\nAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAIA2QAAAEQAYQB0AGEAIABNAGkAbgBpAG4AZwANAA0ADQBJACAAbwBuAGMA\nZQAgAGQAaQBkACAAYQAgAGMAbwBuAHQAcgBhAGMAdAAgAGEAZABtAGkAbgBpAHMAdAByAGEA\ndABpAG4AZwAgAHQAaABlACAAbgBlAHQAdwBvAHIAawAgAG8AZgAgAGEAIABzAG0AYQBsAGwA\nIABzAHQAYQByAHQAdQBwACAAYwBvAG0AcABhAG4AeQAuACAAVABoAGUAIABvAHcAbgBlAHIA\nJwBzACAAdABvAHQAYQBsACAAZQB4AGkAcwB0AGUAbgBjAGUAIAByAGUAdgBvAGwAdgBlAGQA\nIABhAHIAbwB1AG4AZAAgAHQAaABlACAAZQBtAGEAaQBsACAAZwBlAG4AZQByAGEAdABlAGQA\nIABmAHIAbwBtACAAaABpAHMAIAB2AGEAcgBpAG8AdQBzACAAYgB1AHMAaQBuAGUAcwBzACAA\ncgBlAGwAYQB0AGkAbwBuAHMAaABpAHAAcwAgAGEAbgBkACAAbgBlAHYAZQByACAAbQBhAGQA\nZQAgAGEAIABkAGUAYwBpAHMAaQBvAG4AIAB1AG4AbABlAHMAcwAgAHQAaABlACAAaQBzAHMA\ndQBlAHMAIAB3AGUAcgBlACAAZgBpAHIAcwB0ACAAZABlAHQAYQBpAGwAZQBkACAAaQBuACAA\nYQBuACAAZQBtAGEAaQBsAC4AIABNAHkAIABiAG8AcwBzACAAbwBuAGMAZQAgAGMAbwBuAGYA\naQBkAGUAZAAgAGkAbgAgAG0AZQAgAG8AZgAgAGgAaQBzACAAaABhAHQAcgBlAGQAIABvAGYA\nIABoAGkAcwAgAGUAbQBhAGkAbAAgAGMAbABpAGUAbgB0ACAAYgBlAGMAYQB1AHMAZQAgAGkA\ndAAgAGwAaQBtAGkAdABlAGQAIABoAGkAbQAgAGkAbgAgAHQAaABlACAAdwBhAHkAIABoAGUA\nIABjAG8AdQBsAGQAIABvAHIAZwBhAG4AaQB6AGUAIABoAGkAcwAgAGkAbgBmAG8AcgBtAGEA\ndABpAG8AbgAuAA0ADQANAEkAIAB3AGEAcwAgAHMAbwAgAGkAbQBwAHIAZQBzAHMAZQBkACAA\nYgB5ACAAaABpAHMAIABkAGUAcwBwAGUAcgBhAHQAaQBvAG4AIAB0AGgAYQB0ACAASQAgAGYA\nbwB1AG4AZAAgAG0AeQBzAGUAbABmACAAYwBvAG4AcwB0AGEAbgB0AGwAeQAgAHQAaABpAG4A\nawBpAG4AZwAgAGEAYgBvAHUAdAAgAGgAaQBzACAAZABpAGwAZQBtAG0AYQAuACAASQBuACAA\ndABpAG0AZQAgAHQAaABlACAAYQBuAHMAdwBlAHIAIABjAGEAbQBlACAAdABvACAAbQBlACwA\nIAB3AGgAYQB0ACAAdwBhAHMAIABuAGUAZQBkAGUAZAAgAHcAYQBzACAAYQAgAGQAYQB0AGEA\nIABtAGkAbgBlAC4ADQANAA0AUwBvACAAdwBoAGEAdAAgAGkAcwAgAGQAYQB0AGEAIABtAGkA\nbgBpAG4AZwAgAGEAbgB5AHcAYQB5AD8AIABEAGEAdABhACAAbQBpAG4AaQBuAGcAIABpAHMA\nIABhACAAYwBsAGEAcwBzACAAbwBmACAAZABhAHQAYQBiAGEAcwBlACAAYQBwAHAAbABpAGMA\nYQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAbABvAG8AawAgAGYAbwByACAAaABpAGQAZABlAG4A\nIABwAGEAdAB0AGUAcgBuAHMAIABpAG4AIABhACAAZwByAG8AdQBwACAAbwBmACAAZABhAHQA\nYQAuAA0ADQANAEkAbgAgAHcAcgBpAHQAaQBuAGcAIAB0AGgAaQBzACAAYQByAHQAaQBjAGwA\nZQAgAGkAdAAgAHEAdQBpAGMAawBsAHkAIABiAGUAYwBhAG0AZQAgAGEAcABwAGEAcgBlAG4A\ndAAgAHQAaABhAHQAIAB5AG8AdQAgACwAdABoAGUAIAByAGUAYQBkAGUAcgAsACAAbQBpAGcA\naAB0ACAAbgBlAGUAZAAgAHMAZQB2AGUAcgBhAGwAIABwAGkAZQBjAGUAcwAgAG8AZgAgAHUA\nbgByAGUAbABhAHQAZQBkACAAdABlAGMAaABuAGkAYwBhAGwAIABrAG4AbwB3AC0AaABvAHcA\nIAB0AG8AIABjAHIAZQBhAHQAZQAgAGEAIABkAGEAdABhACAAbQBpAG4AZQAgAHMAbwAgAEkA\nIABlAG4AZABlAGQAIAB1AHAAIABhAHMAawBpAG4AZwAgAG0AeQBzAGUAbABmACAAPwB3AGgA\nbwAgAGEAbQAgAEkAIAB3AHIAaQB0AGkAbgBnACAAdABoAGkAcwAgAGEAcgB0AGkAYwBsAGUA\nIABmAG8AcgA/AD8ALgAgAEQAbwAgAEkAIAB3AHIAaQB0AGUAIABmAG8AcgAgAHQAaABlACAA\nUABlAHIAbAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIAIABvAHIAIABhAG0AIABJACAAdwByAGkA\ndABpAG4AZwAgAHQAbwAgAHQAaABlACAARABCAEEAPwAgAFAAcgBvAGcAcgBhAG0AbQBpAG4A\nZwAgAGEAbgBkACAAbQBhAG4AYQBnAGkAbgBnACAAZABhAHQAYQAgAGQAbwBuACcAdAAgAHUA\ncwBlACAAdABoAGUAIABzAGEAbQBlACAAcwBlAHQAIABvAGYAIABzAGsAaQBsAGwAcwAgAGIA\ndQB0ACAAdABoAGUAeQAgAGEAcgBlACAAbgBlAHYAZQByAHQAaABlAGwAZQBzAHMAIABiAG8A\ndABoACAAcgBlAHEAdQBpAHIAZQBkAC4AIABTAG8AIAB3AGgAZQByAGUAIABkAG8AZQBzACAA\ndABoAGkAcwAgAGEAcgB0AGkAYwBsAGUAIABnAG8APwANAA0ADQBUAGgAaQBzACAAYQByAHQA\naQBjAGwAZQAgAGkAcwAgAGYAbwByACAAdABoAG8AcwBlACAAdwBoAG8AIABuAGUAZQBkACAA\nYQAgAGcAdQBpAGQAZQAgAHQAbwAgAGcAZQBuAGUAcgBhAHQAaQBuAGcAIABpAG4AZgBvAHIA\nbQBhAHQAaQBvAG4AIABmAHIAbwBtACAAZQB4AGkAcwB0AGkAbgBnACAAZABhAHQAYQAgAGEA\nbgBkACAAYQByAGUAIABsAG8AbwBrAGkAbgBnACAAZgBvAHIAIABpAGQAZQBhAHMAIABvAG4A\nIABoAG8AdwAgAHQAbwAgAGQAbwAgAGkAdAAuACAAVABoAG8AbQBhAHMAIABFAGQAaQBzAG8A\nbgAgAG8AbgBjAGUAIABzAGEAaQBkACAAdABoAGEAdAAgAGcAZQBuAGkAdQBzACAAdwBhAHMA\nIAAxACUAIABpAG4AcwBwAGkAcgBhAHQAaQBvAG4AIABhAG4AZAAgADkAOQAlACAAcABlAHIA\ncwBwAGkAcgBhAHQAaQBvAG4AOgAgAGgAZQByAGUAJwBzACAAeQBvAHUAcgAgADEAJQAuAA0A\nIAANACAADQANAA0AVABoAGUAIABzAGMAZQBuAGEAcgBpAG8AOgANAA0ADQBUAGgAZQAgAG8A\nYgBqAGUAYwB0AGkAdgBlACAAaQBzACAAdABvACAAZABhAHQAYQAgAG0AaQBuAGUAIAB0AGgA\nZQAgAGUAbQBhAGkAbAAgAHQAaABhAHQAIAByAGUAcwBpAGQAZQBzACAAaQBuACAAYQAgAG0A\nbwB6AGkAbABsAGEAIABtAGEAaQBsACAAYgBvAHgALgAgAFcAZQAgAGEAcgBlACAAZQBzAHAA\nZQBjAGkAYQBsAGwAeQAgAGkAbgB0AGUAcgBlAHMAdABlAGQAIABpAG4AIABtAHMAdwBvAHIA\nZAAgAGQAbwBjACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzAC4AIABUAGgAZQAgAG0AZQB0AGgA\nbwBkACAAaQBzACAAdABvACAAcABhAHIAcwBlACAAdABoAGUAIABlAG0AYQBpAGwAIABhAG4A\nZAAgAHUAcABsAG8AYQBkACAAaQB0ACAAaQBuAHQAbwAgAGEAIAByAGUAbABhAHQAaQBvAG4A\nYQBsACAAZABhAHQAYQBiAGEAcwBlACAAZQBuAGcAaQBuAGUAIAB3AGgAZQByAGUAIABpAHQA\nIABjAGEAbgAgAHQAaABlAG4AIABiAGUAIABhAG4AYQBsAHkAcwBlAGQALgANAA0ADQBUAGgA\nZQAgAHQAbwBvAGwAcwA6AA0ADQBUAGgAZQAgAE0AbwB6AGkAbABsAGEAIABtAGEAaQBsAGIA\nbwB4AGUAcwAgAGYAbwBsAGwAbwB3ACAAdABoAGUAIABtAGIAbwB4ACAAZgBvAHIAbQBhAHQA\nLgANAFAAZQByAGwAIABoAGEAcwAgAGEAIABuAHUAbQBiAGUAcgAgAG8AZgAgAGUAeABjAGUA\nbABsAGUAbgB0ACAAZQBtAGEAaQBsACAAcABhAHIAcwBpAG4AZwAgAG0AbwBkAHUAbABlAHMA\nIAB0AGgAYQB0ACAAYwBhAG4AIABiAGUAIABmAG8AdQBuAGQAIABpAG4AIABDAFAAQQBOAC4A\nDQBQAG8AcwB0AGcAcgBlAFMAUQBMAA0AVABoAGUAIABDAG8AbQBtAGEAbgBkACAAbABpAG4A\nZQAgAHUAdABpAGwAaQB0AGkAZQBzACAAZgBpAG4AZAAsACAAZgBpAGwAZQAsACAAYQBuAHQA\naQB3AG8AcgBkACAAYQBuAGQAIAB0AGgAZQAgAFAAbwBzAHQAZwByAGUAcwAnACAAYwBvAG4A\ncwBvAGwAZQAgAGIAYQBzAGUAZAAgAGMAbABpAGUAbgB0ACAAcABzAHEAbAAuAA0ADQBUAGgA\nZQAgAEQAZQB2AGUAbABvAHAAZQByACcAcwAgAFMAawBpAGwAbABzAGUAdAA6AA0AIAANAA0A\nUABlAHIAbAA6AA0ASABlACAAaABhAHMAIABpAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAHAA\ncgBvAGcAcgBhAG0AbQBpAG4AZwAgAGUAeABwAGUAcgBpAGUAbgBjAGUAIABpAG4AIABjAHIA\nZQBhAHQAaQBuAGcAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAcwAuAA0ASQBzACAAcgBlAHEA\ndQBpAHIAZQBkACAAdABvACAAZQB4AGUAYwB1AHQAZQAgAGMAbwBtAG0AYQBuAGQAIABsAGkA\nbgBlACAAdQB0AGkAbABpAHQAaQBlAHMAIABmAHIAbwBtACAAaQBuAHMAaQBkAGUAIABhACAA\ncABlAHIAbAAgAHMAYwByAGkAcAB0AC4ADQBNAHUAcwB0ACAAYgBlACAAYQBiAGwAZQAgAHQA\nbwAgAGkAbgBzAHQAYQBsAGwAIABhAG4AZAAgAHUAcwBlACAAcABlAHIAbAAgAG0AbwBkAHUA\nbABlAHMAIABmAHIAbwBtACAAQwBQAEEATgAuAA0AQwBhAG4AIABtAGEAawBlACAAYQAgAHAA\ncgBvAGcAcgBhAG0AbQBhAHQAaQBjACAAYwBvAG4AbgBlAGMAdABpAG8AbgAgAHQAbwAgAHQA\naABlACAAZABhAHQAYQBiAGEAcwBlACAAZQBuAGcAaQBuAGUAIABQAG8AcwB0AGcAcgBlAFMA\nUQBMAC4ADQBNAHUAcwB0ACAAYgBlACAAYQBiAGwAZQAgAHQAbwAgAGUAeABlAGMAdQB0AGUA\nIABzAHEAbAAgAHEAdQBlAHIAaQBlAHMAIABmAHIAbwBtACAAYQAgAHAAZQByAGwAIABzAGMA\ncgBpAHAAdAAgAHQAbwAgAGEAIABkAGEAdABhAGIAYQBzAGUAIABlAG4AZwBpAG4AZQAuAA0A\nUABvAHMAdABnAHIAZQBTAFEATAA6AA0ASwBuAG8AdwBzACAAaABvAHcAIAB0AG8AIABpAG4A\ncwB0AGEAbABsACAAdABoAGUAIABQAG8AcwB0AGcAcgBlAFMAUQBMACAAUgBlAGwAYQB0AGkA\nbwBuAGEAbAAgAEQAYQB0AGEAYgBhAHMAZQAgAE0AYQBuAGEAZwBlAG0AZQBuAHQAIABTAHkA\ncwB0AGUAbQAgAG8AbgAgAGEAIABMAGkAbgB1AHgAIABtAGEAYwBoAGkAbgBlACAAZQBpAHQA\naABlAHIAIABiAHkAIAB1AHMAaQBuAGcAIABwAHIAZQBjAG8AbQBwAGkAbABlAGQAIABiAGkA\nbgBhAHIAaQBlAHMAIABzAHUAYwBoACAAYQBzACAAcgBwAG0AJwBzACwAIABkAGUAYgBpAGEA\nbgAgAHAAYQBjAGsAYQBnAGUAcwAgAGEAbgBkACAAdABhAHIAIABiAGEAbABsAHMAIABvAHIA\nIABjAG8AbQBwAGkAbABpAG4AZwAgAGkAdAAgAGYAcgBvAG0AIABzAG8AdQByAGMAZQAgAGMA\nbwBkAGUALgANAFYAZQByAHMAZQBkACAAaQBuACAAUwBRAEwAIAA5ADIALAAgADkAOQAgAHAA\ncgBvAHQAbwBjAG8AbABzAC4ADQBBAGIAbABlACAAdABvACAAYwByAGUAYQB0AGUAIAB0AGEA\nYgBsAGUAcwAsACAAdgBpAGUAdwBzACwAIABjAG8AbgBzAHQAcgBhAGkAbgB0AHMAIABhAG4A\nZAAgAHUAcwBlAHIALQBkAGUAZgBpAG4AZQBkACAAZgB1AG4AYwB0AGkAbwBuAHMALgANAEMA\nbwBtAG0AYQBuAGQAIABMAGkAbgBlACAAVQB0AGkAbABpAHQAaQBlAHMAOgANAEsAbgBvAHcA\ncwAgAGgAbwB3ACAAdABvACAAcABpAHAAZQAgAHMAdABhAG4AZABhAHIAZAAgAGkAbgBwAHUA\ndAAgAGEAbgBkACAAbwB1AHQAcAB1AHQAIABmAHIAbwBtACAAbwBuAGUAIABwAHIAbwBjAGUA\ncwBzACAAdABvACAAdABoAGUAIABuAGUAeAB0AC4ADQANAFQAaABlACAAQQBzAHMAdQBtAHAA\ndABpAG8AbgBzADoADQANAEEAbgAgAGkAbgBzAHQAYQBsAGwAZQBkACAAdgBlAHIAcwBpAG8A\nbgAgAG8AZgAgAFAAZQByAGwAIAA1AC4AOAAuAHgAIAB3AGkAdABoACAAQwBQAEEATgANAEEA\nIABzAHQAYQBuAGQAYQByAGQAIABpAG4AcwB0AGEAbABsAGEAdABpAG8AbgAgAG8AZgAgAFAA\nbwBzAHQAZwByAGUAcwAuAA0AVABoAGUAIABQAG8AcwB0AGcAcgBlAFMAUQBMACAAcwBlAHIA\ndgBlAHIAIAB3AGkAbABsACAAaABhAHYAZQAgAG0AaQBuAGkAbQBhAGwAIABzAGUAYwB1AHIA\naQB0AHkAIABvAHAAdABpAG8AbgBzACAAYwBvAG4AZgBpAGcAdQByAGUAZAAuAA0AVABoAGUA\nIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAIAB3AGkAbABsACAAbQBhAGsAZQAgAGkAdABzACAA\nYwBvAG4AbgBlAGMAdABpAG8AbgAgAHQAbwAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAA\ndgBpAGEAIABhACAAcwBvAGMAawBlAHQAIABjAG8AbgBuAGUAYwB0AGkAbwBuACAAdABoAGUA\ncgBlAGYAbwByAGUAIAB0AGgAZQAgAGwAaQBuAGUAIAA/AHQAYwBwAGkAcABfAHMAbwBjAGsA\nZQB0ACAAPQAgAHQAcgB1AGUAPwAgAG0AdQBzAHQAIABiAGUAIAB1AG4AYwBvAG0AbQBlAG4A\ndABlAGQAIABpAG4AIAB0AGgAZQAgAHAAbwBzAHQAZwByAGUAcQBsAC4AYwBvAG4AZgAgAGYA\naQBsAGUALgAgAEYAdQByAHQAaABlAHIAbQBvAHIAZQAsACAAdABoAGUAIABzAGMAcgBpAHAA\ndAAgAGEAcwBzAHUAbQBlAHMAIAB0AGgAYQB0ACAAdABoAGUAIABjAG8AbgBuAGUAYwB0AGkA\nbwBuACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHAAYQBzAHMAdwBvAHIAZAA6AA0AIAANACAA\nDQANACMAIABUAFkAUABFACAAIAAgACAARABBAFQAQQBCAEEAUwBFACAAIAAgACAAVQBTAEUA\nUgAgACAAIAAgAEkAUAAtAEEARABEAFIARQBTAFMAIAAgACAAIABJAFAALQBNAEEAUwBLACAA\nIAAgACAAIAAgACAAIABNAEUAVABIAE8ARAANAA0AIAANAA0AIAAgACAAIABsAG8AYwBhAGwA\nIAAgACAAIABhAGwAbAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nYQBsAGwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nIAAgACAAIAAgACAAIAAgACAAdAByAHUAcwB0AA0AIAAgACAAIAAgAGgAbwBzAHQAIAAgACAA\nIABhAGwAbAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAYQBsAGwA\nIAAgACAAIAAgACAAIAAgACAAIAAgACAAMQAyADcALgAwAC4AMAAuADEAIAAgACAAIAAgADIA\nNQA1AC4AMgA1ADUALgAyADUANQAuADIANQA1ACAAcABhAHMAcwB3AG8AcgBkAA0ADQAgAA0A\nIAANACAADQBUAGgAZQAgAFAAbwBzAHQAZwByAGUAUwBRAEwAIABhAGMAYwBvAHUAbgB0ACAA\ndQBzAGUAcgAgAGkAcwAgAHQAaABlACAAcwB1AHAAZQByAHUAcwBlAHIALAAgAHAAbwBzAHQA\nZwByAGUAcwAuAA0AVABoAGUAIABtAGIAbwB4ACAAaQBzACAAYQBzAHMAdQBtAGUAZAAgAHQA\nbwAgAGIAZQAgAGMAYQBsAGwAZQBkACAAIgBTAGUAbgB0ACIAIABhAG4AZAAgAGkAcwAgAGkA\nbgAgAHQAaABlACAAcwBhAG0AZQAgAGQAaQByAGUAYwB0AG8AcgB5ACAAYQBzACAAdABoAGUA\nIABwAGEAcgBzAGUAcgAgAHMAYwByAGkAcAB0AC4ADQAgAA0ADQANAFAAYQByAHQAIAAxACwA\nIABTAGUAYQByAGMAaABpAG4AZwAgAGYAbwByACAAdABoAGUAIABlAG0AYQBpAGwAIABtAGIA\nbwB4AGUAcwANAA0ADQBUAGgAZQAgAG0AbwB6AGkAbABsAGEAIABtAGEAaQBsACAAYwBsAGkA\nZQBuAHQAIABtAGEAaQBsAGIAbwB4AGUAcwAgAGEAcgBlACAAZgBvAHUAbgBkACAAdQBuAGQA\nZQByACAAdABoAGUAIABoAG8AbQBlACAAYQBjAGMAbwB1AG4AdAAnAHMAIABkAGkAcgBlAGMA\ndABvAHIAeQAgAGkAZQA6ACAAfgAvAC4AbQBvAHoAaQBsAGwAYQAgAFQAaABlACAAcwBjAHIA\nZQBlAG4AIABzAGgAbwB0ACAAYgBlAGwAbwB3ACAAcwBoAG8AdwBzACAAdABoAGUAIABkAGkA\nZgBmAGUAcgBlAG4AdAAgAG0AYQBpAGwAYgBvAHgAZQBzACAAbwBmACAAYQBuACAAZQB4AGkA\ncwB0AGkAbgBnACAAcAByAG8AZgBpAGwAZQAuACAAVABoAGUAIABtAGIAbwB4AGUAcwAgAGEA\ncgBlACAAdABoAG8AcwBlACAAZgBpAGwAZQBzACAAdwBpAHQAaABvAHUAdAAgAGEAbgB5ACAA\nZQB4AHQAZQBuAHMAaQBvAG4AcwAuACAAQQBuAG8AdABoAGUAcgAgAGgAaQBuAHQAIABpAHMA\nIAB0AG8AIABsAG8AbwBrACAAYQB0ACAAdABoAGUAIABmAGkAbABlACAAcwBpAHoAZQAsACAA\ndABoAGUAIABtAGEAaQBsAGIAbwB4AGUAcwAgAGEAcgBlACAAbgBvAHIAbQBhAGwAbAB5ACAA\ndABoAGUAIABsAGEAcgBnAGUAcwB0ACAAZgBpAGwAZQBzACAAcAByAGUAcwBlAG4AdAAuAA0A\nIAANAA0ADQANACAADQAgAA0ADQANAFQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8A\nbQBtAGEAbgBkACAAZwBpAHYAZQBzACAAYQAgAGwAaQBzAHQAaQBuAGcAIABvAGYAIABhAGwA\nbAAgAHQAaABlACAAbQBhAGkAbABiAG8AeABlAHMAIABpAG4AIABtAHkAIABtAG8AegBpAGwA\nbABhACAAcAByAG8AZgBpAGwAZQAgAGEAYwBjAG8AdQBuAHQAOgANAA0ADQBmAGkAbgBkACAA\nfgAvAC4AbQBvAHoAaQBsAGwAYQAvAGQAZQBmAGEAdQBsAHQALwByAGYAdgAyAHUAZABuADcA\nLgBzAGwAdAAvAE0AYQBpAGwALwAgAC0AdAB5AHAAZQAgAGYAIAAtAG4AbwB0ACAALQBpAG4A\nYQBtAGUAIAAiACoALgAqACIAIAAtAG4AbwB0ACAALQBpAG4AYQBtAGUAIAAiAC4AKgAiACAA\nLQBwAHIAaQBuAHQADQANAA0ADQAgAA0ADQANAFAAYQByAHQAIAAyACwAIABQAHIAZQBwAGEA\ncgBpAG4AZwAgAHQAaABlACAAUABvAHMAdABnAHIAZQBTAFEATAAgAEQAYQB0AGEAYgBhAHMA\nZQANAA0ADQBFAG0AYQBpAGwAIABBAHMAcwB1AG0AcAB0AGkAbwBuAHMADQANAFQAaABlACAA\nZQBtAGEAaQBsACAAaABhAHMAIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAcABhAHIA\ndABzACAAbwBmACAAaQBuAHQAZQByAGUAcwB0ADsAIABGAHIAbwBtACwAIABUAG8ALAAgAEMA\nQwAsACAAYQBuAGQAIABBAHQAdABhAGMAaABtAGUAbgB0AHMALgANAFQAaABlACAAZQBtAGEA\naQBsACAAYwBvAG0AZQBzACAAZgByAG8AbQAgAG8AbgBlACAAcwBvAHUAcgBjAGUALgANAEEA\nbgAgAGUAbQBhAGkAbAAgAGMAYQBuACAAYgBlACAAYQBkAGQAcgBlAHMAcwBlAGQAIAB0AG8A\nIABtAG8AcgBlACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AZQAgAHAAZQByAHMAbwBuAC4A\nDQBBAG4AIABlAG0AYQBpAGwAIABjAGEAbgAgAGgAYQB2AGUAIABtAG8AcgBlACAAdABoAGEA\nbgAgAG8AbgBlACAAQwBDAC4ADQBBAG4AIABlAG0AYQBpAGwAIABjAGEAbgAgAGgAYQB2AGUA\nIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBlACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAuAA0A\nQQB0AHQAYQBjAGgAbQBlAG4AdABzACAAbwBmACAAaQBuAHQAZQByAGUAcwB0ACAAYQByAGUA\nIABvAG4AbAB5ACAAbQBzAHcAbwByAGQAIABkAG8AYwB1AG0AZQBuAHQAcwAuAA0ADQBUAGgA\nZQAgAEQAYQB0AGEAYgBhAHMAZQANAA0ADQBDAGEAcgByAHkAIABvAHUAdAAgAHQAaABlACAA\nZgBvAGwAbABvAHcAaQBuAGcAIABpAG4AIABhACAAYwBvAG4AcwBvAGwAZQA6AA0AIAANAA0A\nQwByAGUAYQB0AGUAIABhACAAZABhAHQAYQBiAGEAcwBlACAAYwBhAGwAbABlAGQAIABlAG0A\nYQBpAGwAOwANACAADQAgAHAAcwBxAGwAIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAA/AGMA\nbwBtAG0AYQBuAGQAIAA/AGMAcgBlAGEAdABlACAAZABhAHQAYQBiAGEAcwBlACAAZQBtAGEA\naQBsAD8AIAB0AGUAbQBwAGwAYQB0AGUAMQANACAADQAgAA0AQQBsAHQAZQByACAAdABoAGUA\nIAB1AHMAZQByAG4AYQBtAGUAIABwAG8AcwB0AGcAcgBlAHMAIABhAG4AZAAgAGcAaQB2AGUA\nIABpAHQAIAB0AGgAZQAgAHAAYQBzAHMAdwBvAHIAZAAgAG8AZgAgADEAMgAzACAAKAB1AHMA\nZQByAG4AYQBtAGUAIABwAG8AcwB0AGcAcgBlAHMAIABiAHkAIABkAGUAZgBhAHUAbAB0ACAA\naABhAHMAIABuAG8AIABhAHMAcwBpAGcAbgBlAGQAIABwAGEAcwBzAHcAbwByAGQAKQA7AA0A\nIAANACAAcABzAHEAbAAgAC0AVQAgAHAAbwBzAHQAZwByAGUAcwAgAC0ALQBjAG8AbQBtAGEA\nbgBkACAAIgBhAGwAdABlAHIAIAB1AHMAZQByACAAcABvAHMAdABnAHIAZQBzACAAdwBpAHQA\naAAgAHAAYQBzAHMAdwBvAHIAZAAgACcAMQAyADMAJwAgACIAIABlAG0AYQBpAGwADQAgAA0A\nDQANAFQAaABlACAAVABhAGIAbABlAHMADQANAA0AVABoAGUAIABtAG8AcwB0ACAAaQBtAHAA\nbwByAHQAYQBuAHQAIABjAG8AbAB1AG0AbgAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlAHMA\nIABpAHMAIAB0AGgAZQAgAG0AZQBzAHMAYQBnAGUAaQBkACAAdwBoAGkAYwBoACAAaQBzACAA\nYQAgAHUAbgBpAHEAdQBlACAAYQBsAHAAaABhAG4AdQBtAGUAcgBpAGMAIABjAG8AZABlACAA\ndABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAGUAbQBhAGkAbAAgAG0A\nZQBzAHMAYQBnAGUALgAgAFQAaABlACAAdABhAGIAbABlAHMAIABoAGEAdgBlACAAYgBlAGUA\nbgAgAGQAZQBmAGkAbgBlAGQAIABzAHUAYwBoACAAdABoAGEAdAAgAG4AbwAgAGQAYQB0AGEA\nIABwAG8AcAB1AGwAYQB0AGkAbwBuACAAYwBhAG4AIABvAGMAYwB1AHIAIAB1AG4AbABlAHMA\ncwAgAHQAaABlACAAbQBlAHMAcwBhAGcAZQBpAGQAIABhAGwAcgBlAGEAZAB5ACAAZQB4AGkA\ncwB0AHMAIABpAG4AIAB0AGgAZQAgAHQAYQBiAGwAZQAgAG0AYQBpAGwAaQBkAC4ADQANAA0A\nVABoAGUAIABtAGUAcwBzAGEAZwBlACAAYgBvAGQAeQAgAGEAbgBkACAAYQB0AHQAYQBjAGgA\nbQBlAG4AdABzACAAYQByAGUAIAB0AG8AIABiAGUAIABzAHQAbwByAGUAZAAgAGEAcwAgAGwA\nYQByAGcAZQAgAG8AYgBqAGUAYwB0AHMAIABNAGEAbgB5ACAAbwBmACAAdABoAGUAIAB0AGEA\nYgBsAGUAcwAgAGgAYQB2AGUAIABhACAAYwBvAGwAdQBtAG4AIABvAGYAIAB0AHkAcABlACAA\nbwBpAGQAIAB3AGgAaQBjAGgAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYQBjAHQA\ndQBhAGwAIABkAGEAdABhACAAdABoAGEAdAAgAGkAcwAgAGwAbwBjAGEAdABlAGQAIABpAG4A\nIAB0AGgAZQAgAHMAeQBzAHQAZQBtACAAYwBhAHQAYQBsAG8AZwAgAHAAZwBfAGwAYQByAGcA\nZQBvAGIAagBlAGMAdAAuAA0ADQANAEkAbgBkAGUAeABlAHMAIABhAHIAZQAgAGMAcgBlAGEA\ndABlAGQAIABiAHkAIABkAGUAZgBhAHUAbAB0ACAAaQBuACAAUABvAHMAdABnAHIAZQBzACAA\nZgBvAHIAIABlAGEAYwBoACAAcAByAGkAbQBhAHIAeQAgAGsAZQB5ACAAdABoAGEAdAAgAGkA\ncwAgAGQAZQBmAGkAbgBlAGQAIABpAG4AIABhACAAdABhAGIAbABlAC4ADQANAA0AVABoAGkA\ncwAgAHMAYwByAGkAcAB0ACAAdwBpAGwAbAAgAGMAbABlAGEAbgAgAHQAaABlACAAZABhAHQA\nYQBiAGEAcwBlACAAZQBtAGEAaQBsACAAYQBuAGQAIABjAHIAZQBhAHQAZQAgAHQAaABlACAA\ndABhAGIAbABlAHMALgAgAEkAdAAgAGMAYQBuACAAYgBlACAAaQBuAHYAbwBrAGUAZAAgAGIA\neQAgAGUAeABlAGMAdQB0AGkAbgBnACAAaQB0ACAAZgByAG8AbQAgAHQAaABlACAAYwBvAG4A\ncwBvAGwAZQA6AA0ADQANAHAAcwBxAGwAIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAAtAGYA\nIABjAHIAZQBhAHQAZQBUAGEAYgBsAGUAcwAuAHMAcQBsACAAZQBtAGEAaQBsAA0ADQANAA0A\nIAANAA0ADQBQAGEAcgB0ACAAMwAsACAARABlAHYAZQBsAG8AcABpAG4AZwAgAHQAaABlACAA\nZQBtAGEAaQBsACAAcABhAHIAcwBlAHIADQANAA0AVABoAGUAIABNAG8AZAB1AGwAZQBzAA0A\nDQANAFQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABtAG8AZAB1AGwAZQBzACAAYQByAGUA\nIAB0AG8AIABiAGUAIABpAG4AcwB0AGEAbABsAGUAZAAgAHUAcwBpAG4AZwAgAEMAUABBAE4A\nOgANACAADQANAE0AYQBpAGwAOgA6AE0AYgBvAHgAUABhAHIAcwBlAHIAIABhACAAcwBpAG0A\ncABsAGUAIABpAG4AdABlAHIAZgBhAGMAZQAgAHQAaABhAHQAIABwAHIAbwB2AGkAZABlAHMA\nIAByAGUAYQBkAC0AbwBuAGwAeQAgAGEAYwBjAGUAcwBzACAAdABvACAAVQBOAEkAWAAtAG0A\nYQBpAGwAYgBvAHgAZQBzAA0ARABCAEkAIAAoAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAA\naQBuAHQAZQByAGYAYQBjAGUAKQAgAGEAbABsAG8AdwBzACAAYQAgAHAAZQByAGwAIABzAGMA\ncgBpAHAAdAAgAGEAYwBjAGUAcwBzACAAdABvACAAdABoAGUAIABQAG8AcwB0AGcAcgBlAHMA\nIABkAGEAdABhAGIAYQBzAGUADQANAE4AbwB0AGUAOgAgAGEAbABsACAAbQBvAGQAdQBsAGUA\ncwAgAHQAaABhAHQAIABEAEIASQAgAGEAbgBkACAATQBhAGkAbAA6ADoATQBiAG8AeABQAGEA\ncgBzAGUAcgAgAGQAZQBwAGUAbgBkAHMAIAB1AHAAbwBuACAAcwBoAG8AdQBsAGQAIABiAGUA\nIABhAHUAdABvAG0AYQB0AGkAYwBhAGwAbAB5ACAAaQBuAHMAdABhAGwAbABlAGQAIAB0AG8A\nbwAuAA0ADQANAFQAaABlACAAUABlAHIAbAAgAFMAYwByAGkAcAB0AA0ADQANAFQAaABlACAA\ncABhAHIAcwBlAHIAIABzAGMAcgBpAHAAdAAgAGYAaQByAHMAdAAgAGQAZQBmAGkAbgBlAHMA\nIAB0AGgAZQAgAGcAbABvAGIAYQBsACAAdgBhAHIAaQBhAGIAbABlAHMAIABhAG4AZAAgAHQA\naABlAG4AIABlAHMAdABhAGIAbABpAHMAaABlAHMAIABhACAAZABhAHQAYQBiAGEAcwBlACAA\nYwBvAG4AbgBlAGMAdABpAG8AbgAgAHcAaQB0AGgAIAB0AGgAZQAgAFAAbwBzAHQAZwByAGUA\nUwBRAEwAIABzAGUAcgB2AGUAcgA6AA0ADQANAG0AeQAgACQAZABiAGgAIAA9ACAARABCAEkA\nLQA+AGMAbwBuAG4AZQBjAHQAKAAkAGQAcwBuACwAJAB1AHMAZQByACwAJABwAGEAcwBzACkA\nOwANACAAdQBuAGwAZQBzAHMAIAAoAGQAZQBmAGkAbgBlAGQAIAAkAGQAYgBoACkAIAB7AGQA\naQBlACAAJABEAEIASQA6ADoAZQByAHIAcwB0AHIAOwB9ACAAJABkAGIAaAAtAD4AewBQAHIA\naQBuAHQARQByAHIAbwByAH0AIAA9ACAAMAA7AA0ADQANAFQAaABlACAAcwBjAHIAaQBwAHQA\nIAB0AGgAZQBuACAAcgBlAGEAZABzACAAdABoAGUAIABtAGEAaQBsAGIAbwB4ACAAYQBuAGQA\nIABiAHIAZQBhAGsAcwAgAGQAbwB3AG4AIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0ACAA\ncABhAHIAdABzACAAbwBmACAAZQBhAGMAaAAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABtAGUA\ncwBzAGEAZwBlADoADQANAA0AbQB5ACAAJABtAGIAIAA9ACAATQBhAGkAbAA6ADoATQBiAG8A\neABQAGEAcgBzAGUAcgAtAD4AbgBlAHcAKABcAEAAbQB5AGEAcgByAGEAeQAsAA0AIABkAGUA\nYwBvAGQAZQAgAD0APgAgACcAQQBMAEwAJwAsAA0AIABwAGEAcgBzAGUAcgBvAHAAdABzACAA\nPQA+ACAAJABwAGEAcgBzAGUAcgBvAHAAdABzACkAOwANAA0ADQBUAGgAZQAgAG0AYQBpAGwA\nYgBvAHgAIABtAGUAcwBzAGEAZwBlAHMAIABhAHIAZQAgAHAAcgBvAGMAZQBzAHMAZQBkACAA\naQBuAHMAaQBkAGUAIAB0AGgAZQAgAHcAaABpAGwAZQAgAGwAbwBvAHAAIAB3AGgAZQByAGUA\nIAB0AGgAZQAgAHAAYQByAHQAcwAgAG8AZgAgAHQAaABlACAAbQBlAHMAcwBhAGcAZQAgAG8A\nZgAgAGkAbgB0AGUAcgBlAHMAdAAgAGEAcgBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAA6AA0A\nDQANAG0AeQAgACQAaQBkACAAPQAgACQAbQBzAGcALQA+AGkAZAA7AA0AIABtAHkAIAAkAGYA\ncgBvAG0AIAA9ACAAJABtAHMAZwAtAD4AZgByAG8AbQAtAD4AewBlAG0AYQBpAGwAfQA7AA0A\nIABtAHkAIAAkAHMAdQBiAGoAZQBjAHQAIAA9ACAAJABtAHMAZwAtAD4AaABlAGEAZABlAHIA\nLQA+AHsAcwB1AGIAagBlAGMAdAB9ADsADQANAA0AVABoAGUAIABNAGIAbwB4AFAAYQByAHMA\nZQByACAAbQBvAGQAdQBsAGUAIABpAGQAZQBuAHQAaQBmAHkAaQBlAHMAIAB0AGgAZQAgAG0A\nYQBpAG4AIABiAG8AZAB5ACAAbwBmACAAdABoAGUAIABtAGUAcwBzAGEAZwBlADoADQANAA0A\nbQB5ACAAJABiAG8AZAB5ACAAPQAgACQAbQBzAGcALQA+AGIAbwBkAHkAKAAkAG0AcwBnAC0A\nPgBmAGkAbgBkAF8AYgBvAGQAeQApADsADQANAA0AVABoAGUAIABlAG0AYQBpAGwAIABtAGEA\naQBuACAAYgBvAGQAeQAgAGEAbgBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQByAGUA\nIAA/AHIAZQBmAGUAcgBlAG4AYwBlAGQAPwAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlAHMA\nLAAgAG0AYQBpAG4AIABhAG4AZAAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAB3AGkAdABoACAA\nYQBuACAAPwBvAGkAZAA/AC4AIABUAGgAaQBzACAAaQBzACAAYgBlAGMAYQB1AHMAZQAgAGQA\nYQB0AGEAIABjAGEAbgBuAG8AdAAgAGIAZQAgAGkAbgBzAGUAcgB0AGUAZAAgAGkAbgB0AG8A\nIABhACAAcgBvAHcAIAB0AGgAYQB0ACAAZQB4AGMAZQBlAGQAcwAgAHQAaABlACAAZABlAGYA\nYQB1AGwAdAAgAGQAYQB0AGEAIABwAGEAZwBlACAAcwBpAHoAZQAgAG8AZgAgADgAMQA5ADIA\nIABiAHkAdABlAHMALgAgAFQAbwAgAGcAZQB0ACAAYQByAG8AdQBuAGQAIAB0AGgAaQBzACAA\ndABoAGUAeQAgAGEAcgBlACAAaQBuAHMAdABlAGEAZAAgAGkAbgBzAGUAcgB0AGUAZAAgAGkA\nbgB0AG8AIAB0AGgAZQAgAGQAYQB0AGEAYgBhAHMAZQAgAGEAcwAgAD8AbABhAHIAZwBlACAA\nbwBiAGoAZQBjAHQAcwA/AC4AIABVAHAAbABvAGEAZABpAG4AZwAgAHQAaABlACAAbABhAHIA\nZwBlACAAbwBiAGoAZQBjAHQAIABpAHMAIABhAGMAaABpAGUAdgBlAGQAIABiAHkAIAB1AHMA\naQBuAGcAIABwAHMAcQBsADoADQANAA0AbQB5ACAAJABtAHkAbwBpAGQAPQBgAHAAcwBxAGwA\nIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAAtAC0AYwBvAG0AbQBhAG4AZAAgACIAXABcAGwA\nbwBfAGkAbQBwAG8AcgB0ACAAXAAnACQAYgBvAGQAeQBfAGYAaQBsAGUAXAAnACAAXAAnACQA\nbQB5AG0AYQBpAGwAYgBvAHgAXAAnACAAIgAgACQAZABiAGAAOwANACAAbQB5ACAAQABvAGkA\nZABhAHIAcgBhAHkAIAA9ACAAcwBwAGwAaQB0ACgALwAgAC8ALAAkAG0AeQBvAGkAZAApADsA\nDQANAA0AVABoAGkAcwAgAG0AZQB0AGgAbwBkACAAcgBlAHEAdQBpAHIAZQBzACAAbABlAHMA\ncwAgAGMAbwBkAGkAbgBnACAAYQBuAGQAIABpAHMAIAB0AGgAdQBzACAAcwBpAG0AcABsAGUA\ncgAgAHQAbwAgAHUAbgBkAGUAcgBzAHQAYQBuAGQAIABpAG4AcwB0AGUAYQBkACAAbwBmACAA\ndQBzAGkAbgBnACAAdABoAGUALAAgAGEAbABiAGUAaQB0ACAAbQBvAHIAZQAgAGUAZgBmAGkA\nYwBpAGUAbgB0ACwAIAB1AHMAZQAgAG8AZgAgAHQAaABlACAAbABpAGIAcABxACcAcwAgAGwA\nYQByAGcAZQAgAG8AYgBqAGUAYwB0ACAAYwBhAGwAbAAgAHcAaQB0AGgAaQBuACAAdABoAGUA\nIABwAGUAcgBsACAAcwBjAHIAaQBwAHQALgAgAA0ADQANAFcAZQAgAGEAcgBlACAAbgBvAHcA\nIABhAGIAbABlACAAdABvACAAcABvAHAAdQBsAGEAdABlACAAdABoAGUAIABlAG0AYQBpAGwA\nIABtAGUAcwBzAGEAZwBlACAAaQBuAHQAbwAgAHQAaABlACAAdABhAGIAbABlACAAbQBhAGkA\nbgA6AA0ADQANACQAcwBxAGwAIAA9ACAAIgBJAE4AUwBFAFIAVAAgAEkATgBUAE8AIABtAGEA\naQBuACAAVgBBAEwAVQBFAFMAKABcACcAJABpAGQAXAAnACwAXAAnACQAZgByAG8AbQBcACcA\nLABcACcAJABzAHUAYgBqAGUAYwB0AFwAJwAsAEAAbwBpAGQAYQByAHIAYQB5AFsAMQBdACkA\nIgA7AA0AIAAkAHMAdABoACAAPQAgACQAZABiAGgALQA+AHAAcgBlAHAAYQByAGUAKAAkAHMA\ncQBsACkAIABvAHIAIABkAGkAZQAgACQARABCAEkAOgA6AGUAcgByAHMAdAByADsADQAgACQA\ncwB0AGgALQA+AGUAeABlAGMAdQB0AGUAKAApACAAbwByACAAZABpAGUAIAAkAEQAQgBJADoA\nOgBlAHIAcgBzAHQAcgA7AA0ADQANAFQAaABpAHMAIABzAG4AaQBwAHAAZQB0ACAAbwBmACAA\nYwBvAGQAZQAgAGkAcwAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIAB0AGgA\nZQAgAGwAaQBzAHQAIABvAGYAIABlAG0AYQBpAGwAIAByAGUAYwBpAHAAaQBlAG4AdABzADoA\nDQANAA0AIwBQAE8AUABVAEwAQQBUAEUAIABUAEEAQgBMAEUAIAAnAG0AYQBpAGwAdABvACcA\nDQAgAGYAbwByACAAbQB5ACAAJABtAHMAZwBfAFQATwAgACgAJABtAHMAZwAtAD4AdABvACkA\nIAB7AA0AIAAkAHMAcQBsACAAPQAgACIASQBOAFMARQBSAFQAIABJAE4AVABPACAAbQBhAGkA\nbAB0AG8AIABWAEEATABVAEUAUwAoAFwAJwAkAGkAZABcACcALABcACcAJABtAHMAZwBfAFQA\nTwAtAD4AewBlAG0AYQBpAGwAfQBcACcAKQAiADsADQAgACQAcwB0AGgAIAA9ACAAJABkAGIA\naAAtAD4AcAByAGUAcABhAHIAZQAoACQAcwBxAGwAKQAgAG8AcgAgAGQAaQBlACAAJABEAEIA\nSQA6ADoAZQByAHIAcwB0AHIAOwANACAAJABzAHQAaAAtAD4AZQB4AGUAYwB1AHQAZQAoACkA\nIABvAHIAIABkAGkAZQAgACQARABCAEkAOgA6AGUAcgByAHMAdAByADsADQAgAH0ADQANAA0A\nDQAgAFQAaABlACAAbQBvAHMAdAAgAGkAbgB0AGUAcgBlAHMAdABpAG4AZwAgAHAAYQByAHQA\nIABvAGYAIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdAAgAGkAcwAgAHQAaABlACAA\naQBkAGUAbgB0AGkAZgB5AGkAbgBnACAAbwBmACAAbQBzAHcAbwByAGQAIABhAHQAdABhAGMA\naABtAGUAbgB0AHMAOgANAA0ADQAjACAARABFAFQARQBSAE0ASQBOAEUAIABBAFQAVABBAEMA\nSABNAEUATgBUACAATQBJAE0ARQAtAFQAWQBQAEUAUwANACAAbQB5ACAAJABkAGUAYwBvAGQA\nZQBkAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAA9ACAAYABlAGMAaABvACAAIgAkAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIgB8AC4ALwBkAGUAYwBvAGQAZQAuAHAAbAB8AHQAZQBlACAAJABhAHQA\ndABhAGMAaABtAGUAbgB0AF8AZgBpAGwAZQB8AGYAaQBsAGUAIAAtAGkAIAAtAGAAOwANACAA\nbQB5ACAAQAB0AGUAcwB0ADAAIAA9ACAAcwBwAGwAaQB0ACgALwAgAC8ALAAkAGQAZQBjAG8A\nZABlAGQAYQB0AHQAYQBjAGgAbQBlAG4AdAApADsADQAgAG0AeQAgACQAbQBpAG0AZQBfAHQA\neQBwAGUAIAA9ACAAQAB0AGUAcwB0ADAAWwAxAF0AOwANACAAYwBoAG8AbQBwACAAJABtAGkA\nbQBlAF8AdAB5AHAAZQA7AA0AIAANAA0ADQAjAFYAQQBMAEkARABBAFQASQBOAEcAIABNAFMA\nVwBPAFIARAAgAEQATwBDAFMADQAgAGkAZgAgACgAJABtAGkAbQBlAF8AdAB5AHAAZQAgAGUA\ncQAgACIAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC8AbQBzAHcAbwByAGQAIgApACAAewANACAA\nIwBDAE8ATgBWAEUAUgBUACAASQBOAFQATwAgAFIARQBBAEQAQQBCAEwARQAgAFQARQBYAFQA\nDQAgAGAAYQBuAHQAaQB3AG8AcgBkACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8AZgBpAGwA\nZQAgAD4AIAAkAG0AcwB3AG8AcgBkAF8AZgBpAGwAZQA7AG0AdgAgAC0AZgAgACQAbQBzAHcA\nbwByAGQAXwBmAGkAbABlACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8AZgBpAGwAZQBgADsA\nDQAgAH0AIABlAGwAcwBlACAAewANACAAIwBOAE8AVAAgAE0AUwBXAE8AUgBEACAARABPAEMA\nUwAsAA0AIAAjAFUAUwBFACAAVABIAEUAIABFAE4AQwBPAEQARQBEACAATQBJAE0ARQAgAFYA\nRQBSAFMASQBPAE4AIABJAE4AIABUAEgARQAgAEYASQBMAEUADQAgAGAAZQBjAGgAbwAgACIA\nJABhAHQAdABhAGMAaABtAGUAbgB0ACIAIAA+ACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8A\nZgBpAGwAZQBgADsADQAgAH0ADQANAA0AUABpAHAAaQBuAGcAIAB0AGgAZQAgAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIABpAG4AIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdAAgAGQA\nZQBjAG8AZABlAC4AcABsACAAZABlAGMAbwBkAGUAcwAgAHQAaABlACAAbQBpAG0AZQAtADYA\nNAAgAGIAYQBzAGUAIABiAGEAYwBrACAAaQBuAHQAbwAgAGkAdABzACAAbwByAGkAZwBpAG4A\nYQBsACAAYgBpAG4AYQByAHkAIABlAG4AYwBvAGQAaQBuAGcALAAgAGEAbAB0AGgAbwB1AGcA\naAAgAHQAaABpAHMAIABjAGEAbgAgAGIAZQAgAGQAbwBuAGUAIABiAHkAIABhACAAcABvAHMA\ndABnAHIAZQBzACAAZgB1AG4AYwB0AGkAbwBuACAAdABvAG8ALgAgAFQAaABlACAAZQBuAGMA\nbwBkAGUAZAAgAG8AdQB0AHAAdQB0ACAAaQBzACAAdABoAGUAbgAgAHAAaQBwAGUAZAAgAGkA\nbgB0AG8AIAB0AGgAZQAgAGMAbwBtAG0AYQBuAGQAIABsAGkAbgBlACAAdQB0AGkAbABpAHQA\neQAgAGYAaQBsAGUAIAB0AGgAYQB0ACAAZABlAHQAZQByAG0AaQBuAGUAcwAgAGkAZgAgAGkA\ndAAgAHIAZQBhAGwAbAB5ACAAaQBzACAAYQBuACAAbQBzAHcAbwByAGQAIABkAG8AYwB1AG0A\nZQBuAHQALgAgAEEAdAAgAHQAaABlACAAcwBhAG0AZQAgAHQAaQBtAGUAIAB0AGgAZQAgAGQA\nZQBjAG8AZABlAGQAIABhAHQAdABhAGMAaABtAGUAbgB0ACAAaQBzACAAcwBhAHYAZQBkACAA\nYQBzACAAdABoAGUAIAB0AGUAbQBwAG8AcgBhAHIAeQAgAGYAaQBsAGUALAAgACIALwB0AG0A\ncAAvAGEAdAB0AGEAYwBoAG0AZQBuAHQAIgAuAA0ADQANAEEAbgAgAGEAdAB0AGEAYwBoAG0A\nZQBuAHQAIAB0AGgAYQB0ACAAaQBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAGEAcwAgAGEA\nbgAgAG0AcwB3AG8AcgBkACAAZABvAGMAdQBtAGUAbgB0ACwAIAB3AGkAdABoACAAYQAgAE0A\nSQBNAEUAIAB0AHkAcABlACAAbwBmACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC8AbQBzAHcA\nbwByAGQALAAgAGkAcwAgAHAAcgBvAGMAZQBzAHMAZQBkACAAdABoAHIAbwB1AGcAaAAgAHQA\naABlACAAYwBvAG0AbQBhAG4AZAAgAGwAaQBuAGUAIAB1AHQAaQBsAGkAdAB5ACAAYQBuAHQA\naQB3AG8AcgBkACAAdABoAGEAdAAgAHQAdQByAG4AcwAgAGkAdAAgAGkAbgB0AG8AIABhAG4A\nIABhAHMAYwBpAGkAIAB0AGUAeAB0ACAAZABvAGMAdQBtAGUAbgB0ACAAYQBuAGQAIABpAHMA\nIAB1AHAAbABvAGEAZABlAGQAIABhAHMAIABhACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQA\nLgANAA0ADQBBAGwAbAAgAG8AdABoAGUAcgAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAcwAgAGEA\ncgBlACAAcwBhAHYAZQBkACAAaQBuACAAdABoAGUAaQByACAAbwByAGkAZwBpAG4AYQBsACAA\nTQBJAE0ARQAgAGUAbgBjAG8AZABpAG4AZwAgAGkAbgAgAHQAaABlACAAZABhAHQAYQBiAGEA\ncwBlACAAYQBzACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQAcwAuAA0ADQANAFAAYQByAHQA\nIAA0ACwAIABRAHUAZQByAHkAaQBuAGcAIAB0AGgAZQAgAGQAYQB0AGEAYgBhAHMAZQANAA0A\nDQBRAHUAZQByAGkAZQBzAA0AIAANAA0ADQBUAGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAA\ncQB1AGUAcgBpAGUAcwAgAGEAcgBlACAAYgBhAHMAZQBkACAAbwBuACAAbQB5ACAAbwB3AG4A\nIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAASQAgAHUAcwBlAGQAIAB0AG8AIABkAGUA\ndgBlAGwAbwBwACAAdABoAGkAcwAgAGEAcgB0AGkAYwBsAGUALgANACAADQANAA0ARgBpAHIA\ncwB0ACwAIABzAHUAbQBtAGEAcgBpAHoAZQAgAGEAbABsACAAdABoAGUAIABlAG0AYQBpAGwA\nIABtAGUAcwBzAGEAZwBlAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAbwB0AGgAIABhACAA\nbQBhAGkAbgAgAGIAbwBkAHkAIABhAG4AZAAgAGEAbgAgAGEAdAB0AGEAYwBoAG0AZQBuAHQA\nIABpAG4AIABhACAAcwBpAG0AcABsAGUAIABxAHUAZQByAHkAIAAoAHIAZQBmAGUAcgAgAHQA\nbwAgAHQAaABlACAAdABhAGIAbABlACAAYwByAGUAYQB0AGkAbwBuACAAcwBjAHIAaQBwAHQA\nKQA6AA0AIAANAA0ADQBTAEUATABFAEMAVAANACAAbQAuAGYAcgBvAG0AXwBlAG0AYQBpAGwA\nIABBAFMAIABGAHIAbwBtACwADQAgAG0ALgBzAHUAYgBqAGUAYwB0ACAAQQBTACAAUwB1AGIA\nagBlAGMAdAAsAA0AIABtAC4AbQBhAGkAbABiAG8AZAB5ACAAQQBTACAATQBlAHMAcwBhAGcA\nZQAsAA0AIABhAC4AYQB0AHQAYQBjAGgAbQBlAG4AdAAgAEEAUwAgAEEAdAB0AGEAYwBoAG0A\nZQBuAHQADQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgAbQBlAG4A\ndAAgAGEADQAgAFcASABFAFIARQAgAG0ALgBtAGUAcwBzAGEAZwBlAGkAZAA9AGEALgBtAGUA\ncwBzAGEAZwBlAA0AIAANACAADQANAA0ARgBSAE8ATQANACAADQBTAHUAYgBqAGUAYwB0AA0A\nIAANAE0AZQBzAHMAYQBnAGUADQAgAA0AQQB0AHQAYQBjAGgAbQBlAG4AdAANACAADQANAA0A\ncgBvAGIAZQByAHQALgBiAGUAcgBuAGkAZQByADUAQABzAHkAbQBwAGEAdABpAGMAbwAuAGMA\nYQANAG0AZQBzAHMAYQBnAGUAIAAxAA0AIAANADYAMAAyADIANwANADYAMAAyADMAMAANAA0A\nDQByAG8AYgBlAHIAdAAuAGIAZQByAG4AaQBlAHIANQBAAHMAeQBtAHAAYQB0AGkAYwBvAC4A\nYwBhAA0AbQBlAHMAcwBhAGcAZQAgADIADQAgAA0ANgAwADIAMwAzAA0ANgAwADIAMwA2AA0A\nDQANAGMAYQBzAGUAcwB0AHUAZAB5AEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0A\nbQBlAHMAcwBhAGcAZQAgADMADQAgAA0ANgAwADIAMwA5AA0ANgAwADIANAAyAA0ADQANAGMA\nYQBzAGUAcwB0AHUAZAB5AEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0AbQBlAHMA\ncwBhAGcAZQAgADQADQAgAA0ANgAwADIANAA1AA0ANgAwADIANAA4AA0ADQANACAADQANAFQA\naABlACAATQBlAHMAcwBhAGcAZQAgAGEAbgBkACAAQQB0AHQAYQBjAGgAbQBlAG4AdABzACAA\nYQByAGUAIABvAGkAZAAnAHMALAAgAG8AcgAgAHIAZQBmAGUAcgBlAG4AYwBlACAAbgB1AG0A\nYgBlAHIAcwAsACAAIAB0AG8AIAB0AGgAZQAgAGwAYQByAGcAZQAgAG8AYgBqAGUAYwB0AHMA\nIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABsAG8AYQBkAGUAZAAgAGkAbgAgAHQA\naABlACAAcABnAF8AbABhAHIAZwBlAG8AYgBqAGUAYwB0ACAAYwBhAHQAYQBsAG8AZwAuAA0A\nIAANAA0ADQBOAG8AdwAsACAAbABpAHMAdAAgAGEAbABsACAAbQBlAHMAcwBhAGcAZQBzACAA\ndABoAGEAdAAgAGgAYQBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQBuAGQAIABpAGQA\nZQBuAHQAaQBmAHkAIAB3AGgAaQBjAGgAIABvAG4AZQBzACAAdwBlAHIAZQAgAG0AcwB3AG8A\ncgBkACAAZABvAGMAdQBtAGUAbgB0AHMAOgANACAADQAgAFMARQBMAEUAQwBUAA0AIABtAC4A\nbQBlAHMAcwBhAGcAZQBpAGQAIABBAFMAIAAiAE0AZQBzAHMAYQBnAGUAIABJAEQAIgAsAA0A\nIABhAC4AYQB0AHQAYQBjAGgAbQBlAG4AdAAgAEEAUwAgACIAQQB0AHQAYQBjAGgAbQBlAG4A\ndAAgAG8AaQBkACIALAANACAAQwBBAFMARQANACAAIABXAEgARQBOACAAYQAuAG0AaQBtAGUA\nXwB0AHkAcABlAD0AJwBhAHAAcABsAGkAYwBhAHQAaQBvAG4ALwBtAHMAdwBvAHIAZAAnACAA\nVABIAEUATgAgACcAdAByAHUAZQAnAA0AIAAgAEUATABTAEUAIAAnAGYAYQBsAHMAZQAnAA0A\nIABFAE4ARAAgAEEAUwAgACIAbQBzAHcAbwByAGQAIABhAHQAdABhAGMAaABtAGUAbgB0ACIA\nDQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAgAGEA\nDQAgAFcASABFAFIARQAgAG0ALgBtAGUAcwBzAGEAZwBlAGkAZAA9AGEALgBtAGUAcwBzAGEA\nZwBlAGkAZAA7AA0AIAANAA0ADQAgAA0ADQBNAGUAcwBzAGEAZwBlACAASQBEAA0AIAANAEEA\ndAB0AGEAYwBoAG0AZQBuAHQAIABvAGkAZAANACAADQBtAHMAdwBvAHIAZAAgAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIAANAA0ADQAzAEYARgA3ADkARgAwADgALgA2ADAANgAwADIAMAA4AEAA\ncwB5AG0AcABhAHQAaQBjAG8ALgBjAGEADQA2ADAAMgAzADAAIAANAHQAcgB1AGUADQAgAA0A\nDQANADMARgBGADcAOQBGADIAOQAuADIAMAA5ADAAMQAwADEAQABzAHkAbQBwAGEAdABpAGMA\nbwAuAGMAYQANADYAMAAyADMANgAgAA0AZgBhAGwAcwBlAA0ADQANADMARgBGADcAQQA1ADEA\nMQAuADIAMAAzADAAMQAwADQAQABwAG8AcwB0AGcAcgBlAHMAcQBsAC4AbwByAGcADQA2ADAA\nMgA0ADIAIAANAGYAYQBsAHMAZQANAA0ADQAzAEYARgA3AEEANQAyAEEALgA4ADAANAAwADIA\nMAAzAEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0ANgAwADIANAA4ACAADQB0AHIA\ndQBlAA0ADQANACAADQANAA0AIABZAG8AdQAgAGMAYQBuACAAcgBlAHQAdQByAG4AIABhAG4A\neQAgAG0AcwB3AG8AcgBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAgACgAcgBlAG0AZQBtAGIA\nZQByACAAdABoAGUAeQAnAHYAZQAgAGIAZQBlAG4AIABhAGwAbAAgAGMAbwBuAHYAZQByAHQA\nZQBkACAAdABvACAAYQBzAGMAaQBpACAAdABlAHgAdAApACAAYgB5ACAAdQBzAGkAbgBnACAA\nYQAgAHEAdQBlAHIAeQAgAHMAaQBtAGkAbABhAHIAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwA\nbwB3AGkAbgBnADoADQAgAA0AIABTAEUATABFAEMAVAANACAAZQBuAGMAbwBkAGUAKABsAG8A\nLgBkAGEAdABhACwAJwBlAHMAYwBhAHAAZQAnACkAIABBAFMAIAAiAE0AeQAgAEQAbwBjAHUA\nbQBlAG4AdAAiAA0AIABGAFIATwBNAA0AIABwAGcAXwBsAGEAcgBnAGUAbwBiAGoAZQBjAHQA\nIABsAG8ALAAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAIABhAA0AIABXAEgARQBSAEUADQAgAGEA\nLgBtAGUAcwBzAGEAZwBlAGkAZAAgAD0AIAAnADMARgBGADcAQQA1ADIAQQAuADgAMAA0ADAA\nMgAwADMAQABwAG8AcwB0AGcAcgBlAHMAcQBsAC4AbwByAGcAJwANACAAQQBOAEQADQAgAGEA\nLgBhAHQAdABhAGMAaABtAGUAbgB0ACAAPQAgAGwAbwAuAGwAbwBpAGQAOwANACAADQAgAFQA\naABlACAAZQBuAGMAbwBkAGUAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAcwB0AHMAIAAiAE0A\neQAgAEQAbwBjAHUAbQBlAG4AdAAiACAAZgByAG8AbQAgAGIAeQB0AGUAYQAgAHQAbwAgAGEA\nIAB0AHkAcABlACAAdABlAHgAdAAgAGIAeQAgAHIAZQBtAG8AdgBpAG4AZwAgAGEAbABsACAA\nZQBzAGMAYQBwAGUAIABzAGUAcQB1AGUAbgBjAGUAcwAgAHQAaABhAHQAIAB3AGUAcgBlACAA\nbwByAGkAZwBpAG4AYQBsAGwAeQAgAGkAbgBzAGUAcgB0AGUAZAAgAGIAeQAgAHQAaABlACAA\nbABvAF8AaQBtAHAAbwByAHQAIABmAHUAbgBjAHQAaQBvAG4ALgANACAADQANAA0AUwBlAGEA\ncgBjAGgAaQBuAGcAIABGAG8AcgAgAFAAYQB0AHQAZQByAG4AcwANAA0AIABUAGgAZQByAGUA\nIABhAHIAZQAgAHQAdwBvACAAdwBhAHkAcwAgAHQAbwAgAHMAZQBhAHIAYwBoACAAdABlAHgA\ndAA7ACAAdABoAGUAIABTAFEATAAgAHcAYQB5ACAAYQBuAGQAIAB0AGgAZQAgAFAAbwBzAHQA\nZwByAGUAcwAsACAAUABPAFMASQBYACAAcwB0AHkAbABlACAAbwBmACAAcgBlAGcAdQBsAGEA\ncgAgAGUAeABwAHIAZQBzAHMAaQBvAG4AcwA6AA0AIAANAA0AVQBzAGkAbgBnACAATABJAEsA\nRQANAA0AIAANAA0AVABoAGkAcwAgAHEAdQBlAHIAeQAgAHcAaQBsAGwAIABzAGUAYQByAGMA\naAAgAHQAaABlACAAcABoAHIAYQBzAGUAIAAiAFQAaABlAHMAZQAgAGYAdQBuAGMAdABpAG8A\nbgBzACAAcgBlAGEAZAAgAGEAbgBkACAAdwByAGkAdABlACIAIABpAG4AIABhACAAcABhAHIA\ndABpAGMAdQBsAGEAcgAgAHcAbwByAGQAIABkAG8AYwB1AG0AZQBuAHQALgANAA0AIAANAA0A\nUwBFAEwARQBDAFQADQAgAG0ALgBmAHIAbwBtAF8AZQBtAGEAaQBsACAAQQBTACAAIgBGAHIA\nbwBtACIALAANACAAYQAuAGQAZQBzAGMAcgBpAHAAdABpAG8AbgAgAEEAUwAgACIARgBpAGwA\nZQAgAG4AYQBtAGUAIgAsAA0AIABDAEEAUwBFAA0AIAAgACAAVwBIAEUATgAgAGUAbgBjAG8A\nZABlACgAbABvAC4AZABhAHQAYQAsACcAZQBzAGMAYQBwAGUAJwApACAATABJAEsARQAgACcA\nJQBUAGgAZQBzAGUAIABmAHUAbgBjAHQAaQBvAG4AcwAgAHIAZQBhAGQAIABhAG4AZAAgAHcA\ncgBpAHQAZQAlACcAIABUAEgARQBOACAAJwB0AHIAdQBlACcADQAgACAAIABFAEwAUwBFACAA\nJwBmAGEAbABzAGUAJwANACAARQBOAEQAIABBAFMAIAAiAFMAZQBhAHIAYwBoACAAcgBlAHMA\ndQBsAHQAcwAiAA0AIABGAFIATwBNACAAcABnAF8AbABhAHIAZwBlAG8AYgBqAGUAYwB0ACAA\nbABvACwAIABhAHQAdABhAGMAaABtAGUAbgB0ACAAYQAsACAAbQBhAGkAbgAgAG0ADQAgAFcA\nSABFAFIARQANACAAYQAuAG0AZQBzAHMAYQBnAGUAaQBkACAAPQAgACcAMwBGAEYANwBBADUA\nMgBBAC4AOAAwADQAMAAyADAAMwBAAHAAbwBzAHQAZwByAGUAcwBxAGwALgBvAHIAZwAnAA0A\nIABBAE4ARAANACAAYQAuAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAA9ACAAbABvAC4AbABvAGkA\nZAANACAAQQBOAEQADQAgAGEALgBtAGUAcwBzAGEAZwBlAGkAZAAgAD0AIABtAC4AbQBlAHMA\ncwBhAGcAZQBpAGQAOwANAA0AIAANACAADQANAEYAcgBvAG0ADQBGAGkAbABlACAAbgBhAG0A\nZQANAFMAZQBhAHIAYwBoACAAcgBlAHMAdQBsAHQAcwANAA0ADQBjAGEAcwBlAHMAdAB1AGQA\neQBAAHAAbwBzAHQAZwByAGUAcwBxAGwALgBvAHIAZwANAGQAbwBjADIALgBkAG8AYwANAHQA\ncgB1AGUADQANAA0AIAANAA0AUgBlAGcAdQBsAGEAcgAgAEUAeABwAHIAZQBzAHMAaQBvAG4A\ncwANAA0AIAANAA0AVABoAGkAcwAgAHEAdQBlAHIAeQAgAHcAaQBsAGwAIABjAG8AdQBuAHQA\nIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAZQBtAGEAaQBsAHMAIAB3AGkAdABoACAA\nYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQBuAGQAIAB3AGgAbwBzAGUAIABlAG0AYQBpAGwA\nIABhAGQAZAByAGUAcwBzACAAYgBlAGcAaQBuAHMAIAB3AGkAdABoACAAdABoAGUAIABsAGUA\ndAB0AGUAcgBzACAAIgBjAGEAIgAgAGEAbgBkACAAZQBuAGQAcwAgAGkAbgAgACIAbwByAGcA\nIgAuAA0AIAANAA0ADQBTAEUATABFAEMAVAAgAGMAbwB1AG4AdAAoAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACkADQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgA\nbQBlAG4AdAAgAGEADQAgAFcASABFAFIARQANACAAbQAuAG0AZQBzAHMAYQBnAGUAaQBkACAA\nPQAgAGEALgBtAGUAcwBzAGEAZwBlAGkAZAANACAAQQBOAEQADQAgAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACAAfgAgACcAXgBjAGEAJwANACAAQQBOAEQADQAgAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACAAfgAgACcAbwByAGcAJAAnADsADQAgAA0ADQANAEMAYQB2AGUAYQB0AHMA\nDQANACAADQBLAGUAZQBwAGkAbgBnACAAdABoAGUAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQA\nIABhAHMAIABzAGkAbQBwAGwAZQAgAGEAcwAgAHAAbwBzAHMAaQBiAGwAZQAgAGgAYQBzACAA\nbQBhAGQAZQAgAGkAdAAgAG4AZQBjAGUAcwBzAGEAcgB5ACAAdABvACAAYQBzAHMAdQBtAGUA\nIAB0AGgAYQB0ACAAYQBsAGwAIABlAG0AYQBpAGwAIABhAHQAdABhAGMAaABtAGUAbgB0AHMA\nIABhAHMAIABtAGkAbQBlACAAZQBuAGMAbwBkAGUAZAAgAGIAYQBzAGUANgA0AC4ADQAgAA0A\nVABoAGUAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAIABoAGEAcwAgAGIAZQBlAG4AIAB3AHIA\naQB0AHQAZQBuACAAaQBuACAAYQAgAG0AYQBuAG4AZQByACAAdABoAGEAdAAgAGYAbwBsAGwA\nbwB3AHMAIAB0AGgAZQAgAGYAbABvAHcAIABvAGYAIAB0AGgAaQBzACAAYQByAHQAaQBjAGwA\nZQAgAHMAbwAgAGkAdAAgAGgAYQBzACAAcgBlAHMAdQBsAHQAZQBkACAAaQBuACAAYwBvAGQA\nZQAgAHQAaABhAHQAIABpAHMAIABhACAAYgBpAHQAIABjAGwAdQBtAHMAeQAgADoALQAoACAA\nLgANACAADQBTAGEAdgBlACAAeQBvAHUAcgBzAGUAbABmACAAdABpAG0AZQAgAGEAbgBkACAA\nZwByAGkAZQBmACAAYgB5ACAAcwBhAHYAaQBuAGcAIABzAHEAbAAgAHEAdQBlAHIAaQBlAHMA\nIABhAG4AZAAgAGQAZQBmAGkAbgBpAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABmAGkAbABlACAA\nYQBuAGQAIAB0AGgAZQBuACAAaQBuAHYAbwBrAGkAbgBnACAAaQB0ACAAdABoAHIAbwB1AGcA\naAAgAHQAaABlACAAcABzAHEAbAAgAGMAbABpAGUAbgB0AC4ADQAgAA0ASQBuAHYAbwBrAGUA\nIAB0AGgAZQAgAGMAcgBlAGEAdABlAFQAYQBiAGwAZQBzAC4AcwBxAGwAIAB0AG8AIABjAGwA\nZQBhAG4AIABvAHUAdAAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAAYQBzACAAeQBvAHUA\nIAByAGUAcgB1AG4AIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdABzAC4ADQAgAA0A\nVABoAGUAIABkAGEAdABhAGIAYQBzAGUAIABkAGUAZgBpAG4AaQB0AGkAbwBuAHMAIABoAGEA\ndgBlACAAYgBlAGUAbgAgAGQAZQBtAG8AbgBzAHQAcgBhAHQAZQBkACAAbwBuAGwAeQAgAHMA\nbwAgAGYAYQByACAAYQBzACAAdABvACAAcwBoAG8AdwAgAHcAaABlAHIAZQAgAHkAbwB1ACAA\nYwBhAG4AIABtAGEAawBlACAAYQAgAHMAdABhAHIAdAAuACAATQBhAGsAaQBuAGcAIABhACAA\nZABhAHQAYQBiAGEAcwBlACAAdABoAGEAdAAgAGYAbABpAGUAcwAgAGwAaQBrAGUAIABhACAA\nagBlAHQAIABpAHMAIABhAG4AIABhAHIAdABpAGMAbABlACAAaQBuACAAaQB0AHMAZQBsAGYA\nLgANACAADQBBAG4AdABpAHcAbwByAGQAIABpAHMAIABhACAAYgBpAHQAIABxAHUAaQByAGsA\neQAgAGkAbgAgAHQAaABhAHQAIABpAHQAIAB3AGkAbABsACAAbgBvAHQAIABwAGEAcgBzAGUA\nIABmAGkAbABlAHMAIAB0AGgAYQB0ACAAaQB0ACAAZgBlAGUAbABzACAAaQBzACAAdABvAG8A\nIABzAG0AYQBsAGwALgANACAADQBWAGkAZQB3AGkAbgBnACAAdABoAGUAIABtAG8AegBpAGwA\nbABhACAAbQBiAG8AeAAgAHQAaAByAG8AdQBnAGgAIABpAHQAJwBzACAAYwBsAGkAZQBuAHQA\nIABjAGEAbgAgAGIAZQAgAGQAZQBjAGUAaQB2AGkAbgBnAC4AIABJAHQAIABuAGUAdgBlAHIA\nIAByAGUAYQBsAGwAeQAgAHIAZQBtAG8AdgBlAHMAIABlAG0AYQBpAGwAIABmAHIAbwBtACAA\ndABoAGUAIABiAG8AeAAgAGUAdgBlAG4AIABpAGYAIAB5AG8AdQAnAHYAZQAgAGQAZQBsAGUA\ndABlAGQAIABpAHQAIAB0AGgAcgBvAHUAZwBoACAAdABoAGUAIABtAGEAaQBsACAAYwBsAGkA\nZQBuAHQAIABzAG8AIAB3AGgAZQBuACAAeQBvAHUAIABtAGEAeQAgAHcAZQBsAGwAIABzAGUA\nZQAgAGUAbQBhAGkAbAAgAGkAbgAgAHkAbwB1AHIAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgA\nYQB0ACAAeQBvAHUAIAB0AGgAbwB1AGcAaAB0ACAAeQBvAHUAIABkAGUAcwB0AHIAbwB5AGUA\nZAAgAG0AbwBuAHQAaABzACAAYgBlAGYAbwByAGUALgANACAADQBZAG8AdQAgAGMAYQBuACAA\nZQB4AHAAbwByAHQAIABsAGEAcgBnAGUAIABvAGIAagBlAGMAdABzACAAZgByAG8AbQAgAHQA\naABlACAAZABhAHQAYQBiAGEAcwBlACAAYgB5ACAAdQBzAGkAbgBnACAAdABoAGUAIABmAHUA\nbgBjAHQAaQBvAG4AIABsAG8AXwBlAHgAcABvAHIAdAAgAGkAbgAgAHQAaABlACAAIABwAHMA\ncQBsACAAYwBsAGkAZQBuAHQAIABhAG4AZAAgAHMAYQB2AGkAbgBnACAAaQB0ACAAYQBzACAA\nYQAgAGYAaQBsAGUALgAgAEYAbwByACAAZQB4AGEAbQBwAGwAZQAgACIAXABsAG8AXwBlAHgA\ncABvAHIAdAAgADEAMgAzACAAdABlAG0AcAAuAHQAeAB0ACIAIAB3AGkAbABsACAAcwBhAHYA\nZQAgAHQAaABlACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQAIAB3AGkAdABoACAAdABoAGUA\nIABvAGkAZAAgAG4AdQBtAGIAZQByACAAbwBmACAAMQAzADIAIAB0AG8AIABhACAAZgBpAGwA\nZQAgAG4AYQBtAGUAZAAgAHQAZQBtAHAALgB0AHgAdAAuAA0AIAANAA0AQwBvAG4AYwBsAHUA\ncwBpAG8AbgANAA0AIAANAA0AVABoAGUAcgBlACAAYQByAGUAIAB0AHcAbwAgAHAAYQByAHQA\ncwAgAHQAbwAgAGEAIABzAHUAYwBjAGUAcwBzAGYAdQBsACAAZABhAHQAYQAgAG0AaQBuAGUA\nOwAgAHQAaABlACAAbQBlAGMAaABhAG4AaQBzAG0AIAB0AGgAYQB0ACAAcAByAGUAcABhAHIA\nZQBzACAAdABoAGUAIABkAG8AYwB1AG0AZQBuAHQAIAAgAGEAbgBkACAAdABoAGUAIABhAGwA\nZwBvAHIAaQB0AGgAbQAgAHQAaABhAHQAIABsAG8AbwBrAHMAIABmAG8AcgAgAHAAYQB0AHQA\nZQByAG4AcwAuACAAVwBlACcAdgBlACAAbABvAG8AawBlAGQAIABhAHQAIABvAG4AZQAgAHcA\nYQB5ACAAbwBmACAAZwBlAHQAdABpAG4AZwAgAGUAbQBhAGkAbAAgAGkAbgB0AG8AIABhACAA\nZABhAHQAYQBiAGEAcwBlACAAYgB1AHQAIABmAHIAYQBuAGsAbAB5ACAASQAgAGgAYQB2AGUA\nbgAnAHQAIABnAGkAdgBlAG4AIAB0AGgAYQB0ACAAbQB1AGMAaAAgAGMAbwB2AGUAcgBhAGcA\nZQAgAG8AbgAgAHQAaABlACAAcABvAHcAZQByACAAbwBmACAAcgBlAGcAdQBsAGEAcgAgAGUA\neABwAHIAZQBzAHMAaQBvAG4AcwAgAGkAbgAgAGEAIABkAGEAdABhAGIAYQBzAGUAIABlAG4A\ndgBpAHIAbwBuAG0AZQBuAHQALgAgAEkAdAAgAHcAbwBuACcAdAAgAGMAbwBtAGUAIABhAHMA\nIABhACAAcwB1AHIAcAByAGkAcwBlACAAdABvACAAbQBhAG4AeQAgAG8AZgAgAHkAbwB1ACAA\ndABoAGEAdAAgAHQAaABlAHIAZQAgAGEAcgBlACAAYQBsAHIAZQBhAGQAeQAgAG8AcABlAG4A\nIABzAG8AdQByAGMAZQAgAHAAcgBvAGoAZQBjAHQAcwAgAG8AdQB0ACAAdABoAGUAcgBlACAA\nZABlAGEAbABpAG4AZwAgAHcAaQB0AGgAIABzAGUAYQByAGMAaAAgAGUAbgBnAGkAbgBlAHMA\nIAB0AGUAYwBoAG4AbwBsAG8AZwBpAGUAcwAuACAASQBtAHAAbABlAG0AZQBuAHQAaQBuAGcA\nIAB0AGgAZQAgAHIAaQBnAGgAdAAgAHAAcgBvAGoAZQBjAHQAIABjAGEAbgAgAGUAYQBzAGkA\nbAB5ACAAdAB1AHIAbgAgAHkAbwB1AHIAIABmAG8AcgB3AGEAeQAgAGkAbgB0AG8AIABlAG0A\nYQBpAGwAIABkAGEAdABhAG0AaQBuAGcAIABpAG4AdABvACAAdABoAGUAIABmAHIAYQBtAGUA\ndwBvAHIAawAgAGYAbwByACAAYQAgAGsAaQBsAGwAZQByACAAYQBwAHAALgAgAE8AbgBlACAA\nZQB4AGEAbQBwAGwAZQAgAGkAcwAgAHQAaABlACAATwBwAGUAbgBGAFQAUwAgAHAAcgBvAGoA\nZQBjAHQAIAB3AGgAaQBjAGgAIABvAGYAZgBlAHIAcwAgAGEAIABQAG8AcwB0AGcAcgBlAFMA\nUQBMACAAYgBhAHMAZQBkACAAZgB1AGwAbAAgAGkAbgBkAGUAeABpAG4AZwAgAHQAbwBvAGwA\nLgAgAEoAdQBzAHQAIABpAG0AYQBnAGkAbgBlACAAdwBoAGEAdAAgAHkAbwB1ACAAYwBhAG4A\nIABkAG8ALgAgAEkAIABiAGUAdAAgAHMAbwBtAGUAIABvAGYAIAB5AG8AdQAgAFAAZQByAGwA\nIABmAGkAZQBuAGQAcwAgAGgAYQB2AGUAIABhACAAcAByAGUAdAB0AHkAIABnAG8AbwBkACAA\naQBkAGUAYQAgAG8AZgAgAHQAaABlACAAcABvAHMAcwBpAGIAaQBsAGkAdABpAGUAcwAgADsA\nLQApACAALgANAA0AIAANACAADQANAA0AUgBlAGYAZQByAGUAbgBjAGUAcwA6AA0ADQAgAA0A\nUABlAHIAbAAgAGgAbwBtAGUAcwBpAHQAZQANACAADQBDAFAAQQBOAA0AIAANAFAAbwBzAHQA\nZwByAGUAUwBRAEwAIABoAG8AbQBlAHMAaQB0AGUADQAgAA0AQQBuAHQAaQB3AG8AcgBkAA0A\nIAANAGMAcgBlAGEAdABlACAAdABhAGIAbABlACAAcwBjAHIAaQBwAHQADQAgAA0AbQBhAGkA\nbAAgAHAAYQByAHMAaQBuAGcAIABzAGMAcgBpAHAAdAANACAADQBNAEkATQBFACAAZABlAGMA\nbwBkAGkAbgBnACAAcwBjAHIAaQBwAHQADQAgAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAABAAAzHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEAAAYBAAAGgQAABwE\nAAAmBwAAKAcAACoHAABsCAAAbggAAHAIAAByCQAAdAkAAHYJAAC4DAAAugwAALwMAAB8DgAA\n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\nAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB\nAAAAAQAAAAEAAAABAAAAAQAAABjScQAA1nEAAPJxAAD2cQAAAHIAAARyAAAscgAAMHIAAEJy\nAABGcgAAbnIAAHJyAACacgAAnnIAAMhyAADMcgAA/QAAAAAAAAAAAAAAAPsAAAAAAAAAAAAA\nAAD5AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA\n8QAAAAAAAAAAAAAAAO8AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA6wAAAAAAAAAAAAAAAOkA\nAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5QAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADhAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA\nAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAADyIAH7DQLyCw\n4D0hsAgHIrAIByOQoAUkkKAFM1AAACgyAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAUgBvAG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYABQD//////////wEAAAAGCQIAAAAAAMAA\nAAAAAABGAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAgAgAAAAAAAABAEMAbwBtAHAATwBiAGoA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAAIA\nAAAEAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAA\nAAAAAAEATwBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAKAAIA/////wMAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAgAAABQAAAAAAAAAMQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgD///////////////8AAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAEwYAAAAAAAAFAFMAdQBtAG0A\nYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nKAACAAUAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA\nAABQAQAAAAAAAFcAbwByAGQARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAACAAAACSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////\n//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAP7///8AAAAAAAAAAA==\n\n--5vNYLRcllDrimb99--\n\n 64036 820 412 From bernier@wolf Sun Apr 25 22:54:44 2004\nReturn-Path: \nX-Original-To: bernier@localhost\nDelivered-To: bernier@localhost\nReceived: by wolf (Postfix, from userid 1002)\n\tid D61A41BE01; Sun, 25 Apr 2004 22:54:43 -0400 (EDT)\nTo: bernier@localhost\nSubject: communication one\nMessage-Id: <20040426025443.D61A41BE01@wolf>\nDate: Sun, 25 Apr 2004 22:54:43 -0400 (EDT)\nFrom: bernier@wolf (Robert Bernier)\n\n 412 821 412 Rome is the capital city of Italy. Building started in 753 B.C. and the Romans have a story to explain how this happened. Twin boys, Romulus and Remus, were taken from their mother and left by the river Tiber to starve. A mother wolf found the babies and looked after them until they were old enough to take care of themselves. \n\n 330 822 413 From bernier@wolf Sun Apr 25 22:56:14 2004\nReturn-Path: \nX-Original-To: bernier@localhost\nDelivered-To: bernier@localhost\nReceived: by wolf (Postfix, from userid 1002)\n\tid 279D623463; Sun, 25 Apr 2004 22:56:14 -0400 (EDT)\nTo: bernier@localhost\nSubject: how romans lived\nMessage-Id: <20040426025614.279D623463@wolf>\nDate: Sun, 25 Apr 2004 22:56:14 -0400 (EDT)\nFrom: bernier@wolf (Robert Bernier)\n\n 411 823 413 At first, Rome was ruled by kings. They were sometimes very cruel and the last king, Tarquin the Proud, was overthrown. Rome then became a republic for the next four hundred years. \n\nThis republic was ruled by a senate, and people called Senators were elected to do different jobs in the senate. However, not everyone was allowed to vote in these elections. Women and slaves were not allowed to vote and neither were poor people. Those Roman people who were not slaves were called 'citizens'. \n\n\nIn the 1st century B.C. the generals who controlled the army became very powerful. Rome was no longer just a city, it was the capital of an empire. The Romans ruled lands from France to North Africa. You can see this in our map. \n\n 727 824 414 From bernier@wolf Sun Apr 25 22:57:06 2004\nReturn-Path: \nX-Original-To: bernier@localhost\nDelivered-To: bernier@localhost\nReceived: by wolf (Postfix, from userid 1002)\n\tid 156A123463; Sun, 25 Apr 2004 22:57:06 -0400 (EDT)\nTo: bernier@localhost\nSubject: who were the roman emperors\nMessage-Id: <20040426025706.156A123463@wolf>\nDate: Sun, 25 Apr 2004 22:57:06 -0400 (EDT)\nFrom: bernier@wolf (Robert Bernier)\n\n 422 825 414 A Roman Emperor was the man who ruled over the Empire.\n At first, Rome was ruled by Generals but this caused problems. The Generals were always fighting over who would have the final say in running the Empire.\n\n Eventually the Generals were replaced by just one man - The Emperor. The first Emperor to come to power was Augustus in 27 B.C. He was a popular Emperor who brought peace after many years of fighting. Not all the Emperors were so good and wise, some were terrible! \n\n\nThe Emperor had a troop of special soldiers to protect him. They were called the Praetorian Guard. However, some of the bad Emperors were so unpopular that their Praetorian Guards killed them! \n\n 676 826 415 From bernier@wolf Sun Apr 25 22:58:27 2004\nReturn-Path: \nX-Original-To: bernier@localhost\nDelivered-To: bernier@localhost\nReceived: by wolf (Postfix, from userid 1002)\n\tid BDC34275CF; Sun, 25 Apr 2004 22:58:27 -0400 (EDT)\nTo: bernier@localhost\nSubject: firehouse dogs\nMessage-Id: <20040426025827.BDC34275CF@wolf>\nDate: Sun, 25 Apr 2004 22:58:27 -0400 (EDT)\nFrom: bernier@wolf (Robert Bernier)\n\n 409 827 415 April 25, 2004 -- They answer the fire bell, throw themselves into dangerous situations, and impress the neighborhood children -- all for a pat on the head and usually with a wag of the tail.\n\nFirehouse dogs -- a staple of Norman Rockwell's Americana -- are still on the job in many towns and cities. But perhaps nowhere is the tradition as strong as Chicago. Brothers Drew and Trevor Orsinger tell the story of some of the Windy City's most dogged public servants in their new book, The Firefighter's Best Friend.\n\n 516 \. -- -- Data for TOC entry 62 (OID 89325) -- Name: auto_notifications; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY auto_notifications (auto_notify_idnr, user_idnr, notify_address) FROM stdin; \. -- -- Data for TOC entry 63 (OID 89331) -- Name: auto_replies; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY auto_replies (auto_reply_idnr, user_idnr, reply_body) FROM stdin; \. -- -- Data for TOC entry 64 (OID 89338) -- Name: config; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY config (config_idnr, item, value) FROM stdin; \. -- -- Data for TOC entry 65 (OID 90531) -- Name: temp; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY "temp" (f1) FROM stdin; \n--5vNYLRcllDrimb99\nContent-Type: text/plain; charset=us-ascii\nContent-Disposition: inline\n\nThis email has an attached msword document. It is a copy of the first\narticle on datamining.\n\n--5vNYLRcllDrimb99\nContent-Type: application/msword\nContent-Disposition: attachment; filename="datamining.doc"\nContent-Transfer-Encoding: base64\n\n0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAWQAAAAAA\nAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD/////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n///////////////////////////////////9//////////7///8EAAAABQAAAAYAAAAHAAAA\n/v///wkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA\nAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAA\nIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAALwAAADAA\nAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAA9AAAA\nPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsA\nAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAA\n/v///1oAAAD+////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n/////////////////////////////////////////////////////////////////////1IA\nbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//\n/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAABwAAAAgA\nAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAA\nFgAAABcAAAAYAAAAGQAAABoAAAAbAAAA/v///x0AAAAeAAAAHwAAACAAAAAhAAAA/v//////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////8BAP7/\nAwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoA\nAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAaQBuAGcA\nIABpAG4AZgBvAHIAbQBhAAEAAAIAAAAAAAAAAAAAAAAAAAAAZQB4AGkAcwB0AGkAbgBnACAA\nZABhAHQAYQAgAGEAbgBkACAAYQByAGUAIAASABMACgABAFsADwACAAAAAAAAAFoAABDx/wIA\nWgAAAAcARABlAGYAYQB1AGwAdAAAAA0AAAAxJAANxgIAACokAQArAEIqAE9KAwBRSgMAQ0oY\nAG1ICQRzSAkEUEoEAG5I/wBeSgQAX0j/AHRI/wAAAAAAAAAAAAAAAAAAAAAAAAAAQgBBQPL/\noQBCAAAAGQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEA\ncgB0AAAAAAAAAAAAAAAAAC4AQhABAPIALgAAAAkAVABlAHgAdAAgAGIAbwBkAHkAAAAKAA8A\nE6QAABSkeAAAACQALxDxAAIBJAAAAAQATABpAHMAdAAAAAIAEAAIAE9KAwBRSgMARAD+HwEA\nEgFEAAAABwBDAGEAcAB0AGkAbwBuAAAADQARABOkeAAUpHgADCQBABYAT0oDAFFKAwBDShQA\nNggBYUoUAF0IASoA/h8BACIBKgAAAAUASQBuAGQAZQB4AAAABQASAAwkAQAIAE9KAwBRSgMA\nAAAAAGY3AAAEAACgAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAQAAMxyAAA6AAAAAAQAAJAQAAC8GAAATB8AAAQkAACoKAAA\n/C4AAGozAADwNwAA3j8AACRFAAB4TAAAOk8AALJQAACUVAAACFYAACxaAAAMXgAAvF8AAB5l\nAADScQAAzHIAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAA\nRgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAAAAAABmNwAAAAAAAAIQ\nAAAAAAAAAGY3AABQAAAEAAAAAAUAAABHFpABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1FpABAgAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwB5AG0AYgBvAGwAAAAzJpABAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQByAGkAYQBsAAAATwSQAQAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAaQB0AHMAdAByAGUAYQBtACAAVgBlAHIAYQAg\nAFMAYQBuAHMAAAA1BpABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVABh\nAGgAbwBtAGEAAABCAAQAAQiNGAAAxQIAAGgBAAAAAGms+0VprPtFAAAAAAEAAAAAAAAAAAAA\nAAAAAQABAAAABACDkAEAAAAAAAAAAAAAAAEAAQAAAAEAAAAAAAAAJwMAAAgAAAAABAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIwAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAIAAQAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAA/v8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAA\nIAEAAA0AAAABAAAAcAAAAAkAAAB4AAAACgAAAIQAAAALAAAAkAAAAA0AAACcAAAADAAAAKgA\nAAAIAAAAtAAAAAQAAADMAAAABgAAAOQAAAAHAAAA8AAAAAUAAAD8AAAAAwAAAAgBAAACAAAA\nFAEAAAIAAADp/QAAHgAAAAIAAAAyAAAAQAAAAICeRzAAAAAAQAAAAACgEYchAAAAQAAAAIAp\n2pq6LsQBQAAAAIAhK2u6LsQBHgAAAA8AAABSb2JlcnQgQmVybmllcgAAHgAAAA8AAABSb2Jl\ncnQgQmVybmllcgAAHgAAAAEAAAAAAAAAHgAAAAEAAAAAAAAAHgAAAAEAAAAAAAAAHgAAAAEA\nAAAAAAAAHgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA7KXCAE0gBwQAAAASvwAAAAAAADAAAAAAAAQAAMxyAAAOAENh\nb2xhbjcwAAAAAAAAAAAAAAAAAAAAAAAABwQWACSgAAAAAAAAAAAAAGY3AAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAA//8PADoAAAABAAAA//8PADsAAAAVAAAA//8PAAAAAAAAAAAA\nAAAAAAAAAABsAAAAAACWAQAAAAAAAJYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAJYBAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACqAQAANAAAAN4B\nAAAMAAAA6gEAAKwAAAAAAAAAAAAAALcCAAA8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYCAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8wMAACACAAAAAAAA\nAAAAAKICAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYC\nAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAIA2QAAAEQAYQB0AGEAIABNAGkAbgBpAG4AZwANAA0ADQBJACAAbwBuAGMA\nZQAgAGQAaQBkACAAYQAgAGMAbwBuAHQAcgBhAGMAdAAgAGEAZABtAGkAbgBpAHMAdAByAGEA\ndABpAG4AZwAgAHQAaABlACAAbgBlAHQAdwBvAHIAawAgAG8AZgAgAGEAIABzAG0AYQBsAGwA\nIABzAHQAYQByAHQAdQBwACAAYwBvAG0AcABhAG4AeQAuACAAVABoAGUAIABvAHcAbgBlAHIA\nJwBzACAAdABvAHQAYQBsACAAZQB4AGkAcwB0AGUAbgBjAGUAIAByAGUAdgBvAGwAdgBlAGQA\nIABhAHIAbwB1AG4AZAAgAHQAaABlACAAZQBtAGEAaQBsACAAZwBlAG4AZQByAGEAdABlAGQA\nIABmAHIAbwBtACAAaABpAHMAIAB2AGEAcgBpAG8AdQBzACAAYgB1AHMAaQBuAGUAcwBzACAA\ncgBlAGwAYQB0AGkAbwBuAHMAaABpAHAAcwAgAGEAbgBkACAAbgBlAHYAZQByACAAbQBhAGQA\nZQAgAGEAIABkAGUAYwBpAHMAaQBvAG4AIAB1AG4AbABlAHMAcwAgAHQAaABlACAAaQBzAHMA\ndQBlAHMAIAB3AGUAcgBlACAAZgBpAHIAcwB0ACAAZABlAHQAYQBpAGwAZQBkACAAaQBuACAA\nYQBuACAAZQBtAGEAaQBsAC4AIABNAHkAIABiAG8AcwBzACAAbwBuAGMAZQAgAGMAbwBuAGYA\naQBkAGUAZAAgAGkAbgAgAG0AZQAgAG8AZgAgAGgAaQBzACAAaABhAHQAcgBlAGQAIABvAGYA\nIABoAGkAcwAgAGUAbQBhAGkAbAAgAGMAbABpAGUAbgB0ACAAYgBlAGMAYQB1AHMAZQAgAGkA\ndAAgAGwAaQBtAGkAdABlAGQAIABoAGkAbQAgAGkAbgAgAHQAaABlACAAdwBhAHkAIABoAGUA\nIABjAG8AdQBsAGQAIABvAHIAZwBhAG4AaQB6AGUAIABoAGkAcwAgAGkAbgBmAG8AcgBtAGEA\ndABpAG8AbgAuAA0ADQANAEkAIAB3AGEAcwAgAHMAbwAgAGkAbQBwAHIAZQBzAHMAZQBkACAA\nYgB5ACAAaABpAHMAIABkAGUAcwBwAGUAcgBhAHQAaQBvAG4AIAB0AGgAYQB0ACAASQAgAGYA\nbwB1AG4AZAAgAG0AeQBzAGUAbABmACAAYwBvAG4AcwB0AGEAbgB0AGwAeQAgAHQAaABpAG4A\nawBpAG4AZwAgAGEAYgBvAHUAdAAgAGgAaQBzACAAZABpAGwAZQBtAG0AYQAuACAASQBuACAA\ndABpAG0AZQAgAHQAaABlACAAYQBuAHMAdwBlAHIAIABjAGEAbQBlACAAdABvACAAbQBlACwA\nIAB3AGgAYQB0ACAAdwBhAHMAIABuAGUAZQBkAGUAZAAgAHcAYQBzACAAYQAgAGQAYQB0AGEA\nIABtAGkAbgBlAC4ADQANAA0AUwBvACAAdwBoAGEAdAAgAGkAcwAgAGQAYQB0AGEAIABtAGkA\nbgBpAG4AZwAgAGEAbgB5AHcAYQB5AD8AIABEAGEAdABhACAAbQBpAG4AaQBuAGcAIABpAHMA\nIABhACAAYwBsAGEAcwBzACAAbwBmACAAZABhAHQAYQBiAGEAcwBlACAAYQBwAHAAbABpAGMA\nYQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAbABvAG8AawAgAGYAbwByACAAaABpAGQAZABlAG4A\nIABwAGEAdAB0AGUAcgBuAHMAIABpAG4AIABhACAAZwByAG8AdQBwACAAbwBmACAAZABhAHQA\nYQAuAA0ADQANAEkAbgAgAHcAcgBpAHQAaQBuAGcAIAB0AGgAaQBzACAAYQByAHQAaQBjAGwA\nZQAgAGkAdAAgAHEAdQBpAGMAawBsAHkAIABiAGUAYwBhAG0AZQAgAGEAcABwAGEAcgBlAG4A\ndAAgAHQAaABhAHQAIAB5AG8AdQAgACwAdABoAGUAIAByAGUAYQBkAGUAcgAsACAAbQBpAGcA\naAB0ACAAbgBlAGUAZAAgAHMAZQB2AGUAcgBhAGwAIABwAGkAZQBjAGUAcwAgAG8AZgAgAHUA\nbgByAGUAbABhAHQAZQBkACAAdABlAGMAaABuAGkAYwBhAGwAIABrAG4AbwB3AC0AaABvAHcA\nIAB0AG8AIABjAHIAZQBhAHQAZQAgAGEAIABkAGEAdABhACAAbQBpAG4AZQAgAHMAbwAgAEkA\nIABlAG4AZABlAGQAIAB1AHAAIABhAHMAawBpAG4AZwAgAG0AeQBzAGUAbABmACAAPwB3AGgA\nbwAgAGEAbQAgAEkAIAB3AHIAaQB0AGkAbgBnACAAdABoAGkAcwAgAGEAcgB0AGkAYwBsAGUA\nIABmAG8AcgA/AD8ALgAgAEQAbwAgAEkAIAB3AHIAaQB0AGUAIABmAG8AcgAgAHQAaABlACAA\nUABlAHIAbAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIAIABvAHIAIABhAG0AIABJACAAdwByAGkA\ndABpAG4AZwAgAHQAbwAgAHQAaABlACAARABCAEEAPwAgAFAAcgBvAGcAcgBhAG0AbQBpAG4A\nZwAgAGEAbgBkACAAbQBhAG4AYQBnAGkAbgBnACAAZABhAHQAYQAgAGQAbwBuACcAdAAgAHUA\ncwBlACAAdABoAGUAIABzAGEAbQBlACAAcwBlAHQAIABvAGYAIABzAGsAaQBsAGwAcwAgAGIA\ndQB0ACAAdABoAGUAeQAgAGEAcgBlACAAbgBlAHYAZQByAHQAaABlAGwAZQBzAHMAIABiAG8A\ndABoACAAcgBlAHEAdQBpAHIAZQBkAC4AIABTAG8AIAB3AGgAZQByAGUAIABkAG8AZQBzACAA\ndABoAGkAcwAgAGEAcgB0AGkAYwBsAGUAIABnAG8APwANAA0ADQBUAGgAaQBzACAAYQByAHQA\naQBjAGwAZQAgAGkAcwAgAGYAbwByACAAdABoAG8AcwBlACAAdwBoAG8AIABuAGUAZQBkACAA\nYQAgAGcAdQBpAGQAZQAgAHQAbwAgAGcAZQBuAGUAcgBhAHQAaQBuAGcAIABpAG4AZgBvAHIA\nbQBhAHQAaQBvAG4AIABmAHIAbwBtACAAZQB4AGkAcwB0AGkAbgBnACAAZABhAHQAYQAgAGEA\nbgBkACAAYQByAGUAIABsAG8AbwBrAGkAbgBnACAAZgBvAHIAIABpAGQAZQBhAHMAIABvAG4A\nIABoAG8AdwAgAHQAbwAgAGQAbwAgAGkAdAAuACAAVABoAG8AbQBhAHMAIABFAGQAaQBzAG8A\nbgAgAG8AbgBjAGUAIABzAGEAaQBkACAAdABoAGEAdAAgAGcAZQBuAGkAdQBzACAAdwBhAHMA\nIAAxACUAIABpAG4AcwBwAGkAcgBhAHQAaQBvAG4AIABhAG4AZAAgADkAOQAlACAAcABlAHIA\ncwBwAGkAcgBhAHQAaQBvAG4AOgAgAGgAZQByAGUAJwBzACAAeQBvAHUAcgAgADEAJQAuAA0A\nIAANACAADQANAA0AVABoAGUAIABzAGMAZQBuAGEAcgBpAG8AOgANAA0ADQBUAGgAZQAgAG8A\nYgBqAGUAYwB0AGkAdgBlACAAaQBzACAAdABvACAAZABhAHQAYQAgAG0AaQBuAGUAIAB0AGgA\nZQAgAGUAbQBhAGkAbAAgAHQAaABhAHQAIAByAGUAcwBpAGQAZQBzACAAaQBuACAAYQAgAG0A\nbwB6AGkAbABsAGEAIABtAGEAaQBsACAAYgBvAHgALgAgAFcAZQAgAGEAcgBlACAAZQBzAHAA\nZQBjAGkAYQBsAGwAeQAgAGkAbgB0AGUAcgBlAHMAdABlAGQAIABpAG4AIABtAHMAdwBvAHIA\nZAAgAGQAbwBjACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzAC4AIABUAGgAZQAgAG0AZQB0AGgA\nbwBkACAAaQBzACAAdABvACAAcABhAHIAcwBlACAAdABoAGUAIABlAG0AYQBpAGwAIABhAG4A\nZAAgAHUAcABsAG8AYQBkACAAaQB0ACAAaQBuAHQAbwAgAGEAIAByAGUAbABhAHQAaQBvAG4A\nYQBsACAAZABhAHQAYQBiAGEAcwBlACAAZQBuAGcAaQBuAGUAIAB3AGgAZQByAGUAIABpAHQA\nIABjAGEAbgAgAHQAaABlAG4AIABiAGUAIABhAG4AYQBsAHkAcwBlAGQALgANAA0ADQBUAGgA\nZQAgAHQAbwBvAGwAcwA6AA0ADQBUAGgAZQAgAE0AbwB6AGkAbABsAGEAIABtAGEAaQBsAGIA\nbwB4AGUAcwAgAGYAbwBsAGwAbwB3ACAAdABoAGUAIABtAGIAbwB4ACAAZgBvAHIAbQBhAHQA\nLgANAFAAZQByAGwAIABoAGEAcwAgAGEAIABuAHUAbQBiAGUAcgAgAG8AZgAgAGUAeABjAGUA\nbABsAGUAbgB0ACAAZQBtAGEAaQBsACAAcABhAHIAcwBpAG4AZwAgAG0AbwBkAHUAbABlAHMA\nIAB0AGgAYQB0ACAAYwBhAG4AIABiAGUAIABmAG8AdQBuAGQAIABpAG4AIABDAFAAQQBOAC4A\nDQBQAG8AcwB0AGcAcgBlAFMAUQBMAA0AVABoAGUAIABDAG8AbQBtAGEAbgBkACAAbABpAG4A\nZQAgAHUAdABpAGwAaQB0AGkAZQBzACAAZgBpAG4AZAAsACAAZgBpAGwAZQAsACAAYQBuAHQA\naQB3AG8AcgBkACAAYQBuAGQAIAB0AGgAZQAgAFAAbwBzAHQAZwByAGUAcwAnACAAYwBvAG4A\ncwBvAGwAZQAgAGIAYQBzAGUAZAAgAGMAbABpAGUAbgB0ACAAcABzAHEAbAAuAA0ADQBUAGgA\nZQAgAEQAZQB2AGUAbABvAHAAZQByACcAcwAgAFMAawBpAGwAbABzAGUAdAA6AA0AIAANAA0A\nUABlAHIAbAA6AA0ASABlACAAaABhAHMAIABpAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAHAA\ncgBvAGcAcgBhAG0AbQBpAG4AZwAgAGUAeABwAGUAcgBpAGUAbgBjAGUAIABpAG4AIABjAHIA\nZQBhAHQAaQBuAGcAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAcwAuAA0ASQBzACAAcgBlAHEA\ndQBpAHIAZQBkACAAdABvACAAZQB4AGUAYwB1AHQAZQAgAGMAbwBtAG0AYQBuAGQAIABsAGkA\nbgBlACAAdQB0AGkAbABpAHQAaQBlAHMAIABmAHIAbwBtACAAaQBuAHMAaQBkAGUAIABhACAA\ncABlAHIAbAAgAHMAYwByAGkAcAB0AC4ADQBNAHUAcwB0ACAAYgBlACAAYQBiAGwAZQAgAHQA\nbwAgAGkAbgBzAHQAYQBsAGwAIABhAG4AZAAgAHUAcwBlACAAcABlAHIAbAAgAG0AbwBkAHUA\nbABlAHMAIABmAHIAbwBtACAAQwBQAEEATgAuAA0AQwBhAG4AIABtAGEAawBlACAAYQAgAHAA\ncgBvAGcAcgBhAG0AbQBhAHQAaQBjACAAYwBvAG4AbgBlAGMAdABpAG8AbgAgAHQAbwAgAHQA\naABlACAAZABhAHQAYQBiAGEAcwBlACAAZQBuAGcAaQBuAGUAIABQAG8AcwB0AGcAcgBlAFMA\nUQBMAC4ADQBNAHUAcwB0ACAAYgBlACAAYQBiAGwAZQAgAHQAbwAgAGUAeABlAGMAdQB0AGUA\nIABzAHEAbAAgAHEAdQBlAHIAaQBlAHMAIABmAHIAbwBtACAAYQAgAHAAZQByAGwAIABzAGMA\ncgBpAHAAdAAgAHQAbwAgAGEAIABkAGEAdABhAGIAYQBzAGUAIABlAG4AZwBpAG4AZQAuAA0A\nUABvAHMAdABnAHIAZQBTAFEATAA6AA0ASwBuAG8AdwBzACAAaABvAHcAIAB0AG8AIABpAG4A\ncwB0AGEAbABsACAAdABoAGUAIABQAG8AcwB0AGcAcgBlAFMAUQBMACAAUgBlAGwAYQB0AGkA\nbwBuAGEAbAAgAEQAYQB0AGEAYgBhAHMAZQAgAE0AYQBuAGEAZwBlAG0AZQBuAHQAIABTAHkA\ncwB0AGUAbQAgAG8AbgAgAGEAIABMAGkAbgB1AHgAIABtAGEAYwBoAGkAbgBlACAAZQBpAHQA\naABlAHIAIABiAHkAIAB1AHMAaQBuAGcAIABwAHIAZQBjAG8AbQBwAGkAbABlAGQAIABiAGkA\nbgBhAHIAaQBlAHMAIABzAHUAYwBoACAAYQBzACAAcgBwAG0AJwBzACwAIABkAGUAYgBpAGEA\nbgAgAHAAYQBjAGsAYQBnAGUAcwAgAGEAbgBkACAAdABhAHIAIABiAGEAbABsAHMAIABvAHIA\nIABjAG8AbQBwAGkAbABpAG4AZwAgAGkAdAAgAGYAcgBvAG0AIABzAG8AdQByAGMAZQAgAGMA\nbwBkAGUALgANAFYAZQByAHMAZQBkACAAaQBuACAAUwBRAEwAIAA5ADIALAAgADkAOQAgAHAA\ncgBvAHQAbwBjAG8AbABzAC4ADQBBAGIAbABlACAAdABvACAAYwByAGUAYQB0AGUAIAB0AGEA\nYgBsAGUAcwAsACAAdgBpAGUAdwBzACwAIABjAG8AbgBzAHQAcgBhAGkAbgB0AHMAIABhAG4A\nZAAgAHUAcwBlAHIALQBkAGUAZgBpAG4AZQBkACAAZgB1AG4AYwB0AGkAbwBuAHMALgANAEMA\nbwBtAG0AYQBuAGQAIABMAGkAbgBlACAAVQB0AGkAbABpAHQAaQBlAHMAOgANAEsAbgBvAHcA\ncwAgAGgAbwB3ACAAdABvACAAcABpAHAAZQAgAHMAdABhAG4AZABhAHIAZAAgAGkAbgBwAHUA\ndAAgAGEAbgBkACAAbwB1AHQAcAB1AHQAIABmAHIAbwBtACAAbwBuAGUAIABwAHIAbwBjAGUA\ncwBzACAAdABvACAAdABoAGUAIABuAGUAeAB0AC4ADQANAFQAaABlACAAQQBzAHMAdQBtAHAA\ndABpAG8AbgBzADoADQANAEEAbgAgAGkAbgBzAHQAYQBsAGwAZQBkACAAdgBlAHIAcwBpAG8A\nbgAgAG8AZgAgAFAAZQByAGwAIAA1AC4AOAAuAHgAIAB3AGkAdABoACAAQwBQAEEATgANAEEA\nIABzAHQAYQBuAGQAYQByAGQAIABpAG4AcwB0AGEAbABsAGEAdABpAG8AbgAgAG8AZgAgAFAA\nbwBzAHQAZwByAGUAcwAuAA0AVABoAGUAIABQAG8AcwB0AGcAcgBlAFMAUQBMACAAcwBlAHIA\ndgBlAHIAIAB3AGkAbABsACAAaABhAHYAZQAgAG0AaQBuAGkAbQBhAGwAIABzAGUAYwB1AHIA\naQB0AHkAIABvAHAAdABpAG8AbgBzACAAYwBvAG4AZgBpAGcAdQByAGUAZAAuAA0AVABoAGUA\nIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAIAB3AGkAbABsACAAbQBhAGsAZQAgAGkAdABzACAA\nYwBvAG4AbgBlAGMAdABpAG8AbgAgAHQAbwAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAA\ndgBpAGEAIABhACAAcwBvAGMAawBlAHQAIABjAG8AbgBuAGUAYwB0AGkAbwBuACAAdABoAGUA\ncgBlAGYAbwByAGUAIAB0AGgAZQAgAGwAaQBuAGUAIAA/AHQAYwBwAGkAcABfAHMAbwBjAGsA\nZQB0ACAAPQAgAHQAcgB1AGUAPwAgAG0AdQBzAHQAIABiAGUAIAB1AG4AYwBvAG0AbQBlAG4A\ndABlAGQAIABpAG4AIAB0AGgAZQAgAHAAbwBzAHQAZwByAGUAcQBsAC4AYwBvAG4AZgAgAGYA\naQBsAGUALgAgAEYAdQByAHQAaABlAHIAbQBvAHIAZQAsACAAdABoAGUAIABzAGMAcgBpAHAA\ndAAgAGEAcwBzAHUAbQBlAHMAIAB0AGgAYQB0ACAAdABoAGUAIABjAG8AbgBuAGUAYwB0AGkA\nbwBuACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHAAYQBzAHMAdwBvAHIAZAA6AA0AIAANACAA\nDQANACMAIABUAFkAUABFACAAIAAgACAARABBAFQAQQBCAEEAUwBFACAAIAAgACAAVQBTAEUA\nUgAgACAAIAAgAEkAUAAtAEEARABEAFIARQBTAFMAIAAgACAAIABJAFAALQBNAEEAUwBLACAA\nIAAgACAAIAAgACAAIABNAEUAVABIAE8ARAANAA0AIAANAA0AIAAgACAAIABsAG8AYwBhAGwA\nIAAgACAAIABhAGwAbAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nYQBsAGwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA\nIAAgACAAIAAgACAAIAAgACAAdAByAHUAcwB0AA0AIAAgACAAIAAgAGgAbwBzAHQAIAAgACAA\nIABhAGwAbAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAYQBsAGwA\nIAAgACAAIAAgACAAIAAgACAAIAAgACAAMQAyADcALgAwAC4AMAAuADEAIAAgACAAIAAgADIA\nNQA1AC4AMgA1ADUALgAyADUANQAuADIANQA1ACAAcABhAHMAcwB3AG8AcgBkAA0ADQAgAA0A\nIAANACAADQBUAGgAZQAgAFAAbwBzAHQAZwByAGUAUwBRAEwAIABhAGMAYwBvAHUAbgB0ACAA\ndQBzAGUAcgAgAGkAcwAgAHQAaABlACAAcwB1AHAAZQByAHUAcwBlAHIALAAgAHAAbwBzAHQA\nZwByAGUAcwAuAA0AVABoAGUAIABtAGIAbwB4ACAAaQBzACAAYQBzAHMAdQBtAGUAZAAgAHQA\nbwAgAGIAZQAgAGMAYQBsAGwAZQBkACAAIgBTAGUAbgB0ACIAIABhAG4AZAAgAGkAcwAgAGkA\nbgAgAHQAaABlACAAcwBhAG0AZQAgAGQAaQByAGUAYwB0AG8AcgB5ACAAYQBzACAAdABoAGUA\nIABwAGEAcgBzAGUAcgAgAHMAYwByAGkAcAB0AC4ADQAgAA0ADQANAFAAYQByAHQAIAAxACwA\nIABTAGUAYQByAGMAaABpAG4AZwAgAGYAbwByACAAdABoAGUAIABlAG0AYQBpAGwAIABtAGIA\nbwB4AGUAcwANAA0ADQBUAGgAZQAgAG0AbwB6AGkAbABsAGEAIABtAGEAaQBsACAAYwBsAGkA\nZQBuAHQAIABtAGEAaQBsAGIAbwB4AGUAcwAgAGEAcgBlACAAZgBvAHUAbgBkACAAdQBuAGQA\nZQByACAAdABoAGUAIABoAG8AbQBlACAAYQBjAGMAbwB1AG4AdAAnAHMAIABkAGkAcgBlAGMA\ndABvAHIAeQAgAGkAZQA6ACAAfgAvAC4AbQBvAHoAaQBsAGwAYQAgAFQAaABlACAAcwBjAHIA\nZQBlAG4AIABzAGgAbwB0ACAAYgBlAGwAbwB3ACAAcwBoAG8AdwBzACAAdABoAGUAIABkAGkA\nZgBmAGUAcgBlAG4AdAAgAG0AYQBpAGwAYgBvAHgAZQBzACAAbwBmACAAYQBuACAAZQB4AGkA\ncwB0AGkAbgBnACAAcAByAG8AZgBpAGwAZQAuACAAVABoAGUAIABtAGIAbwB4AGUAcwAgAGEA\ncgBlACAAdABoAG8AcwBlACAAZgBpAGwAZQBzACAAdwBpAHQAaABvAHUAdAAgAGEAbgB5ACAA\nZQB4AHQAZQBuAHMAaQBvAG4AcwAuACAAQQBuAG8AdABoAGUAcgAgAGgAaQBuAHQAIABpAHMA\nIAB0AG8AIABsAG8AbwBrACAAYQB0ACAAdABoAGUAIABmAGkAbABlACAAcwBpAHoAZQAsACAA\ndABoAGUAIABtAGEAaQBsAGIAbwB4AGUAcwAgAGEAcgBlACAAbgBvAHIAbQBhAGwAbAB5ACAA\ndABoAGUAIABsAGEAcgBnAGUAcwB0ACAAZgBpAGwAZQBzACAAcAByAGUAcwBlAG4AdAAuAA0A\nIAANAA0ADQANACAADQAgAA0ADQANAFQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8A\nbQBtAGEAbgBkACAAZwBpAHYAZQBzACAAYQAgAGwAaQBzAHQAaQBuAGcAIABvAGYAIABhAGwA\nbAAgAHQAaABlACAAbQBhAGkAbABiAG8AeABlAHMAIABpAG4AIABtAHkAIABtAG8AegBpAGwA\nbABhACAAcAByAG8AZgBpAGwAZQAgAGEAYwBjAG8AdQBuAHQAOgANAA0ADQBmAGkAbgBkACAA\nfgAvAC4AbQBvAHoAaQBsAGwAYQAvAGQAZQBmAGEAdQBsAHQALwByAGYAdgAyAHUAZABuADcA\nLgBzAGwAdAAvAE0AYQBpAGwALwAgAC0AdAB5AHAAZQAgAGYAIAAtAG4AbwB0ACAALQBpAG4A\nYQBtAGUAIAAiACoALgAqACIAIAAtAG4AbwB0ACAALQBpAG4AYQBtAGUAIAAiAC4AKgAiACAA\nLQBwAHIAaQBuAHQADQANAA0ADQAgAA0ADQANAFAAYQByAHQAIAAyACwAIABQAHIAZQBwAGEA\ncgBpAG4AZwAgAHQAaABlACAAUABvAHMAdABnAHIAZQBTAFEATAAgAEQAYQB0AGEAYgBhAHMA\nZQANAA0ADQBFAG0AYQBpAGwAIABBAHMAcwB1AG0AcAB0AGkAbwBuAHMADQANAFQAaABlACAA\nZQBtAGEAaQBsACAAaABhAHMAIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAcABhAHIA\ndABzACAAbwBmACAAaQBuAHQAZQByAGUAcwB0ADsAIABGAHIAbwBtACwAIABUAG8ALAAgAEMA\nQwAsACAAYQBuAGQAIABBAHQAdABhAGMAaABtAGUAbgB0AHMALgANAFQAaABlACAAZQBtAGEA\naQBsACAAYwBvAG0AZQBzACAAZgByAG8AbQAgAG8AbgBlACAAcwBvAHUAcgBjAGUALgANAEEA\nbgAgAGUAbQBhAGkAbAAgAGMAYQBuACAAYgBlACAAYQBkAGQAcgBlAHMAcwBlAGQAIAB0AG8A\nIABtAG8AcgBlACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AZQAgAHAAZQByAHMAbwBuAC4A\nDQBBAG4AIABlAG0AYQBpAGwAIABjAGEAbgAgAGgAYQB2AGUAIABtAG8AcgBlACAAdABoAGEA\nbgAgAG8AbgBlACAAQwBDAC4ADQBBAG4AIABlAG0AYQBpAGwAIABjAGEAbgAgAGgAYQB2AGUA\nIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBlACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAuAA0A\nQQB0AHQAYQBjAGgAbQBlAG4AdABzACAAbwBmACAAaQBuAHQAZQByAGUAcwB0ACAAYQByAGUA\nIABvAG4AbAB5ACAAbQBzAHcAbwByAGQAIABkAG8AYwB1AG0AZQBuAHQAcwAuAA0ADQBUAGgA\nZQAgAEQAYQB0AGEAYgBhAHMAZQANAA0ADQBDAGEAcgByAHkAIABvAHUAdAAgAHQAaABlACAA\nZgBvAGwAbABvAHcAaQBuAGcAIABpAG4AIABhACAAYwBvAG4AcwBvAGwAZQA6AA0AIAANAA0A\nQwByAGUAYQB0AGUAIABhACAAZABhAHQAYQBiAGEAcwBlACAAYwBhAGwAbABlAGQAIABlAG0A\nYQBpAGwAOwANACAADQAgAHAAcwBxAGwAIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAA/AGMA\nbwBtAG0AYQBuAGQAIAA/AGMAcgBlAGEAdABlACAAZABhAHQAYQBiAGEAcwBlACAAZQBtAGEA\naQBsAD8AIAB0AGUAbQBwAGwAYQB0AGUAMQANACAADQAgAA0AQQBsAHQAZQByACAAdABoAGUA\nIAB1AHMAZQByAG4AYQBtAGUAIABwAG8AcwB0AGcAcgBlAHMAIABhAG4AZAAgAGcAaQB2AGUA\nIABpAHQAIAB0AGgAZQAgAHAAYQBzAHMAdwBvAHIAZAAgAG8AZgAgADEAMgAzACAAKAB1AHMA\nZQByAG4AYQBtAGUAIABwAG8AcwB0AGcAcgBlAHMAIABiAHkAIABkAGUAZgBhAHUAbAB0ACAA\naABhAHMAIABuAG8AIABhAHMAcwBpAGcAbgBlAGQAIABwAGEAcwBzAHcAbwByAGQAKQA7AA0A\nIAANACAAcABzAHEAbAAgAC0AVQAgAHAAbwBzAHQAZwByAGUAcwAgAC0ALQBjAG8AbQBtAGEA\nbgBkACAAIgBhAGwAdABlAHIAIAB1AHMAZQByACAAcABvAHMAdABnAHIAZQBzACAAdwBpAHQA\naAAgAHAAYQBzAHMAdwBvAHIAZAAgACcAMQAyADMAJwAgACIAIABlAG0AYQBpAGwADQAgAA0A\nDQANAFQAaABlACAAVABhAGIAbABlAHMADQANAA0AVABoAGUAIABtAG8AcwB0ACAAaQBtAHAA\nbwByAHQAYQBuAHQAIABjAG8AbAB1AG0AbgAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlAHMA\nIABpAHMAIAB0AGgAZQAgAG0AZQBzAHMAYQBnAGUAaQBkACAAdwBoAGkAYwBoACAAaQBzACAA\nYQAgAHUAbgBpAHEAdQBlACAAYQBsAHAAaABhAG4AdQBtAGUAcgBpAGMAIABjAG8AZABlACAA\ndABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAGUAbQBhAGkAbAAgAG0A\nZQBzAHMAYQBnAGUALgAgAFQAaABlACAAdABhAGIAbABlAHMAIABoAGEAdgBlACAAYgBlAGUA\nbgAgAGQAZQBmAGkAbgBlAGQAIABzAHUAYwBoACAAdABoAGEAdAAgAG4AbwAgAGQAYQB0AGEA\nIABwAG8AcAB1AGwAYQB0AGkAbwBuACAAYwBhAG4AIABvAGMAYwB1AHIAIAB1AG4AbABlAHMA\ncwAgAHQAaABlACAAbQBlAHMAcwBhAGcAZQBpAGQAIABhAGwAcgBlAGEAZAB5ACAAZQB4AGkA\ncwB0AHMAIABpAG4AIAB0AGgAZQAgAHQAYQBiAGwAZQAgAG0AYQBpAGwAaQBkAC4ADQANAA0A\nVABoAGUAIABtAGUAcwBzAGEAZwBlACAAYgBvAGQAeQAgAGEAbgBkACAAYQB0AHQAYQBjAGgA\nbQBlAG4AdABzACAAYQByAGUAIAB0AG8AIABiAGUAIABzAHQAbwByAGUAZAAgAGEAcwAgAGwA\nYQByAGcAZQAgAG8AYgBqAGUAYwB0AHMAIABNAGEAbgB5ACAAbwBmACAAdABoAGUAIAB0AGEA\nYgBsAGUAcwAgAGgAYQB2AGUAIABhACAAYwBvAGwAdQBtAG4AIABvAGYAIAB0AHkAcABlACAA\nbwBpAGQAIAB3AGgAaQBjAGgAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYQBjAHQA\ndQBhAGwAIABkAGEAdABhACAAdABoAGEAdAAgAGkAcwAgAGwAbwBjAGEAdABlAGQAIABpAG4A\nIAB0AGgAZQAgAHMAeQBzAHQAZQBtACAAYwBhAHQAYQBsAG8AZwAgAHAAZwBfAGwAYQByAGcA\nZQBvAGIAagBlAGMAdAAuAA0ADQANAEkAbgBkAGUAeABlAHMAIABhAHIAZQAgAGMAcgBlAGEA\ndABlAGQAIABiAHkAIABkAGUAZgBhAHUAbAB0ACAAaQBuACAAUABvAHMAdABnAHIAZQBzACAA\nZgBvAHIAIABlAGEAYwBoACAAcAByAGkAbQBhAHIAeQAgAGsAZQB5ACAAdABoAGEAdAAgAGkA\ncwAgAGQAZQBmAGkAbgBlAGQAIABpAG4AIABhACAAdABhAGIAbABlAC4ADQANAA0AVABoAGkA\ncwAgAHMAYwByAGkAcAB0ACAAdwBpAGwAbAAgAGMAbABlAGEAbgAgAHQAaABlACAAZABhAHQA\nYQBiAGEAcwBlACAAZQBtAGEAaQBsACAAYQBuAGQAIABjAHIAZQBhAHQAZQAgAHQAaABlACAA\ndABhAGIAbABlAHMALgAgAEkAdAAgAGMAYQBuACAAYgBlACAAaQBuAHYAbwBrAGUAZAAgAGIA\neQAgAGUAeABlAGMAdQB0AGkAbgBnACAAaQB0ACAAZgByAG8AbQAgAHQAaABlACAAYwBvAG4A\ncwBvAGwAZQA6AA0ADQANAHAAcwBxAGwAIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAAtAGYA\nIABjAHIAZQBhAHQAZQBUAGEAYgBsAGUAcwAuAHMAcQBsACAAZQBtAGEAaQBsAA0ADQANAA0A\nIAANAA0ADQBQAGEAcgB0ACAAMwAsACAARABlAHYAZQBsAG8AcABpAG4AZwAgAHQAaABlACAA\nZQBtAGEAaQBsACAAcABhAHIAcwBlAHIADQANAA0AVABoAGUAIABNAG8AZAB1AGwAZQBzAA0A\nDQANAFQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABtAG8AZAB1AGwAZQBzACAAYQByAGUA\nIAB0AG8AIABiAGUAIABpAG4AcwB0AGEAbABsAGUAZAAgAHUAcwBpAG4AZwAgAEMAUABBAE4A\nOgANACAADQANAE0AYQBpAGwAOgA6AE0AYgBvAHgAUABhAHIAcwBlAHIAIABhACAAcwBpAG0A\ncABsAGUAIABpAG4AdABlAHIAZgBhAGMAZQAgAHQAaABhAHQAIABwAHIAbwB2AGkAZABlAHMA\nIAByAGUAYQBkAC0AbwBuAGwAeQAgAGEAYwBjAGUAcwBzACAAdABvACAAVQBOAEkAWAAtAG0A\nYQBpAGwAYgBvAHgAZQBzAA0ARABCAEkAIAAoAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAA\naQBuAHQAZQByAGYAYQBjAGUAKQAgAGEAbABsAG8AdwBzACAAYQAgAHAAZQByAGwAIABzAGMA\ncgBpAHAAdAAgAGEAYwBjAGUAcwBzACAAdABvACAAdABoAGUAIABQAG8AcwB0AGcAcgBlAHMA\nIABkAGEAdABhAGIAYQBzAGUADQANAE4AbwB0AGUAOgAgAGEAbABsACAAbQBvAGQAdQBsAGUA\ncwAgAHQAaABhAHQAIABEAEIASQAgAGEAbgBkACAATQBhAGkAbAA6ADoATQBiAG8AeABQAGEA\ncgBzAGUAcgAgAGQAZQBwAGUAbgBkAHMAIAB1AHAAbwBuACAAcwBoAG8AdQBsAGQAIABiAGUA\nIABhAHUAdABvAG0AYQB0AGkAYwBhAGwAbAB5ACAAaQBuAHMAdABhAGwAbABlAGQAIAB0AG8A\nbwAuAA0ADQANAFQAaABlACAAUABlAHIAbAAgAFMAYwByAGkAcAB0AA0ADQANAFQAaABlACAA\ncABhAHIAcwBlAHIAIABzAGMAcgBpAHAAdAAgAGYAaQByAHMAdAAgAGQAZQBmAGkAbgBlAHMA\nIAB0AGgAZQAgAGcAbABvAGIAYQBsACAAdgBhAHIAaQBhAGIAbABlAHMAIABhAG4AZAAgAHQA\naABlAG4AIABlAHMAdABhAGIAbABpAHMAaABlAHMAIABhACAAZABhAHQAYQBiAGEAcwBlACAA\nYwBvAG4AbgBlAGMAdABpAG8AbgAgAHcAaQB0AGgAIAB0AGgAZQAgAFAAbwBzAHQAZwByAGUA\nUwBRAEwAIABzAGUAcgB2AGUAcgA6AA0ADQANAG0AeQAgACQAZABiAGgAIAA9ACAARABCAEkA\nLQA+AGMAbwBuAG4AZQBjAHQAKAAkAGQAcwBuACwAJAB1AHMAZQByACwAJABwAGEAcwBzACkA\nOwANACAAdQBuAGwAZQBzAHMAIAAoAGQAZQBmAGkAbgBlAGQAIAAkAGQAYgBoACkAIAB7AGQA\naQBlACAAJABEAEIASQA6ADoAZQByAHIAcwB0AHIAOwB9ACAAJABkAGIAaAAtAD4AewBQAHIA\naQBuAHQARQByAHIAbwByAH0AIAA9ACAAMAA7AA0ADQANAFQAaABlACAAcwBjAHIAaQBwAHQA\nIAB0AGgAZQBuACAAcgBlAGEAZABzACAAdABoAGUAIABtAGEAaQBsAGIAbwB4ACAAYQBuAGQA\nIABiAHIAZQBhAGsAcwAgAGQAbwB3AG4AIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0ACAA\ncABhAHIAdABzACAAbwBmACAAZQBhAGMAaAAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABtAGUA\ncwBzAGEAZwBlADoADQANAA0AbQB5ACAAJABtAGIAIAA9ACAATQBhAGkAbAA6ADoATQBiAG8A\neABQAGEAcgBzAGUAcgAtAD4AbgBlAHcAKABcAEAAbQB5AGEAcgByAGEAeQAsAA0AIABkAGUA\nYwBvAGQAZQAgAD0APgAgACcAQQBMAEwAJwAsAA0AIABwAGEAcgBzAGUAcgBvAHAAdABzACAA\nPQA+ACAAJABwAGEAcgBzAGUAcgBvAHAAdABzACkAOwANAA0ADQBUAGgAZQAgAG0AYQBpAGwA\nYgBvAHgAIABtAGUAcwBzAGEAZwBlAHMAIABhAHIAZQAgAHAAcgBvAGMAZQBzAHMAZQBkACAA\naQBuAHMAaQBkAGUAIAB0AGgAZQAgAHcAaABpAGwAZQAgAGwAbwBvAHAAIAB3AGgAZQByAGUA\nIAB0AGgAZQAgAHAAYQByAHQAcwAgAG8AZgAgAHQAaABlACAAbQBlAHMAcwBhAGcAZQAgAG8A\nZgAgAGkAbgB0AGUAcgBlAHMAdAAgAGEAcgBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAA6AA0A\nDQANAG0AeQAgACQAaQBkACAAPQAgACQAbQBzAGcALQA+AGkAZAA7AA0AIABtAHkAIAAkAGYA\ncgBvAG0AIAA9ACAAJABtAHMAZwAtAD4AZgByAG8AbQAtAD4AewBlAG0AYQBpAGwAfQA7AA0A\nIABtAHkAIAAkAHMAdQBiAGoAZQBjAHQAIAA9ACAAJABtAHMAZwAtAD4AaABlAGEAZABlAHIA\nLQA+AHsAcwB1AGIAagBlAGMAdAB9ADsADQANAA0AVABoAGUAIABNAGIAbwB4AFAAYQByAHMA\nZQByACAAbQBvAGQAdQBsAGUAIABpAGQAZQBuAHQAaQBmAHkAaQBlAHMAIAB0AGgAZQAgAG0A\nYQBpAG4AIABiAG8AZAB5ACAAbwBmACAAdABoAGUAIABtAGUAcwBzAGEAZwBlADoADQANAA0A\nbQB5ACAAJABiAG8AZAB5ACAAPQAgACQAbQBzAGcALQA+AGIAbwBkAHkAKAAkAG0AcwBnAC0A\nPgBmAGkAbgBkAF8AYgBvAGQAeQApADsADQANAA0AVABoAGUAIABlAG0AYQBpAGwAIABtAGEA\naQBuACAAYgBvAGQAeQAgAGEAbgBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQByAGUA\nIAA/AHIAZQBmAGUAcgBlAG4AYwBlAGQAPwAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlAHMA\nLAAgAG0AYQBpAG4AIABhAG4AZAAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAB3AGkAdABoACAA\nYQBuACAAPwBvAGkAZAA/AC4AIABUAGgAaQBzACAAaQBzACAAYgBlAGMAYQB1AHMAZQAgAGQA\nYQB0AGEAIABjAGEAbgBuAG8AdAAgAGIAZQAgAGkAbgBzAGUAcgB0AGUAZAAgAGkAbgB0AG8A\nIABhACAAcgBvAHcAIAB0AGgAYQB0ACAAZQB4AGMAZQBlAGQAcwAgAHQAaABlACAAZABlAGYA\nYQB1AGwAdAAgAGQAYQB0AGEAIABwAGEAZwBlACAAcwBpAHoAZQAgAG8AZgAgADgAMQA5ADIA\nIABiAHkAdABlAHMALgAgAFQAbwAgAGcAZQB0ACAAYQByAG8AdQBuAGQAIAB0AGgAaQBzACAA\ndABoAGUAeQAgAGEAcgBlACAAaQBuAHMAdABlAGEAZAAgAGkAbgBzAGUAcgB0AGUAZAAgAGkA\nbgB0AG8AIAB0AGgAZQAgAGQAYQB0AGEAYgBhAHMAZQAgAGEAcwAgAD8AbABhAHIAZwBlACAA\nbwBiAGoAZQBjAHQAcwA/AC4AIABVAHAAbABvAGEAZABpAG4AZwAgAHQAaABlACAAbABhAHIA\nZwBlACAAbwBiAGoAZQBjAHQAIABpAHMAIABhAGMAaABpAGUAdgBlAGQAIABiAHkAIAB1AHMA\naQBuAGcAIABwAHMAcQBsADoADQANAA0AbQB5ACAAJABtAHkAbwBpAGQAPQBgAHAAcwBxAGwA\nIAAtAFUAIABwAG8AcwB0AGcAcgBlAHMAIAAtAC0AYwBvAG0AbQBhAG4AZAAgACIAXABcAGwA\nbwBfAGkAbQBwAG8AcgB0ACAAXAAnACQAYgBvAGQAeQBfAGYAaQBsAGUAXAAnACAAXAAnACQA\nbQB5AG0AYQBpAGwAYgBvAHgAXAAnACAAIgAgACQAZABiAGAAOwANACAAbQB5ACAAQABvAGkA\nZABhAHIAcgBhAHkAIAA9ACAAcwBwAGwAaQB0ACgALwAgAC8ALAAkAG0AeQBvAGkAZAApADsA\nDQANAA0AVABoAGkAcwAgAG0AZQB0AGgAbwBkACAAcgBlAHEAdQBpAHIAZQBzACAAbABlAHMA\ncwAgAGMAbwBkAGkAbgBnACAAYQBuAGQAIABpAHMAIAB0AGgAdQBzACAAcwBpAG0AcABsAGUA\ncgAgAHQAbwAgAHUAbgBkAGUAcgBzAHQAYQBuAGQAIABpAG4AcwB0AGUAYQBkACAAbwBmACAA\ndQBzAGkAbgBnACAAdABoAGUALAAgAGEAbABiAGUAaQB0ACAAbQBvAHIAZQAgAGUAZgBmAGkA\nYwBpAGUAbgB0ACwAIAB1AHMAZQAgAG8AZgAgAHQAaABlACAAbABpAGIAcABxACcAcwAgAGwA\nYQByAGcAZQAgAG8AYgBqAGUAYwB0ACAAYwBhAGwAbAAgAHcAaQB0AGgAaQBuACAAdABoAGUA\nIABwAGUAcgBsACAAcwBjAHIAaQBwAHQALgAgAA0ADQANAFcAZQAgAGEAcgBlACAAbgBvAHcA\nIABhAGIAbABlACAAdABvACAAcABvAHAAdQBsAGEAdABlACAAdABoAGUAIABlAG0AYQBpAGwA\nIABtAGUAcwBzAGEAZwBlACAAaQBuAHQAbwAgAHQAaABlACAAdABhAGIAbABlACAAbQBhAGkA\nbgA6AA0ADQANACQAcwBxAGwAIAA9ACAAIgBJAE4AUwBFAFIAVAAgAEkATgBUAE8AIABtAGEA\naQBuACAAVgBBAEwAVQBFAFMAKABcACcAJABpAGQAXAAnACwAXAAnACQAZgByAG8AbQBcACcA\nLABcACcAJABzAHUAYgBqAGUAYwB0AFwAJwAsAEAAbwBpAGQAYQByAHIAYQB5AFsAMQBdACkA\nIgA7AA0AIAAkAHMAdABoACAAPQAgACQAZABiAGgALQA+AHAAcgBlAHAAYQByAGUAKAAkAHMA\ncQBsACkAIABvAHIAIABkAGkAZQAgACQARABCAEkAOgA6AGUAcgByAHMAdAByADsADQAgACQA\ncwB0AGgALQA+AGUAeABlAGMAdQB0AGUAKAApACAAbwByACAAZABpAGUAIAAkAEQAQgBJADoA\nOgBlAHIAcgBzAHQAcgA7AA0ADQANAFQAaABpAHMAIABzAG4AaQBwAHAAZQB0ACAAbwBmACAA\nYwBvAGQAZQAgAGkAcwAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIAB0AGgA\nZQAgAGwAaQBzAHQAIABvAGYAIABlAG0AYQBpAGwAIAByAGUAYwBpAHAAaQBlAG4AdABzADoA\nDQANAA0AIwBQAE8AUABVAEwAQQBUAEUAIABUAEEAQgBMAEUAIAAnAG0AYQBpAGwAdABvACcA\nDQAgAGYAbwByACAAbQB5ACAAJABtAHMAZwBfAFQATwAgACgAJABtAHMAZwAtAD4AdABvACkA\nIAB7AA0AIAAkAHMAcQBsACAAPQAgACIASQBOAFMARQBSAFQAIABJAE4AVABPACAAbQBhAGkA\nbAB0AG8AIABWAEEATABVAEUAUwAoAFwAJwAkAGkAZABcACcALABcACcAJABtAHMAZwBfAFQA\nTwAtAD4AewBlAG0AYQBpAGwAfQBcACcAKQAiADsADQAgACQAcwB0AGgAIAA9ACAAJABkAGIA\naAAtAD4AcAByAGUAcABhAHIAZQAoACQAcwBxAGwAKQAgAG8AcgAgAGQAaQBlACAAJABEAEIA\nSQA6ADoAZQByAHIAcwB0AHIAOwANACAAJABzAHQAaAAtAD4AZQB4AGUAYwB1AHQAZQAoACkA\nIABvAHIAIABkAGkAZQAgACQARABCAEkAOgA6AGUAcgByAHMAdAByADsADQAgAH0ADQANAA0A\nDQAgAFQAaABlACAAbQBvAHMAdAAgAGkAbgB0AGUAcgBlAHMAdABpAG4AZwAgAHAAYQByAHQA\nIABvAGYAIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdAAgAGkAcwAgAHQAaABlACAA\naQBkAGUAbgB0AGkAZgB5AGkAbgBnACAAbwBmACAAbQBzAHcAbwByAGQAIABhAHQAdABhAGMA\naABtAGUAbgB0AHMAOgANAA0ADQAjACAARABFAFQARQBSAE0ASQBOAEUAIABBAFQAVABBAEMA\nSABNAEUATgBUACAATQBJAE0ARQAtAFQAWQBQAEUAUwANACAAbQB5ACAAJABkAGUAYwBvAGQA\nZQBkAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAA9ACAAYABlAGMAaABvACAAIgAkAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIgB8AC4ALwBkAGUAYwBvAGQAZQAuAHAAbAB8AHQAZQBlACAAJABhAHQA\ndABhAGMAaABtAGUAbgB0AF8AZgBpAGwAZQB8AGYAaQBsAGUAIAAtAGkAIAAtAGAAOwANACAA\nbQB5ACAAQAB0AGUAcwB0ADAAIAA9ACAAcwBwAGwAaQB0ACgALwAgAC8ALAAkAGQAZQBjAG8A\nZABlAGQAYQB0AHQAYQBjAGgAbQBlAG4AdAApADsADQAgAG0AeQAgACQAbQBpAG0AZQBfAHQA\neQBwAGUAIAA9ACAAQAB0AGUAcwB0ADAAWwAxAF0AOwANACAAYwBoAG8AbQBwACAAJABtAGkA\nbQBlAF8AdAB5AHAAZQA7AA0AIAANAA0ADQAjAFYAQQBMAEkARABBAFQASQBOAEcAIABNAFMA\nVwBPAFIARAAgAEQATwBDAFMADQAgAGkAZgAgACgAJABtAGkAbQBlAF8AdAB5AHAAZQAgAGUA\ncQAgACIAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC8AbQBzAHcAbwByAGQAIgApACAAewANACAA\nIwBDAE8ATgBWAEUAUgBUACAASQBOAFQATwAgAFIARQBBAEQAQQBCAEwARQAgAFQARQBYAFQA\nDQAgAGAAYQBuAHQAaQB3AG8AcgBkACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8AZgBpAGwA\nZQAgAD4AIAAkAG0AcwB3AG8AcgBkAF8AZgBpAGwAZQA7AG0AdgAgAC0AZgAgACQAbQBzAHcA\nbwByAGQAXwBmAGkAbABlACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8AZgBpAGwAZQBgADsA\nDQAgAH0AIABlAGwAcwBlACAAewANACAAIwBOAE8AVAAgAE0AUwBXAE8AUgBEACAARABPAEMA\nUwAsAA0AIAAjAFUAUwBFACAAVABIAEUAIABFAE4AQwBPAEQARQBEACAATQBJAE0ARQAgAFYA\nRQBSAFMASQBPAE4AIABJAE4AIABUAEgARQAgAEYASQBMAEUADQAgAGAAZQBjAGgAbwAgACIA\nJABhAHQAdABhAGMAaABtAGUAbgB0ACIAIAA+ACAAJABhAHQAdABhAGMAaABtAGUAbgB0AF8A\nZgBpAGwAZQBgADsADQAgAH0ADQANAA0AUABpAHAAaQBuAGcAIAB0AGgAZQAgAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIABpAG4AIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdAAgAGQA\nZQBjAG8AZABlAC4AcABsACAAZABlAGMAbwBkAGUAcwAgAHQAaABlACAAbQBpAG0AZQAtADYA\nNAAgAGIAYQBzAGUAIABiAGEAYwBrACAAaQBuAHQAbwAgAGkAdABzACAAbwByAGkAZwBpAG4A\nYQBsACAAYgBpAG4AYQByAHkAIABlAG4AYwBvAGQAaQBuAGcALAAgAGEAbAB0AGgAbwB1AGcA\naAAgAHQAaABpAHMAIABjAGEAbgAgAGIAZQAgAGQAbwBuAGUAIABiAHkAIABhACAAcABvAHMA\ndABnAHIAZQBzACAAZgB1AG4AYwB0AGkAbwBuACAAdABvAG8ALgAgAFQAaABlACAAZQBuAGMA\nbwBkAGUAZAAgAG8AdQB0AHAAdQB0ACAAaQBzACAAdABoAGUAbgAgAHAAaQBwAGUAZAAgAGkA\nbgB0AG8AIAB0AGgAZQAgAGMAbwBtAG0AYQBuAGQAIABsAGkAbgBlACAAdQB0AGkAbABpAHQA\neQAgAGYAaQBsAGUAIAB0AGgAYQB0ACAAZABlAHQAZQByAG0AaQBuAGUAcwAgAGkAZgAgAGkA\ndAAgAHIAZQBhAGwAbAB5ACAAaQBzACAAYQBuACAAbQBzAHcAbwByAGQAIABkAG8AYwB1AG0A\nZQBuAHQALgAgAEEAdAAgAHQAaABlACAAcwBhAG0AZQAgAHQAaQBtAGUAIAB0AGgAZQAgAGQA\nZQBjAG8AZABlAGQAIABhAHQAdABhAGMAaABtAGUAbgB0ACAAaQBzACAAcwBhAHYAZQBkACAA\nYQBzACAAdABoAGUAIAB0AGUAbQBwAG8AcgBhAHIAeQAgAGYAaQBsAGUALAAgACIALwB0AG0A\ncAAvAGEAdAB0AGEAYwBoAG0AZQBuAHQAIgAuAA0ADQANAEEAbgAgAGEAdAB0AGEAYwBoAG0A\nZQBuAHQAIAB0AGgAYQB0ACAAaQBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAGEAcwAgAGEA\nbgAgAG0AcwB3AG8AcgBkACAAZABvAGMAdQBtAGUAbgB0ACwAIAB3AGkAdABoACAAYQAgAE0A\nSQBNAEUAIAB0AHkAcABlACAAbwBmACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC8AbQBzAHcA\nbwByAGQALAAgAGkAcwAgAHAAcgBvAGMAZQBzAHMAZQBkACAAdABoAHIAbwB1AGcAaAAgAHQA\naABlACAAYwBvAG0AbQBhAG4AZAAgAGwAaQBuAGUAIAB1AHQAaQBsAGkAdAB5ACAAYQBuAHQA\naQB3AG8AcgBkACAAdABoAGEAdAAgAHQAdQByAG4AcwAgAGkAdAAgAGkAbgB0AG8AIABhAG4A\nIABhAHMAYwBpAGkAIAB0AGUAeAB0ACAAZABvAGMAdQBtAGUAbgB0ACAAYQBuAGQAIABpAHMA\nIAB1AHAAbABvAGEAZABlAGQAIABhAHMAIABhACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQA\nLgANAA0ADQBBAGwAbAAgAG8AdABoAGUAcgAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAcwAgAGEA\ncgBlACAAcwBhAHYAZQBkACAAaQBuACAAdABoAGUAaQByACAAbwByAGkAZwBpAG4AYQBsACAA\nTQBJAE0ARQAgAGUAbgBjAG8AZABpAG4AZwAgAGkAbgAgAHQAaABlACAAZABhAHQAYQBiAGEA\ncwBlACAAYQBzACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQAcwAuAA0ADQANAFAAYQByAHQA\nIAA0ACwAIABRAHUAZQByAHkAaQBuAGcAIAB0AGgAZQAgAGQAYQB0AGEAYgBhAHMAZQANAA0A\nDQBRAHUAZQByAGkAZQBzAA0AIAANAA0ADQBUAGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAA\ncQB1AGUAcgBpAGUAcwAgAGEAcgBlACAAYgBhAHMAZQBkACAAbwBuACAAbQB5ACAAbwB3AG4A\nIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAASQAgAHUAcwBlAGQAIAB0AG8AIABkAGUA\ndgBlAGwAbwBwACAAdABoAGkAcwAgAGEAcgB0AGkAYwBsAGUALgANACAADQANAA0ARgBpAHIA\ncwB0ACwAIABzAHUAbQBtAGEAcgBpAHoAZQAgAGEAbABsACAAdABoAGUAIABlAG0AYQBpAGwA\nIABtAGUAcwBzAGEAZwBlAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAbwB0AGgAIABhACAA\nbQBhAGkAbgAgAGIAbwBkAHkAIABhAG4AZAAgAGEAbgAgAGEAdAB0AGEAYwBoAG0AZQBuAHQA\nIABpAG4AIABhACAAcwBpAG0AcABsAGUAIABxAHUAZQByAHkAIAAoAHIAZQBmAGUAcgAgAHQA\nbwAgAHQAaABlACAAdABhAGIAbABlACAAYwByAGUAYQB0AGkAbwBuACAAcwBjAHIAaQBwAHQA\nKQA6AA0AIAANAA0ADQBTAEUATABFAEMAVAANACAAbQAuAGYAcgBvAG0AXwBlAG0AYQBpAGwA\nIABBAFMAIABGAHIAbwBtACwADQAgAG0ALgBzAHUAYgBqAGUAYwB0ACAAQQBTACAAUwB1AGIA\nagBlAGMAdAAsAA0AIABtAC4AbQBhAGkAbABiAG8AZAB5ACAAQQBTACAATQBlAHMAcwBhAGcA\nZQAsAA0AIABhAC4AYQB0AHQAYQBjAGgAbQBlAG4AdAAgAEEAUwAgAEEAdAB0AGEAYwBoAG0A\nZQBuAHQADQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgAbQBlAG4A\ndAAgAGEADQAgAFcASABFAFIARQAgAG0ALgBtAGUAcwBzAGEAZwBlAGkAZAA9AGEALgBtAGUA\ncwBzAGEAZwBlAA0AIAANACAADQANAA0ARgBSAE8ATQANACAADQBTAHUAYgBqAGUAYwB0AA0A\nIAANAE0AZQBzAHMAYQBnAGUADQAgAA0AQQB0AHQAYQBjAGgAbQBlAG4AdAANACAADQANAA0A\ncgBvAGIAZQByAHQALgBiAGUAcgBuAGkAZQByADUAQABzAHkAbQBwAGEAdABpAGMAbwAuAGMA\nYQANAG0AZQBzAHMAYQBnAGUAIAAxAA0AIAANADYAMAAyADIANwANADYAMAAyADMAMAANAA0A\nDQByAG8AYgBlAHIAdAAuAGIAZQByAG4AaQBlAHIANQBAAHMAeQBtAHAAYQB0AGkAYwBvAC4A\nYwBhAA0AbQBlAHMAcwBhAGcAZQAgADIADQAgAA0ANgAwADIAMwAzAA0ANgAwADIAMwA2AA0A\nDQANAGMAYQBzAGUAcwB0AHUAZAB5AEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0A\nbQBlAHMAcwBhAGcAZQAgADMADQAgAA0ANgAwADIAMwA5AA0ANgAwADIANAAyAA0ADQANAGMA\nYQBzAGUAcwB0AHUAZAB5AEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0AbQBlAHMA\ncwBhAGcAZQAgADQADQAgAA0ANgAwADIANAA1AA0ANgAwADIANAA4AA0ADQANACAADQANAFQA\naABlACAATQBlAHMAcwBhAGcAZQAgAGEAbgBkACAAQQB0AHQAYQBjAGgAbQBlAG4AdABzACAA\nYQByAGUAIABvAGkAZAAnAHMALAAgAG8AcgAgAHIAZQBmAGUAcgBlAG4AYwBlACAAbgB1AG0A\nYgBlAHIAcwAsACAAIAB0AG8AIAB0AGgAZQAgAGwAYQByAGcAZQAgAG8AYgBqAGUAYwB0AHMA\nIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABsAG8AYQBkAGUAZAAgAGkAbgAgAHQA\naABlACAAcABnAF8AbABhAHIAZwBlAG8AYgBqAGUAYwB0ACAAYwBhAHQAYQBsAG8AZwAuAA0A\nIAANAA0ADQBOAG8AdwAsACAAbABpAHMAdAAgAGEAbABsACAAbQBlAHMAcwBhAGcAZQBzACAA\ndABoAGEAdAAgAGgAYQBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQBuAGQAIABpAGQA\nZQBuAHQAaQBmAHkAIAB3AGgAaQBjAGgAIABvAG4AZQBzACAAdwBlAHIAZQAgAG0AcwB3AG8A\ncgBkACAAZABvAGMAdQBtAGUAbgB0AHMAOgANACAADQAgAFMARQBMAEUAQwBUAA0AIABtAC4A\nbQBlAHMAcwBhAGcAZQBpAGQAIABBAFMAIAAiAE0AZQBzAHMAYQBnAGUAIABJAEQAIgAsAA0A\nIABhAC4AYQB0AHQAYQBjAGgAbQBlAG4AdAAgAEEAUwAgACIAQQB0AHQAYQBjAGgAbQBlAG4A\ndAAgAG8AaQBkACIALAANACAAQwBBAFMARQANACAAIABXAEgARQBOACAAYQAuAG0AaQBtAGUA\nXwB0AHkAcABlAD0AJwBhAHAAcABsAGkAYwBhAHQAaQBvAG4ALwBtAHMAdwBvAHIAZAAnACAA\nVABIAEUATgAgACcAdAByAHUAZQAnAA0AIAAgAEUATABTAEUAIAAnAGYAYQBsAHMAZQAnAA0A\nIABFAE4ARAAgAEEAUwAgACIAbQBzAHcAbwByAGQAIABhAHQAdABhAGMAaABtAGUAbgB0ACIA\nDQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAgAGEA\nDQAgAFcASABFAFIARQAgAG0ALgBtAGUAcwBzAGEAZwBlAGkAZAA9AGEALgBtAGUAcwBzAGEA\nZwBlAGkAZAA7AA0AIAANAA0ADQAgAA0ADQBNAGUAcwBzAGEAZwBlACAASQBEAA0AIAANAEEA\ndAB0AGEAYwBoAG0AZQBuAHQAIABvAGkAZAANACAADQBtAHMAdwBvAHIAZAAgAGEAdAB0AGEA\nYwBoAG0AZQBuAHQAIAANAA0ADQAzAEYARgA3ADkARgAwADgALgA2ADAANgAwADIAMAA4AEAA\ncwB5AG0AcABhAHQAaQBjAG8ALgBjAGEADQA2ADAAMgAzADAAIAANAHQAcgB1AGUADQAgAA0A\nDQANADMARgBGADcAOQBGADIAOQAuADIAMAA5ADAAMQAwADEAQABzAHkAbQBwAGEAdABpAGMA\nbwAuAGMAYQANADYAMAAyADMANgAgAA0AZgBhAGwAcwBlAA0ADQANADMARgBGADcAQQA1ADEA\nMQAuADIAMAAzADAAMQAwADQAQABwAG8AcwB0AGcAcgBlAHMAcQBsAC4AbwByAGcADQA2ADAA\nMgA0ADIAIAANAGYAYQBsAHMAZQANAA0ADQAzAEYARgA3AEEANQAyAEEALgA4ADAANAAwADIA\nMAAzAEAAcABvAHMAdABnAHIAZQBzAHEAbAAuAG8AcgBnAA0ANgAwADIANAA4ACAADQB0AHIA\ndQBlAA0ADQANACAADQANAA0AIABZAG8AdQAgAGMAYQBuACAAcgBlAHQAdQByAG4AIABhAG4A\neQAgAG0AcwB3AG8AcgBkACAAYQB0AHQAYQBjAGgAbQBlAG4AdAAgACgAcgBlAG0AZQBtAGIA\nZQByACAAdABoAGUAeQAnAHYAZQAgAGIAZQBlAG4AIABhAGwAbAAgAGMAbwBuAHYAZQByAHQA\nZQBkACAAdABvACAAYQBzAGMAaQBpACAAdABlAHgAdAApACAAYgB5ACAAdQBzAGkAbgBnACAA\nYQAgAHEAdQBlAHIAeQAgAHMAaQBtAGkAbABhAHIAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwA\nbwB3AGkAbgBnADoADQAgAA0AIABTAEUATABFAEMAVAANACAAZQBuAGMAbwBkAGUAKABsAG8A\nLgBkAGEAdABhACwAJwBlAHMAYwBhAHAAZQAnACkAIABBAFMAIAAiAE0AeQAgAEQAbwBjAHUA\nbQBlAG4AdAAiAA0AIABGAFIATwBNAA0AIABwAGcAXwBsAGEAcgBnAGUAbwBiAGoAZQBjAHQA\nIABsAG8ALAAgAGEAdAB0AGEAYwBoAG0AZQBuAHQAIABhAA0AIABXAEgARQBSAEUADQAgAGEA\nLgBtAGUAcwBzAGEAZwBlAGkAZAAgAD0AIAAnADMARgBGADcAQQA1ADIAQQAuADgAMAA0ADAA\nMgAwADMAQABwAG8AcwB0AGcAcgBlAHMAcQBsAC4AbwByAGcAJwANACAAQQBOAEQADQAgAGEA\nLgBhAHQAdABhAGMAaABtAGUAbgB0ACAAPQAgAGwAbwAuAGwAbwBpAGQAOwANACAADQAgAFQA\naABlACAAZQBuAGMAbwBkAGUAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAcwB0AHMAIAAiAE0A\neQAgAEQAbwBjAHUAbQBlAG4AdAAiACAAZgByAG8AbQAgAGIAeQB0AGUAYQAgAHQAbwAgAGEA\nIAB0AHkAcABlACAAdABlAHgAdAAgAGIAeQAgAHIAZQBtAG8AdgBpAG4AZwAgAGEAbABsACAA\nZQBzAGMAYQBwAGUAIABzAGUAcQB1AGUAbgBjAGUAcwAgAHQAaABhAHQAIAB3AGUAcgBlACAA\nbwByAGkAZwBpAG4AYQBsAGwAeQAgAGkAbgBzAGUAcgB0AGUAZAAgAGIAeQAgAHQAaABlACAA\nbABvAF8AaQBtAHAAbwByAHQAIABmAHUAbgBjAHQAaQBvAG4ALgANACAADQANAA0AUwBlAGEA\ncgBjAGgAaQBuAGcAIABGAG8AcgAgAFAAYQB0AHQAZQByAG4AcwANAA0AIABUAGgAZQByAGUA\nIABhAHIAZQAgAHQAdwBvACAAdwBhAHkAcwAgAHQAbwAgAHMAZQBhAHIAYwBoACAAdABlAHgA\ndAA7ACAAdABoAGUAIABTAFEATAAgAHcAYQB5ACAAYQBuAGQAIAB0AGgAZQAgAFAAbwBzAHQA\nZwByAGUAcwAsACAAUABPAFMASQBYACAAcwB0AHkAbABlACAAbwBmACAAcgBlAGcAdQBsAGEA\ncgAgAGUAeABwAHIAZQBzAHMAaQBvAG4AcwA6AA0AIAANAA0AVQBzAGkAbgBnACAATABJAEsA\nRQANAA0AIAANAA0AVABoAGkAcwAgAHEAdQBlAHIAeQAgAHcAaQBsAGwAIABzAGUAYQByAGMA\naAAgAHQAaABlACAAcABoAHIAYQBzAGUAIAAiAFQAaABlAHMAZQAgAGYAdQBuAGMAdABpAG8A\nbgBzACAAcgBlAGEAZAAgAGEAbgBkACAAdwByAGkAdABlACIAIABpAG4AIABhACAAcABhAHIA\ndABpAGMAdQBsAGEAcgAgAHcAbwByAGQAIABkAG8AYwB1AG0AZQBuAHQALgANAA0AIAANAA0A\nUwBFAEwARQBDAFQADQAgAG0ALgBmAHIAbwBtAF8AZQBtAGEAaQBsACAAQQBTACAAIgBGAHIA\nbwBtACIALAANACAAYQAuAGQAZQBzAGMAcgBpAHAAdABpAG8AbgAgAEEAUwAgACIARgBpAGwA\nZQAgAG4AYQBtAGUAIgAsAA0AIABDAEEAUwBFAA0AIAAgACAAVwBIAEUATgAgAGUAbgBjAG8A\nZABlACgAbABvAC4AZABhAHQAYQAsACcAZQBzAGMAYQBwAGUAJwApACAATABJAEsARQAgACcA\nJQBUAGgAZQBzAGUAIABmAHUAbgBjAHQAaQBvAG4AcwAgAHIAZQBhAGQAIABhAG4AZAAgAHcA\ncgBpAHQAZQAlACcAIABUAEgARQBOACAAJwB0AHIAdQBlACcADQAgACAAIABFAEwAUwBFACAA\nJwBmAGEAbABzAGUAJwANACAARQBOAEQAIABBAFMAIAAiAFMAZQBhAHIAYwBoACAAcgBlAHMA\ndQBsAHQAcwAiAA0AIABGAFIATwBNACAAcABnAF8AbABhAHIAZwBlAG8AYgBqAGUAYwB0ACAA\nbABvACwAIABhAHQAdABhAGMAaABtAGUAbgB0ACAAYQAsACAAbQBhAGkAbgAgAG0ADQAgAFcA\nSABFAFIARQANACAAYQAuAG0AZQBzAHMAYQBnAGUAaQBkACAAPQAgACcAMwBGAEYANwBBADUA\nMgBBAC4AOAAwADQAMAAyADAAMwBAAHAAbwBzAHQAZwByAGUAcwBxAGwALgBvAHIAZwAnAA0A\nIABBAE4ARAANACAAYQAuAGEAdAB0AGEAYwBoAG0AZQBuAHQAIAA9ACAAbABvAC4AbABvAGkA\nZAANACAAQQBOAEQADQAgAGEALgBtAGUAcwBzAGEAZwBlAGkAZAAgAD0AIABtAC4AbQBlAHMA\ncwBhAGcAZQBpAGQAOwANAA0AIAANACAADQANAEYAcgBvAG0ADQBGAGkAbABlACAAbgBhAG0A\nZQANAFMAZQBhAHIAYwBoACAAcgBlAHMAdQBsAHQAcwANAA0ADQBjAGEAcwBlAHMAdAB1AGQA\neQBAAHAAbwBzAHQAZwByAGUAcwBxAGwALgBvAHIAZwANAGQAbwBjADIALgBkAG8AYwANAHQA\ncgB1AGUADQANAA0AIAANAA0AUgBlAGcAdQBsAGEAcgAgAEUAeABwAHIAZQBzAHMAaQBvAG4A\ncwANAA0AIAANAA0AVABoAGkAcwAgAHEAdQBlAHIAeQAgAHcAaQBsAGwAIABjAG8AdQBuAHQA\nIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAZQBtAGEAaQBsAHMAIAB3AGkAdABoACAA\nYQB0AHQAYQBjAGgAbQBlAG4AdABzACAAYQBuAGQAIAB3AGgAbwBzAGUAIABlAG0AYQBpAGwA\nIABhAGQAZAByAGUAcwBzACAAYgBlAGcAaQBuAHMAIAB3AGkAdABoACAAdABoAGUAIABsAGUA\ndAB0AGUAcgBzACAAIgBjAGEAIgAgAGEAbgBkACAAZQBuAGQAcwAgAGkAbgAgACIAbwByAGcA\nIgAuAA0AIAANAA0ADQBTAEUATABFAEMAVAAgAGMAbwB1AG4AdAAoAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACkADQAgAEYAUgBPAE0AIABtAGEAaQBuACAAbQAsACAAYQB0AHQAYQBjAGgA\nbQBlAG4AdAAgAGEADQAgAFcASABFAFIARQANACAAbQAuAG0AZQBzAHMAYQBnAGUAaQBkACAA\nPQAgAGEALgBtAGUAcwBzAGEAZwBlAGkAZAANACAAQQBOAEQADQAgAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACAAfgAgACcAXgBjAGEAJwANACAAQQBOAEQADQAgAG0ALgBmAHIAbwBtAF8A\nZQBtAGEAaQBsACAAfgAgACcAbwByAGcAJAAnADsADQAgAA0ADQANAEMAYQB2AGUAYQB0AHMA\nDQANACAADQBLAGUAZQBwAGkAbgBnACAAdABoAGUAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQA\nIABhAHMAIABzAGkAbQBwAGwAZQAgAGEAcwAgAHAAbwBzAHMAaQBiAGwAZQAgAGgAYQBzACAA\nbQBhAGQAZQAgAGkAdAAgAG4AZQBjAGUAcwBzAGEAcgB5ACAAdABvACAAYQBzAHMAdQBtAGUA\nIAB0AGgAYQB0ACAAYQBsAGwAIABlAG0AYQBpAGwAIABhAHQAdABhAGMAaABtAGUAbgB0AHMA\nIABhAHMAIABtAGkAbQBlACAAZQBuAGMAbwBkAGUAZAAgAGIAYQBzAGUANgA0AC4ADQAgAA0A\nVABoAGUAIABwAGUAcgBsACAAcwBjAHIAaQBwAHQAIABoAGEAcwAgAGIAZQBlAG4AIAB3AHIA\naQB0AHQAZQBuACAAaQBuACAAYQAgAG0AYQBuAG4AZQByACAAdABoAGEAdAAgAGYAbwBsAGwA\nbwB3AHMAIAB0AGgAZQAgAGYAbABvAHcAIABvAGYAIAB0AGgAaQBzACAAYQByAHQAaQBjAGwA\nZQAgAHMAbwAgAGkAdAAgAGgAYQBzACAAcgBlAHMAdQBsAHQAZQBkACAAaQBuACAAYwBvAGQA\nZQAgAHQAaABhAHQAIABpAHMAIABhACAAYgBpAHQAIABjAGwAdQBtAHMAeQAgADoALQAoACAA\nLgANACAADQBTAGEAdgBlACAAeQBvAHUAcgBzAGUAbABmACAAdABpAG0AZQAgAGEAbgBkACAA\nZwByAGkAZQBmACAAYgB5ACAAcwBhAHYAaQBuAGcAIABzAHEAbAAgAHEAdQBlAHIAaQBlAHMA\nIABhAG4AZAAgAGQAZQBmAGkAbgBpAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABmAGkAbABlACAA\nYQBuAGQAIAB0AGgAZQBuACAAaQBuAHYAbwBrAGkAbgBnACAAaQB0ACAAdABoAHIAbwB1AGcA\naAAgAHQAaABlACAAcABzAHEAbAAgAGMAbABpAGUAbgB0AC4ADQAgAA0ASQBuAHYAbwBrAGUA\nIAB0AGgAZQAgAGMAcgBlAGEAdABlAFQAYQBiAGwAZQBzAC4AcwBxAGwAIAB0AG8AIABjAGwA\nZQBhAG4AIABvAHUAdAAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlACAAYQBzACAAeQBvAHUA\nIAByAGUAcgB1AG4AIAB0AGgAZQAgAHAAZQByAGwAIABzAGMAcgBpAHAAdABzAC4ADQAgAA0A\nVABoAGUAIABkAGEAdABhAGIAYQBzAGUAIABkAGUAZgBpAG4AaQB0AGkAbwBuAHMAIABoAGEA\ndgBlACAAYgBlAGUAbgAgAGQAZQBtAG8AbgBzAHQAcgBhAHQAZQBkACAAbwBuAGwAeQAgAHMA\nbwAgAGYAYQByACAAYQBzACAAdABvACAAcwBoAG8AdwAgAHcAaABlAHIAZQAgAHkAbwB1ACAA\nYwBhAG4AIABtAGEAawBlACAAYQAgAHMAdABhAHIAdAAuACAATQBhAGsAaQBuAGcAIABhACAA\nZABhAHQAYQBiAGEAcwBlACAAdABoAGEAdAAgAGYAbABpAGUAcwAgAGwAaQBrAGUAIABhACAA\nagBlAHQAIABpAHMAIABhAG4AIABhAHIAdABpAGMAbABlACAAaQBuACAAaQB0AHMAZQBsAGYA\nLgANACAADQBBAG4AdABpAHcAbwByAGQAIABpAHMAIABhACAAYgBpAHQAIABxAHUAaQByAGsA\neQAgAGkAbgAgAHQAaABhAHQAIABpAHQAIAB3AGkAbABsACAAbgBvAHQAIABwAGEAcgBzAGUA\nIABmAGkAbABlAHMAIAB0AGgAYQB0ACAAaQB0ACAAZgBlAGUAbABzACAAaQBzACAAdABvAG8A\nIABzAG0AYQBsAGwALgANACAADQBWAGkAZQB3AGkAbgBnACAAdABoAGUAIABtAG8AegBpAGwA\nbABhACAAbQBiAG8AeAAgAHQAaAByAG8AdQBnAGgAIABpAHQAJwBzACAAYwBsAGkAZQBuAHQA\nIABjAGEAbgAgAGIAZQAgAGQAZQBjAGUAaQB2AGkAbgBnAC4AIABJAHQAIABuAGUAdgBlAHIA\nIAByAGUAYQBsAGwAeQAgAHIAZQBtAG8AdgBlAHMAIABlAG0AYQBpAGwAIABmAHIAbwBtACAA\ndABoAGUAIABiAG8AeAAgAGUAdgBlAG4AIABpAGYAIAB5AG8AdQAnAHYAZQAgAGQAZQBsAGUA\ndABlAGQAIABpAHQAIAB0AGgAcgBvAHUAZwBoACAAdABoAGUAIABtAGEAaQBsACAAYwBsAGkA\nZQBuAHQAIABzAG8AIAB3AGgAZQBuACAAeQBvAHUAIABtAGEAeQAgAHcAZQBsAGwAIABzAGUA\nZQAgAGUAbQBhAGkAbAAgAGkAbgAgAHkAbwB1AHIAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgA\nYQB0ACAAeQBvAHUAIAB0AGgAbwB1AGcAaAB0ACAAeQBvAHUAIABkAGUAcwB0AHIAbwB5AGUA\nZAAgAG0AbwBuAHQAaABzACAAYgBlAGYAbwByAGUALgANACAADQBZAG8AdQAgAGMAYQBuACAA\nZQB4AHAAbwByAHQAIABsAGEAcgBnAGUAIABvAGIAagBlAGMAdABzACAAZgByAG8AbQAgAHQA\naABlACAAZABhAHQAYQBiAGEAcwBlACAAYgB5ACAAdQBzAGkAbgBnACAAdABoAGUAIABmAHUA\nbgBjAHQAaQBvAG4AIABsAG8AXwBlAHgAcABvAHIAdAAgAGkAbgAgAHQAaABlACAAIABwAHMA\ncQBsACAAYwBsAGkAZQBuAHQAIABhAG4AZAAgAHMAYQB2AGkAbgBnACAAaQB0ACAAYQBzACAA\nYQAgAGYAaQBsAGUALgAgAEYAbwByACAAZQB4AGEAbQBwAGwAZQAgACIAXABsAG8AXwBlAHgA\ncABvAHIAdAAgADEAMgAzACAAdABlAG0AcAAuAHQAeAB0ACIAIAB3AGkAbABsACAAcwBhAHYA\nZQAgAHQAaABlACAAbABhAHIAZwBlACAAbwBiAGoAZQBjAHQAIAB3AGkAdABoACAAdABoAGUA\nIABvAGkAZAAgAG4AdQBtAGIAZQByACAAbwBmACAAMQAzADIAIAB0AG8AIABhACAAZgBpAGwA\nZQAgAG4AYQBtAGUAZAAgAHQAZQBtAHAALgB0AHgAdAAuAA0AIAANAA0AQwBvAG4AYwBsAHUA\ncwBpAG8AbgANAA0AIAANAA0AVABoAGUAcgBlACAAYQByAGUAIAB0AHcAbwAgAHAAYQByAHQA\ncwAgAHQAbwAgAGEAIABzAHUAYwBjAGUAcwBzAGYAdQBsACAAZABhAHQAYQAgAG0AaQBuAGUA\nOwAgAHQAaABlACAAbQBlAGMAaABhAG4AaQBzAG0AIAB0AGgAYQB0ACAAcAByAGUAcABhAHIA\nZQBzACAAdABoAGUAIABkAG8AYwB1AG0AZQBuAHQAIAAgAGEAbgBkACAAdABoAGUAIABhAGwA\nZwBvAHIAaQB0AGgAbQAgAHQAaABhAHQAIABsAG8AbwBrAHMAIABmAG8AcgAgAHAAYQB0AHQA\nZQByAG4AcwAuACAAVwBlACcAdgBlACAAbABvAG8AawBlAGQAIABhAHQAIABvAG4AZQAgAHcA\nYQB5ACAAbwBmACAAZwBlAHQAdABpAG4AZwAgAGUAbQBhAGkAbAAgAGkAbgB0AG8AIABhACAA\nZABhAHQAYQBiAGEAcwBlACAAYgB1AHQAIABmAHIAYQBuAGsAbAB5ACAASQAgAGgAYQB2AGUA\nbgAnAHQAIABnAGkAdgBlAG4AIAB0AGgAYQB0ACAAbQB1AGMAaAAgAGMAbwB2AGUAcgBhAGcA\nZQAgAG8AbgAgAHQAaABlACAAcABvAHcAZQByACAAbwBmACAAcgBlAGcAdQBsAGEAcgAgAGUA\neABwAHIAZQBzAHMAaQBvAG4AcwAgAGkAbgAgAGEAIABkAGEAdABhAGIAYQBzAGUAIABlAG4A\ndgBpAHIAbwBuAG0AZQBuAHQALgAgAEkAdAAgAHcAbwBuACcAdAAgAGMAbwBtAGUAIABhAHMA\nIABhACAAcwB1AHIAcAByAGkAcwBlACAAdABvACAAbQBhAG4AeQAgAG8AZgAgAHkAbwB1ACAA\ndABoAGEAdAAgAHQAaABlAHIAZQAgAGEAcgBlACAAYQBsAHIAZQBhAGQAeQAgAG8AcABlAG4A\nIABzAG8AdQByAGMAZQAgAHAAcgBvAGoAZQBjAHQAcwAgAG8AdQB0ACAAdABoAGUAcgBlACAA\nZABlAGEAbABpAG4AZwAgAHcAaQB0AGgAIABzAGUAYQByAGMAaAAgAGUAbgBnAGkAbgBlAHMA\nIAB0AGUAYwBoAG4AbwBsAG8AZwBpAGUAcwAuACAASQBtAHAAbABlAG0AZQBuAHQAaQBuAGcA\nIAB0AGgAZQAgAHIAaQBnAGgAdAAgAHAAcgBvAGoAZQBjAHQAIABjAGEAbgAgAGUAYQBzAGkA\nbAB5ACAAdAB1AHIAbgAgAHkAbwB1AHIAIABmAG8AcgB3AGEAeQAgAGkAbgB0AG8AIABlAG0A\nYQBpAGwAIABkAGEAdABhAG0AaQBuAGcAIABpAG4AdABvACAAdABoAGUAIABmAHIAYQBtAGUA\ndwBvAHIAawAgAGYAbwByACAAYQAgAGsAaQBsAGwAZQByACAAYQBwAHAALgAgAE8AbgBlACAA\nZQB4AGEAbQBwAGwAZQAgAGkAcwAgAHQAaABlACAATwBwAGUAbgBGAFQAUwAgAHAAcgBvAGoA\nZQBjAHQAIAB3AGgAaQBjAGgAIABvAGYAZgBlAHIAcwAgAGEAIABQAG8AcwB0AGcAcgBlAFMA\nUQBMACAAYgBhAHMAZQBkACAAZgB1AGwAbAAgAGkAbgBkAGUAeABpAG4AZwAgAHQAbwBvAGwA\nLgAgAEoAdQBzAHQAIABpAG0AYQBnAGkAbgBlACAAdwBoAGEAdAAgAHkAbwB1ACAAYwBhAG4A\nIABkAG8ALgAgAEkAIABiAGUAdAAgAHMAbwBtAGUAIABvAGYAIAB5AG8AdQAgAFAAZQByAGwA\nIABmAGkAZQBuAGQAcwAgAGgAYQB2AGUAIABhACAAcAByAGUAdAB0AHkAIABnAG8AbwBkACAA\naQBkAGUAYQAgAG8AZgAgAHQAaABlACAAcABvAHMAcwBpAGIAaQBsAGkAdABpAGUAcwAgADsA\nLQApACAALgANAA0AIAANACAADQANAA0AUgBlAGYAZQByAGUAbgBjAGUAcwA6AA0ADQAgAA0A\nUABlAHIAbAAgAGgAbwBtAGUAcwBpAHQAZQANACAADQBDAFAAQQBOAA0AIAANAFAAbwBzAHQA\nZwByAGUAUwBRAEwAIABoAG8AbQBlAHMAaQB0AGUADQAgAA0AQQBuAHQAaQB3AG8AcgBkAA0A\nIAANAGMAcgBlAGEAdABlACAAdABhAGIAbABlACAAcwBjAHIAaQBwAHQADQAgAA0AbQBhAGkA\nbAAgAHAAYQByAHMAaQBuAGcAIABzAGMAcgBpAHAAdAANACAADQBNAEkATQBFACAAZABlAGMA\nbwBkAGkAbgBnACAAcwBjAHIAaQBwAHQADQAgAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAABAAAzHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEAAAYBAAAGgQAABwE\nAAAmBwAAKAcAACoHAABsCAAAbggAAHAIAAByCQAAdAkAAHYJAAC4DAAAugwAALwMAAB8DgAA\n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\nAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB\nAAAAAQAAAAEAAAABAAAAAQAAABjScQAA1nEAAPJxAAD2cQAAAHIAAARyAAAscgAAMHIAAEJy\nAABGcgAAbnIAAHJyAACacgAAnnIAAMhyAADMcgAA/QAAAAAAAAAAAAAAAPsAAAAAAAAAAAAA\nAAD5AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA\n8QAAAAAAAAAAAAAAAO8AAAAAAAAAAAAAAADtAAAAAAAAAAAAAAAA6wAAAAAAAAAAAAAAAOkA\nAAAAAAAAAAAAAADnAAAAAAAAAAAAAAAA5QAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADhAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAA\nAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAADyIAH7DQLyCw\n4D0hsAgHIrAIByOQoAUkkKAFM1AAACgyAA4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAUgBvAG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYABQD//////////wEAAAAGCQIAAAAAAMAA\nAAAAAABGAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAgAgAAAAAAAABAEMAbwBtAHAATwBiAGoA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAAIA\nAAAEAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqAAAA\nAAAAAAEATwBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAKAAIA/////wMAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAgAAABQAAAAAAAAAMQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAgD///////////////8AAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAEwYAAAAAAAAFAFMAdQBtAG0A\nYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nKAACAAUAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwA\nAABQAQAAAAAAAFcAbwByAGQARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAACAAAACSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////\n//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAP7///8AAAAAAAAAAA==\n\n--5vNYLRcllDrimb99--\n\n\n--5vNYLRcllDrimb99\nContent-Type: text/plain; charset=us-ascii\nContent-Disposition: attachment; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99\nContent-Type: text/plain; charset=us-ascii\nContent-Disposition: attachment; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99\nContent-Type: text/plain; charset=us-ascii\nContent-Disposition: attachment; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99--Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99--Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99--Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99--Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99--Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99-- Content-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99-- 5vNYLRcllDrimb99\nContent-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99-- --5vNYLRcllDrimb99\nContent-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99-- --5vNYLRcllDrimb99\nContent-Type: text/plain; name=document.txt\nContent-Transfer-Encoding: 7bit\nContent-Disposition: inline; filename="document.txt"\n\nData Mining\n\n\nI once did a contract administrating the network of a small startup\ncompany. The owner's total existence revolved around the email generated\nfrom his various business relationships and never made a decision unless\nthe issues were first detailed in an email. My boss once confided in me of\nhis hatred of his email client because it limited him in the way he could\norganize his information.\n\n\nI was so impressed by his desperation that I found myself constantly\nthinking about his dilemma. In time the answer came to me, what was needed\nwas a data mine.\n\n\nSo what is data mining anyway? Data mining is a class of database\napplications that look for hidden patterns in a group of data.\n\n\nIn writing this article it quickly became apparent that you ,the reader,\nmight need several pieces of unrelated technical know-how to create a data\nmine so I ended up asking myself ?who am I writing this article for??. Do I\nwrite for the Perl programmer or am I writing to the DBA? Programming and\nmanaging data don't use the same set of skills but they are nevertheless\nboth required. So where does this article go?\n\n\nThis article is for those who need a guide to generating information from\nexisting data and are looking for ideas on how to do it. Thomas Edison once\nsaid that genius was 1% inspiration and 99% perspiration: here's your 1%.\n\n\n\n\nThe scenario:\n\n\nThe objective is to data mine the email that resides in a mozilla mail box.\nWe are especially interested in msword doc attachments. The method is to\nparse the email and upload it into a relational database engine where it\ncan then be analysed.\n\n\nThe tools:\n\nThe Mozilla mailboxes follow the mbox format.\nPerl has a number of excellent email parsing modules that can be found in\nCPAN.\nPostgreSQL\nThe Command line utilities find, file, antiword and the Postgres' console\nbased client psql.\n\nThe Developer's Skillset:\n\n\nPerl:\nHe has intermediate programming experience in creating perl scripts.\nIs required to execute command line utilities from inside a perl script.\nMust be able to install and use perl modules from CPAN.\nCan make a programmatic connection to the database engine PostgreSQL.\nMust be able to execute sql queries from a perl script to a database\nengine.\nPostgreSQL:\nKnows how to install the PostgreSQL Relational Database Management System\non a Linux machine either by using precompiled binaries such as rpm's,\ndebian packages and tar balls or compiling it from source code.\nVersed in SQL 92, 99 protocols.\nAble to create tables, views, constraints and user-defined functions.\nCommand Line Utilities:\nKnows how to pipe standard input and output from one process to the next.\n\nThe Assumptions:\n\nAn installed version of Perl 5.8.x with CPAN\nA standard installation of Postgres.\nThe PostgreSQL server will have minimal security options configured.\nThe perl script will make its connection to the database via a socket\nconnection therefore the line ?tcpip_socket = true? must be uncommented in\nthe postgreql.conf file. Furthermore, the script assumes that the\nconnection requires a password:\n\n\n\n# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD\n\n\n\n local all all\n trust\n host all all 127.0.0.1\n255.255.255.255 password\n\n\n\n\nThe PostgreSQL account user is the superuser, postgres.\nThe mbox is assumed to be called "Sent" and is in the same directory as the\nparser script.\n\n\n\nPart 1, Searching for the email mboxes\n\n\nThe mozilla mail client mailboxes are found under the home account's\ndirectory ie: ~/.mozilla The screen shot below shows the different\nmailboxes of an existing profile. The mboxes are those files without any\nextensions. Another hint is to look at the file size, the mailboxes are\nnormally the largest files present.\n\n\n\n\n\n\n\n\nThe following command gives a listing of all the mailboxes in my mozilla\nprofile account:\n\n\nfind ~/.mozilla/default/rfv2udn7.slt/Mail/ -type f -not -iname "*.*" -not\n-iname ".*" -print\n\n\n\n\n\n\nPart 2, Preparing the PostgreSQL Database\n\n\nEmail Assumptions\n\nThe email has the following parts of interest; From, To, CC, and\nAttachments.\nThe email comes from one source.\nAn email can be addressed to more more than one person.\nAn email can have more than one CC.\nAn email can have more than one attachment.\nAttachments of interest are only msword documents.\n\nThe Database\n\n\nCarry out the following in a console:\n\n\nCreate a database called email;\n\n psql -U postgres ?command ?create database email? template1\n\n\nAlter the username postgres and give it the password of 123 (username\npostgres by default has no assigned password);\n\n psql -U postgres --command "alter user postgres with password '123' "\nemail\n\n\n\nThe Tables\n\n\nThe most important column in the tables is the messageid which is a unique\nalphanumeric code that is part of the email message. The tables have been\ndefined such that no data population can occur unless the messageid already\nexists in the table mailid.\n\n\nThe message body and attachments are to be stored as large objects Many of\nthe tables have a column of type oid which refers to the actual data that\nis located in the system catalog pg_largeobject.\n\n\nIndexes are created by default in Postgres for each primary key that is\ndefined in a table.\n\n\nThis script will clean the database email and create the tables. It can be\ninvoked by executing it from the console:\n\n\npsql -U postgres -f createTables.sql email\n\n\n\n\n\n\nPart 3, Developing the email parser\n\n\nThe Modules\n\n\nThe following modules are to be installed using CPAN:\n\n\nMail::MboxParser a simple interface that provides read-only access to UNIX-\nmailboxes\nDBI (the database interface) allows a perl script access to the Postgres\ndatabase\n\nNote: all modules that DBI and Mail::MboxParser depends upon should be\nautomatically installed too.\n\n\nThe Perl Script\n\n\nThe parser script first defines the global variables and then establishes a\ndatabase connection with the PostgreSQL server:\n\n\nmy $dbh = DBI->connect($dsn,$user,$pass);\n unless (defined $dbh) {die $DBI::errstr;} $dbh->{PrintError} = 0;\n\n\nThe script then reads the mailbox and breaks down the component parts of\neach individual message:\n\n\nmy $mb = Mail::MboxParser->new(\\@myarray,\n decode => 'ALL',\n parseropts => $parseropts);\n\n\nThe mailbox messages are processed inside the while loop where the parts of\nthe message of interest are identified:\n\n\nmy $id = $msg->id;\n my $from = $msg->from->{email};\n my $subject = $msg->header->{subject};\n\n\nThe MboxParser module identifyies the main body of the message:\n\n\nmy $body = $msg->body($msg->find_body);\n\n\nThe email main body and attachments are ?referenced? in the tables, main\nand attachment with an ?oid?. This is because data cannot be inserted into\na row that exceeds the default data page size of 8192 bytes. To get around\nthis they are instead inserted into the database as ?large objects?.\nUploading the large object is achieved by using psql:\n\n\nmy $myoid=`psql -U postgres --command "\\\\lo_import \\'$body_file\\'\n\\'$mymailbox\\' " $db`;\n my @oidarray = split(/ /,$myoid);\n\n\nThis method requires less coding and is thus simpler to understand instead\nof using the, albeit more efficient, use of the libpq's large object call\nwithin the perl script.\n\n\nWe are now able to populate the email message into the table main:\n\n\n$sql = "INSERT INTO main\nVALUES(\\'$id\\',\\'$from\\',\\'$subject\\',@oidarray[1])";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n\n\nThis snippet of code is used to generate the list of email recipients:\n\n\n#POPULATE TABLE 'mailto'\n for my $msg_TO ($msg->to) {\n $sql = "INSERT INTO mailto VALUES(\\'$id\\',\\'$msg_TO->{email}\\')";\n $sth = $dbh->prepare($sql) or die $DBI::errstr;\n $sth->execute() or die $DBI::errstr;\n }\n\n\n\n The most interesting part of the perl script is the identifying of msword\nattachments:\n\n\n# DETERMINE ATTACHMENT MIME-TYPES\n my $decodedattachment = `echo "$attachment"|./decode.pl|tee\n$attachment_file|file -i -`;\n my @test0 = split(/ /,$decodedattachment);\n my $mime_type = @test0[1];\n chomp $mime_type;\n\n\n\n#VALIDATING MSWORD DOCS\n if ($mime_type eq "application/msword") {\n #CONVERT INTO READABLE TEXT\n `antiword $attachment_file > $msword_file;mv -f $msword_file\n$attachment_file`;\n } else {\n #NOT MSWORD DOCS,\n #USE THE ENCODED MIME VERSION IN THE FILE\n `echo "$attachment" > $attachment_file`;\n }\n\n\nPiping the attachment in the perl script decode.pl decodes the mime-64 base\nback into its original binary encoding, although this can be done by a\npostgres function too. The encoded output is then piped into the command\nline utility file that determines if it really is an msword document. At\nthe same time the decoded attachment is saved as the temporary file,\n"/tmp/attachment".\n\n\nAn attachment that is identified as an msword document, with a MIME type of\napplication/msword, is processed through the command line utility antiword\nthat turns it into an ascii text document and is uploaded as a large\nobject.\n\n\nAll other attachments are saved in their original MIME encoding in the\ndatabase as large objects.\n\n\nPart 4, Querying the database\n\n\nQueries\n\n\n\nThe following queries are based on my own database that I used to develop\nthis article.\n\n\n\nFirst, summarize all the email messages that have both a main body and an\nattachment in a simple query (refer to the table creation script):\n\n\n\nSELECT\n m.from_email AS From,\n m.subject AS Subject,\n m.mailbody AS Message,\n a.attachment AS Attachment\n FROM main m, attachment a\n WHERE m.messageid=a.message\n\n\n\n\nFROM\n\nSubject\n\nMessage\n\nAttachment\n\n\n\nrobert.bernier5@sympatico.ca\nmessage 1\n\n60227\n60230\n\n\nrobert.bernier5@sympatico.ca\nmessage 2\n\n60233\n60236\n\n\ncasestudy@postgresql.org\nmessage 3\n\n60239\n60242\n\n\ncasestudy@postgresql.org\nmessage 4\n\n60245\n60248\n\n\n\n\nThe Message and Attachments are oid's, or reference numbers, to the large\nobjects that have been loaded in the pg_largeobject catalog.\n\n\n\nNow, list all messages that had attachments and identify which ones were\nmsword documents:\n\n SELECT\n m.messageid AS "Message ID",\n a.attachment AS "Attachment oid",\n CASE\n WHEN a.mime_type='application/msword' THEN 'true'\n ELSE 'false'\n END AS "msword attachment"\n FROM main m, attachment a\n WHERE m.messageid=a.messageid;\n\n\n\n\n\nMessage ID\n\nAttachment oid\n\nmsword attachment\n\n\n3FF79F08.6060208@sympatico.ca\n60230\ntrue\n\n\n\n3FF79F29.2090101@sympatico.ca\n60236\nfalse\n\n\n3FF7A511.2030104@postgresql.org\n60242\nfalse\n\n\n3FF7A52A.8040203@postgresql.org\n60248\ntrue\n\n\n\n\n\n You can return any msword attachment (remember they've been all converted\nto ascii text) by using a query similar to the following:\n\n SELECT\n encode(lo.data,'escape') AS "My Document"\n FROM\n pg_largeobject lo, attachment a\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid;\n\n The encode function casts "My Document" from bytea to a type text by\nremoving all escape sequences that were originally inserted by the\nlo_import function.\n\n\n\nSearching For Patterns\n\n There are two ways to search text; the SQL way and the Postgres, POSIX\nstyle of regular expressions:\n\n\nUsing LIKE\n\n\n\nThis query will search the phrase "These functions read and write" in a\nparticular word document.\n\n\n\nSELECT\n m.from_email AS "From",\n a.description AS "File name",\n CASE\n WHEN encode(lo.data,'escape') LIKE '%These functions read and write%'\nTHEN 'true'\n ELSE 'false'\n END AS "Search results"\n FROM pg_largeobject lo, attachment a, main m\n WHERE\n a.messageid = '3FF7A52A.8040203@postgresql.org'\n AND\n a.attachment = lo.loid\n AND\n a.messageid = m.messageid;\n\n\n\n\nFrom\nFile name\nSearch results\n\n\ncasestudy@postgresql.org\ndoc2.doc\ntrue\n\n\n\n\nRegular Expressions\n\n\n\nThis query will count the number of emails with attachments and whose email\naddress begins with the letters "ca" and ends in "org".\n\n\n\nSELECT count(m.from_email)\n FROM main m, attachment a\n WHERE\n m.messageid = a.messageid\n AND\n m.from_email ~ '^ca'\n AND\n m.from_email ~ 'org$';\n\n\n\nCaveats\n\n\nKeeping the perl script as simple as possible has made it necessary to\nassume that all email attachments as mime encoded base64.\n\nThe perl script has been written in a manner that follows the flow of this\narticle so it has resulted in code that is a bit clumsy :-( .\n\nSave yourself time and grief by saving sql queries and definitions in a\nfile and then invoking it through the psql client.\n\nInvoke the createTables.sql to clean out the database as you rerun the perl\nscripts.\n\nThe database definitions have been demonstrated only so far as to show\nwhere you can make a start. Making a database that flies like a jet is an\narticle in itself.\n\nAntiword is a bit quirky in that it will not parse files that it feels is\ntoo small.\n\nViewing the mozilla mbox through it's client can be deceiving. It never\nreally removes email from the box even if you've deleted it through the\nmail client so when you may well see email in your database that you\nthought you destroyed months before.\n\nYou can export large objects from the database by using the function\nlo_export in the psql client and saving it as a file. For example\n"\\lo_export 123 temp.txt" will save the large object with the oid number of\n132 to a file named temp.txt.\n\n\nConclusion\n\n\n\nThere are two parts to a successful data mine; the mechanism that prepares\nthe document and the algorithm that looks for patterns. We've looked at\none way of getting email into a database but frankly I haven't given that\nmuch coverage on the power of regular expressions in a database\nenvironment. It won't come as a surprise to many of you that there are\nalready open source projects out there dealing with search engines\ntechnologies. Implementing the right project can easily turn your forway\ninto email dataming into the framework for a killer app. One example is the\nOpenFTS project which offers a PostgreSQL based full indexing tool. Just\nimagine what you can do. I bet some of you Perl fiends have a pretty good\nidea of the possibilities ;-) .\n\n\n\n\n\nReferences:\n\n\nPerl homesite\n\nCPAN\n\nPostgreSQL homesite\n\nAntiword\n\ncreate table script\n\nmail parsing script\n\nMIME decoding script\n\n--5vNYLRcllDrimb99-- \. -- -- TOC entry 28 (OID 89361) -- Name: aliases_alias_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX aliases_alias_idx ON aliases USING btree (alias); -- -- TOC entry 29 (OID 89362) -- Name: aliases_alias_low_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX aliases_alias_low_idx ON aliases USING btree (lower((alias)::text)); -- -- TOC entry 31 (OID 89363) -- Name: users_id_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX users_id_idx ON users USING btree (user_idnr); -- -- TOC entry 32 (OID 89364) -- Name: users_name_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX users_name_idx ON users USING btree (userid); -- -- TOC entry 34 (OID 89365) -- Name: mailboxes_id_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX mailboxes_id_idx ON mailboxes USING btree (mailbox_idnr); -- -- TOC entry 37 (OID 89366) -- Name: mailboxes_owner_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX mailboxes_owner_idx ON mailboxes USING btree (owner_idnr); -- -- TOC entry 36 (OID 89367) -- Name: mailboxes_name_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX mailboxes_name_idx ON mailboxes USING btree (name); -- -- TOC entry 35 (OID 89368) -- Name: mailboxes_is_subscribed_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX mailboxes_is_subscribed_idx ON mailboxes USING btree (is_subscribed); -- -- TOC entry 39 (OID 89369) -- Name: messages_id_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX messages_id_idx ON messages USING btree (message_idnr); -- -- TOC entry 40 (OID 89370) -- Name: messages_mailbox_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX messages_mailbox_idx ON messages USING btree (mailbox_idnr); -- -- TOC entry 42 (OID 89371) -- Name: messages_seen_flag_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX messages_seen_flag_idx ON messages USING btree (seen_flag); -- -- TOC entry 44 (OID 89372) -- Name: messages_unique_id_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX messages_unique_id_idx ON messages USING btree (unique_id); -- -- TOC entry 43 (OID 89373) -- Name: messages_status_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX messages_status_idx ON messages USING btree (status); -- -- TOC entry 45 (OID 89374) -- Name: messageblks_id_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE UNIQUE INDEX messageblks_id_idx ON messageblks USING btree (messageblk_idnr); -- -- TOC entry 46 (OID 89375) -- Name: messageblks_msg_idx; Type: INDEX; Schema: public; Owner: postgres -- CREATE INDEX messageblks_msg_idx ON messageblks USING btree (message_idnr); -- -- TOC entry 30 (OID 89376) -- Name: aliases_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY aliases ADD CONSTRAINT aliases_pkey PRIMARY KEY (alias_idnr); -- -- TOC entry 33 (OID 89378) -- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY users ADD CONSTRAINT users_pkey PRIMARY KEY (user_idnr); -- -- TOC entry 38 (OID 89380) -- Name: mailboxes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY mailboxes ADD CONSTRAINT mailboxes_pkey PRIMARY KEY (mailbox_idnr); -- -- TOC entry 41 (OID 89382) -- Name: messages_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY messages ADD CONSTRAINT messages_pkey PRIMARY KEY (message_idnr); -- -- TOC entry 47 (OID 89384) -- Name: messageblks_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY messageblks ADD CONSTRAINT messageblks_pkey PRIMARY KEY (messageblk_idnr); -- -- TOC entry 66 (OID 89386) -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY mailboxes ADD CONSTRAINT "$1" FOREIGN KEY (owner_idnr) REFERENCES users(user_idnr) ON DELETE CASCADE; -- -- TOC entry 67 (OID 89390) -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY messages ADD CONSTRAINT "$1" FOREIGN KEY (mailbox_idnr) REFERENCES mailboxes(mailbox_idnr) ON DELETE CASCADE; -- -- TOC entry 68 (OID 89394) -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: postgres -- ALTER TABLE ONLY messageblks ADD CONSTRAINT "$1" FOREIGN KEY (message_idnr) REFERENCES messages(message_idnr) ON DELETE CASCADE; -- -- TOC entry 69 (OID 89436) -- Name: tr_v_1; Type: TRIGGER; Schema: public; Owner: postgres -- CREATE TRIGGER tr_v_1 AFTER INSERT ON mailboxes FOR EACH ROW EXECUTE PROCEDURE f_v_1(); -- -- TOC entry 70 (OID 90131) -- Name: tr_v_2; Type: TRIGGER; Schema: public; Owner: postgres -- CREATE TRIGGER tr_v_2 BEFORE INSERT ON messageblks FOR EACH ROW EXECUTE PROCEDURE f_v_2(); -- -- TOC entry 6 (OID 89268) -- Name: alias_idnr_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('alias_idnr_seq', 1, true); -- -- TOC entry 8 (OID 89274) -- Name: user_idnr_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('user_idnr_seq', 1, true); -- -- TOC entry 10 (OID 89283) -- Name: mailbox_idnr_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('mailbox_idnr_seq', 12, true); -- -- TOC entry 12 (OID 89298) -- Name: message_idnr_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('message_idnr_seq', 415, true); -- -- TOC entry 14 (OID 89313) -- Name: messageblk_idnr_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('messageblk_idnr_seq', 827, true); -- -- TOC entry 16 (OID 89323) -- Name: auto_notification_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('auto_notification_seq', 1, false); -- -- TOC entry 18 (OID 89329) -- Name: auto_reply_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres -- SELECT pg_catalog.setval('auto_reply_seq', 1, false); -- -- TOC entry 3 (OID 2200) -- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: postgres -- COMMENT ON SCHEMA public IS 'Standard public schema';