mug-workbench/0000755000076700000240000000000010410111274013347 5ustar drstaff00000000000000mug-workbench/_centering-grammar.pl0000644000076700000240000003563410410111274017460 0ustar drstaff00000000000000% MUG file, automatically generated. Do not edit. % Original file: centering-grammar.mug :- discontiguous(component/5). :- discontiguous(ex/2). :- multifile(component/5). :- discontiguous(component/6). :- multifile(component/6). :- multifile(clause_source_code/3). % component clauses contain compiled component code. % clause_source_code clauses contain original source code used by the MUG Workbench :-mug_grammar_info('MUG Centering Grammar for Referring Expressions', 'Eva Maguire, David Reitter'). component(refexp, en-A, B, C, D, refexp_full) :- unif(C, [sem:[type:E, png:[num:sing|F], centering:[current:[form:full, cb:0|G], previous:[cp:0, form:null|H]|I], B:[cat:E, realized:1, text:J|K]|L], B:[text:eval(concat, [[M, ' ', J]], N, O), prefix:M, function:normal, realized:1|P]|Q]), grammar_constraint(given E). component(refexp, en-A, B, C, D, refexp_full_poss) :- unif(C, [sem:[type:E, png:[num:sing|F], centering:[current:[form:full|G], previous:[cp:0, form:null|H]|I], B:[cat:E, realized:1, text:J|K]|L], B:[text:eval(concat, [[M, ' ', J, '`s']], N, O), prefix:M, function:poss, realized:1|P]|Q]). component(refexp, en-A, B, C, D, refexp_definite) :- unif(C, [sem:[type:E, png:[num:sing|F], centering:[current:[form:definite|G], previous:[cp:0, form:H|I]|J], B:[cat:objtype, text:K|L], objecttype:E|M], B:[text:eval(template, ['~w the ~w', [N, K]], O, P), prefix:N, function:normal, realized:1|Q]|R]), ( H=null ; H=full ; H=deictic ), grammar_constraint(given E). component(refexp, en-A, B, C, D, refexp_pronoun/E/F) :- unif(C, [sem:[type:G, png:H, centering:[current:[form:pronoun|I], previous:[form:J|K]|L]|M], B:[text:eval(template, ['~w ~w', [N, F]], O, P), realized:1, function:E, case:Q, prefix:N|R]|S]), grammar_constraint(given G), ( J=pronoun ; J=full ; J=deictic ; J=definite ), grammar_constraint(pronoun(H, E, Q, F)). pronoun(A, normal, B, it) :- unif(A, [gend:neut, num:sing|C]). pronoun(A, normal, nom, she) :- unif(A, [gend:fem, num:sing|B]). pronoun(A, normal, acc, her) :- unif(A, [gend:fem, num:sing|B]). pronoun(A, normal, nom, he) :- unif(A, [gend:masc, num:sing|B]). pronoun(A, normal, acc, him) :- unif(A, [gend:masc, num:sing|B]). pronoun(A, normal, nom, they) :- unif(A, [num:plural|B]). pronoun(A, normal, acc, them) :- unif(A, [num:plural|B]). pronoun(A, poss, B, its) :- unif(A, [gend:neut, num:sing|C]). pronoun(A, poss, B, her) :- unif(A, [gend:fem, num:sing|C]). pronoun(A, poss, B, his) :- unif(A, [gend:masc, num:sing|C]). pronoun(A, poss, B, their) :- unif(A, [num:plural|C]). component(refexp, en-A, B, C, D, refexp_empty) :- unif(C, [sem:[type:E, centering:[current:[cf:0, cb:0|F]|G]|H], B:[text:'', realized:0|I]|J]), grammar_constraint(given E). component(refexp, en-A, B, C, D, refexp_unspecified) :- unif(C, [sem:[type:E, centering:[current:[cf:0, cb:0|F]|G]|H], B:[text:'', realized:0|I]|J]), grammar_constraint(notgiven(E)), grammar_constraint(freeze(E, fail)). component(objtype, en-A, B, C, D, objtype_1) :- ( E/F=email/'e-mail' ; E/F=appointment/appointment ; E/F=document/document ; E/F=contact/contact ; E/F=person/person ), unif(C, [objecttype:E, B:[text:F|G]|H]). clause_source_code(component(refexp, en-A, B, C, D, refexp_full), 'centering-grammar.mug', '\n\n/* because CF setting not implemented, we cannot do deictics / highlighed\nstuff\n\ncomponent(refexp, en-_, Mode, FD, Utterance, refexp_full_focused_screen) :-\n\tMode\\=voice,\n\tUtterance === [utterance: [cb:ThisObjectID]],\n\tFD === [sem:[ \ttype: ObjectType,\n\t\t\t\t\t objectid: ThisObjectID,\n\t\t\t\t\t png:[num:sing],\n\t\t\t\t\t centering:[\n\t\t\t\t\t\t\t\tcurrent:[form: full, \n\t\t\t\t\t\t\t\t\tcp:1,\n\t\t \t\t\t\t\t \tcf:1],\t% this element is definitely top of CF\n\t\t\t\t\t\t\tprevious:[cp:0, form: null] \n\t\t\t\t\t\t ],\n\t\t\t\t\t Mode:[cat: ObjectType,\n\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\ttext: SurfaceForm\n\t\t\t\t\t ]\n\t\t ],\n\t\t\n\t\tMode:[text: concat([\'\',P,\' \',SurfaceForm, \'\']),\n\t\t prefix: P,\n\t\t function: normal,\n\t\t realized: 1\n\t\t ]\n\t ],\n\t given(ObjectType).\n\t \n\t */\n \n\n\ncomponent(refexp, en-_, Mode, FD, Utterance, refexp_full) :- \n\tFD === [sem:[ type: ObjectType,\n\t\t png:[num:sing],\n\t\t centering:[\n\t\t \t\t\tcurrent:[form: full, \n\t\t \t\t\t\t\t cb:0],\n\t\t\t\t \tprevious:[cp:0, form: null]\n\t\t\t\t ],\n\t\t Mode:[cat: ObjectType,\n\t\t\t \trealized:1,\n\t\t\t \ttext: SurfaceForm\n\t\t\t ]\n\t\t ],\n\t\t\n\t\tMode:[text: concat([P,\' \',SurfaceForm]),\n\t\t prefix: P,\n\t\t function: normal,\n\t\t realized: 1\n\t\t ]\n\t ]\n\t , given(ObjectType).\n\t'). clause_source_code(component(refexp, en-A, B, C, refexp_full_poss), 'centering-grammar.mug', '\t \n\n% Full, Possessive\ncomponent(refexp, en-_, Mode, FD, refexp_full_poss) :-\n\tFD === [sem:[ type: ObjectType,\n\t\t png:[num:sing],\n\t\t centering:[\n\t\t \t\t\tcurrent:[form: full ],\n\t\t\t\t \tprevious:[cp:0, form: null]\n\t\t\t\t ],\n\t\t Mode:[cat: ObjectType,\n\t\t\t \trealized:1,\n\t\t\t \ttext: SurfaceForm\n\t\t\t ]\n\t\t ],\n\t\t\n\t\tMode:[text: concat([P,\' \',SurfaceForm, \'`s\']),\n\t\t prefix: P,\n\t\t function: poss,\n\t\t realized: 1\n\t\t ]\n\t ].\n\n'). clause_source_code(component(refexp, en-A, B, C, refexp_definite), 'centering-grammar.mug', '\n%em\n%If an object was referred to in a non-sentence intial position in the last expression then it may be referred to using a definite referring expression.\ncomponent(refexp, en-_, Mode, FD, refexp_definite) :-\n\t\n\tFD === [\n \t\tsem:[ type: ObjectType,\n\t\t\tpng:[num:sing],\n\t\t\tcentering:[\t\tcurrent:[form: definite ],\n\t\t\t\t \t \tprevious:[cp:0, form:PreviousForm]\n\t\t\t\t \t],\n\t\t\t\t \t\n\t\t\tMode:[\tcat: objtype,\n\t\t\t\n\t\t\t\t\ttext: TypeText\n\t\t\t\t\t],\n\t\t\t\t\t\n\t\t\tobjecttype:ObjectType\n\t\t ],\n\t\t\n\t\t\n\t\tMode:[text: template(\'~w the ~w\', [P,TypeText]),\n\t\t prefix: P,\n\t\t function: normal,\n\t\t realized: 1]\n\t ], \n\t % not pronoun\n\t( PreviousForm=null; PreviousForm=full; PreviousForm=deictic )\n\t,\n\t given(ObjectType).\n '). clause_source_code(component(refexp, en-A, B, C, refexp_pronoun/D/E), 'centering-grammar.mug', ' \n\n\n /*\ncomponent(refexp, en-_, Mode, FD, Utterance, refexp_definite_in_focus_scr) :-\n\t(Mode=screen_dynamic; Mode=screen),\n\tUtterance === [utterance: [cb:ThisObjectID]],\n\tFD === [\n \t\tsem:[ type: ObjectType,\n\t\t\t\t\tobjectid: ThisObjectID,\n\t\t\t\t\tpng:[num:sing],\n\t\t\t\t\tcentering:[\t\tcurrent:[form: definite, \n\t\t \t\t\t\t\t cb:1],\n\t\t\t\t\t\t\t\tprevious:[cp:0, form:PreviousForm]\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\t\t\t\t\tMode:[\tcat: objtype,\n\t\t\t\t\t\t\ttext: TypeText\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\n\t\t\t\t\tobjecttype:ObjectType\n\t\t\t\t],\n\t\t\n\t\t\n\t\tMode:[text: template(\'~w the ~w\', [P,TypeText]),\n\t\t prefix: P,\n\t\t function: normal,\n\t\t realized: 1]\n\t ], \n\t % not pronoun\n\t( PreviousForm=null; PreviousForm=full; PreviousForm=deictic )\n\n,\n\t given(ObjectType).\n\n\n */\n\n \n%em\n%If an object was referred to in the last utterance it may be pronominalised according to its semantics.\n%If an object was a pronoun in the last utterance it is excluded from begin referred to by any referring expression other than a pronoun.\ncomponent(refexp, en-_, Mode, FD, refexp_pronoun/Function/Word) :-\n\n\tFD === [\n\t \tsem:[ type:ObjectType,\n\t\t png:PNG,\n\t\t centering:[current:[form:pronoun ],\n\t\t\t\tprevious:[form:PreviousForm]\n\t\t\t ]\n\t\t ],\n\t\t Mode:[text: template(\'~w ~w\',[P, Word]),\n\t\t realized: 1,\n\t\t function: Function,\n\t\t case:Case,\n\t\tprefix: P\n\t\t ]\n\t ],\n\t \n\t given(ObjectType),\n\t \n\t/* first pronominalization rule\n\t\tat least one of the following conditions must hold:\n\t\t- the currently pronominalized concept did not appear in U(i-1), \n\t\t- the CB of the current utterance is realized as pronoun\n\t This excludes the case that is forbidden by the rule:\n\t\t- this element occurred in Cf (u-1), but CB(U) is not realized as pronoun \t\n\t*/\t\n%\t( WasInCF = 0 ; FormOfCurrentCB = pronoun ),\n\n/* it MUST have been realized somehow in the previous utterance */\n\n\t% not null\n\t( PreviousForm=pronoun; PreviousForm=full; PreviousForm=deictic;PreviousForm=definite ),\n\t\n/* cheap lexicon access */\n\tpronoun(PNG, Function, Case, Word).\n\t'). clause_source_code(component(refexp, en-A, B, C, refexp_empty), 'centering-grammar.mug', '\n \n\n \n\n%em\n%If the screen mode refers to the cb it can use a definite.\n%this email/this contact etc. Note that the object must be the cb.\n%if underspecified the cb will be instantiated as one.\ncomponent(refexp, en-_, Mode, FD, refexp_empty) :-\n \n\tFD === [\n \t\t sem:[ \ttype:ObjectType,\n \t\t \t\tcentering:[current:[cf: 0, \n \t\t \t\t\t\t\tcb: 0]\n\t\t\t \t\t]\n\t\t\t],\n\t\t\t\n\t Mode:[text: \'\',\n\t \n\t realized: 0\n\t\t ]\n\t ],\n\t \n\t given(ObjectType).\n\t'). clause_source_code(component(refexp, en-A, B, C, refexp_unspecified), 'centering-grammar.mug', '\t \n\t \n \n \n% dr\n% if underspecified, we don\'t realize at all.\ncomponent(refexp, en-_, Mode, FD, refexp_unspecified) :-\n \n\tFD === [\n \t\t sem:[ \ttype:ObjectType,\n \t\t \t\tcentering:[current:[cf: 0, \n \t\t \t\t\t\t\tcb: 0]\n\t\t\t \t\t]\n\t\t\t],\n\t\t\t\n\t Mode:[text: \'\',\n\t \n\t realized: 0\t% must be zero, in case it\'s a complement!\n\t\t ]\n\t ],\n\t \n\t notgiven(ObjectType),\n\t freeze(ObjectType, fail). %'). clause_source_code(component(objtype, en-A, B, C, objtype_1), 'centering-grammar.mug', '% may not be instantiated at a later point in time!\n\t \n\t \n\t\t\n/* these are all the centering transitions */\t\t\n\n/* not in use -- \nthe problem is that the cb cannot be determined until it is clear which \nor the referring expressions are going to be realized in the utterance.\nonly one of these - the one that is the highest ranking one in Cf(U i-1) -\nwill receive \'cb\' status. \n*/\n\n/*\n\ncomponent(centering_transition, en-_, Mode, FD, continue_cb) :-\n\tFD === [ \n\t\t\t\t\tcurrent:[cb:CBCP, cp:CBCP, form:CBF], \n\t\t\t\t\tprevious:[cb:CBPrev], \n\t\t\t\t\tutterance:[ \n\t\t\t\t\t\t\t cb_form:CBF,\n\t\t\t\t\t\t\t transition:continue]\n\t\t\t\t\t \n\t\t\t],\n\t(CBCP = CBPrev ; CBPrev = none ),\n\tCBCP = 1.\n\t\t\t\n\n\n\ncomponent(centering_transition, en-_, Mode, FD, continue_noncb) :-\n\tFD === [ \n\t\t\t\t\tcurrent:[cb:CBCP, cp:CBCP], \n\t\t\t\t\tprevious:[cb:CBPrev], \n\t\t\t\t\tutterance:[ \n\t\t\t\t\t\t\t transition:continue]\n\t\t\t\t\t \n\t\t\t],\n\t(CBCP = CBPrev ; CBPrev = none ),\n\t(CBCP = 0; CBCP = none).\t\n\t\n \n \n \ncomponent(centering_transition, en-_, Mode, FD, retain_cb/CBPrev/ZeroOrNone) :-\n\tFD === [ \n\t\t\t\t\tcurrent:[cb:1, cp:ZeroOrNone, form:CBF], \n\t\t\t\t\tprevious:[cb:CBPrev], \n\t\t\t\t\tutterance:[ \n\t\t\t\t\t\t\t cb_form:CBF,\n\t\t\t\t\t\t\t transition:retain]\n\t\t\t\t\t \n\t\t\t],\n\t(CBPrev = 1 ; CBPrev = none ).\n%\t(ZeroOrNone = 0; ZeroOrNone = none). % to be realized as constrained when possible\n\t \n\n \ncomponent(centering_transition, en-_, Mode, FD, retain_nocb/CBPrev) :-\n\tFD === [ \n\t\t\t\t\tcurrent:[cb:0], \t% cp is unknown\n\t\t\t\t\tprevious:[cb:CBPrev], \n\t\t\t\t\tutterance:[ \n\t\t\t\t\t\t\t transition:retain]\n\t\t\t\t\t \n\t\t\t],\n\t(CBPrev = 1 ; CBPrev = none ).\n\t \n \ncomponent(centering_transition, en-_, Mode, FD, retain_none_cb) :-\n\tFD === [ \n\t\t\t\t\tcurrent:[cb:none, cp:NotNone], \t% cp is unknown\n\t\t\t\t\tprevious:[cb:none], \t% previously, must be none\n\t\t\t\t\tutterance:[ \n\t\t\t\t\t\t\t transition:retain]\n\t\t\t\t\t \n\t\t\t].\n%\t(NotNone = 0; NotNone = 1).\n% NotNone to be implemented when constraints are available. otherwise it will only\n% generate ambiguous structures or stuff that is pruned lateron.\t \n \n*/\n/* retain, smooth-shift, rough-shift are still missing! */\n\n\n\n/* this \n\n\n\n*/\n\n/*\ncomponent(refexp, en-_, voice, FD, Utterance, refexp_deictic_voice) :-\nUtterance === [utterance: [cb:ThisObjectID]],\n\tFD === [\n\t\t\tsem:\t[\t\tpng: [num: sing],\n\t\t\t\t\t\t\tobjectid: ThisObjectID,\n\t\t\t\t\t\t\tcentering: [ current:[ \n\t\t\t\t\t\t\t\t\t\tcb:CB,\n\t\t\t\t\t\t\t\t\t\tcp:CP\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t],\n\t\t \t\t\t\ttype:ObjectType\n\t\t \n\t\t \t\t\t],\t\n\t\t\t\ttypetext: [ \n\t\t \t\tobjecttype: ObjectType,\n\t\t \t\tvoice: [cat: objtype,\n\t\t\t\t \t\t\t\ttext: TypeText\n\t\t\t\t \t \t\t\t]\t \n\t\t\t \t\t\t],\n \n voice:[ form:deictic,\n \t\tprefix:Pre,\n \t\trealized: 1,\n \t\ttext: template(\'~w this! ~w\', [Pre, TypeText])\n \t\t],\n \n screen:[\tform:full,\n\t\t\t\t\t\t\trealized: 1,\n\t\t\t\t\t\t\thighlighted:1\n \t\t]\t \n \n\t\t \n\t\t],\n\t\t% deictics must be either on top of the current CF (deictic)\n\t\t% on in the CB (discourse-deictic)\n\t\twhen(ground((CB,CF)), ((CB=1;CP=1), !)). \n*/\n\n\t\t/*\n\t\t\n\t\t\tNota bene:\n\t\t\t\tThe CF setting (after grammar application)\n\t\t\t\thas not been implemented yet.\n\t\t\t\tSorry! dr 09/2004\n\t\t\t\tSee my MSc thesis for a definition of the \n\t\t\t\talgorithm that would need to be implemented.\n\t\t*/\n\t\t\n\t\t\n/* no deictics from screen to voice\ncomm_component(refexp, en-_, screen, FD, Utterance, refexp_deictic_screen) :-\nUtterance === [utterance: [cb:ThisObjectID]],\n\tFD === [\n \t\t \t\tsem:[png: [num: sing],\n\t\t \t\t\t\tobjectid:ThisObjectID,\n\t\t \t\t\t\tcentering:[ current:[cb:1, \n\t\t \t\t\t\t\t highlighted:1],\n\t\t\t\t \t\t\t\t\t\tutterance:[cb:ThisObjectID]\n\t\t\t \t\t\t\t\t\t\t],\n\t\t \t\t\t\ttype:ObjectType\n\t\t \n\t\t \t\t\t],\n\t\t\ttypetext: [ \n\t\t \t\tobjecttype: ObjectType,\n\t\t \t\tscreen: [cat: objtype,\n\t\t\t\t \t\t\t\ttext: TypeText\n\t\t\t\t \t \t\t\t]\t \n\t\t\t \t\t\t],\n \n screen:[form:deictic,\n \t\tprefix:Pre,\n \t\trealized: 1,\n \t\ttext: template(\'~w this ~w\', [Pre, TypeText])] \n \n\t\t \n\t\t].\n\t\t*/ \n\t\t\n\t\t\n\n\n/* more stuff that is shared between grammars */\n\n\n\n% object types\n\n% this translates a single object type (from the knowledge base)\n% to a natural language noun\n\ncomponent(objtype, en-_, Mode, FD, objtype_1) :-\n\t(\n\t KBType/Text = email/\'e-mail\';\n\t KBType/Text = appointment/\'appointment\';\n\t KBType/Text = document/\'document\';\n\t KBType/Text = \'contact\'/contact;\n\t \n\t KBType/Text = \'person\'/person\n\t),\n\tFD === \n\t[ \n\t objecttype: KBType,\n\t Mode: [text: Text]\n\t].\n\n'). mug-workbench/_realizer-grammar.pl0000644000076700000240000031572510410111273017320 0ustar drstaff00000000000000% MUG file, automatically generated. Do not edit. % Original file: realizer-grammar.mug :- discontiguous(component/5). :- discontiguous(ex/2). :- multifile(component/5). :- discontiguous(component/6). :- multifile(component/6). :- multifile(clause_source_code/3). % component clauses contain compiled component code. % clause_source_code clauses contain original source code used by the MUG Workbench :-mug_grammar_info('MUG FASiL Fission Grammar', 'Erin M. Panttaja, D. Reitter'). output_mode(screen_static). output_mode(screen_dynamic). output_mode(voice). component(multimodal, A, voice, B, C, multimodal_1) :- unif(B, [tree:[action:[scope:D, task:[scope:D|E]|F], voice:[cat:G, text:H|I], type:G|J], voice:[cat:multimodal, text:H|K]|L]). component(multimodal, A, screen_dynamic, B, C, multimodal_2) :- unif(B, [tree:[action:[scope:D, task:[scope:D|E]|F], screen_dynamic:[cat:G, text:H|I], type:G|J], screen_dynamic:[cat:multimodal, text:eval(template, ['
~w
', [H]], K, L)|M]|N]). component(multimodal, A, screen_static, B, C, multimodal_3) :- unif(B, [tree:[screen_static:[cat:status, text:D|E]|F], screen_static:[cat:multimodal, text:eval(template, ['~w
', [D]], G, H)|I]|J]). component(status, A, screen_static, B, C, status_1) :- grammar_constraint(device_model(screen_size, pda)), unif(B, [action:[task:[type:send_email, email:[to:[screen_static:[cat:contact, prefix:'', realized:1, form:full, text:D|E]|F], cc:[screen_static:[cat:contact, prefix:'', realized:1, form:full, text:G|H]|I], bcc:[screen_static:[cat:contact, prefix:'', realized:1, form:fullname, text:J|K]|L], subject:[screen_static:[cat:content, prefix:'', realized:1, text:M|N]|O], body:[screen_static:[cat:content, prefix:'', realized:1, text:P, maxlength:40|Q]|R]|S]|T], user_intention:[email:[to:[screen_static:[cat:contact, form:full, prefix:'', realized:1, text:U|V], type:contact|W], cc:[screen_static:[cat:contact, form:full, prefix:'', realized:1, text:X|Y], type:contact|Z], bcc:[screen_static:[cat:contact, form:full, prefix:'', realized:1, text:A1|B1], type:contact|C1], subject:[screen_static:[cat:content, prefix:'', realized:1, text:D1|E1], type:text|F1], body:[screen_static:[cat:content, prefix:'', realized:1, text:G1|H1], type:text|I1]|J1]|K1]|L1], screen_static:[cat:status, text:eval(template, [' Sending Email
To: ~w ~w
cc:~w ~w
bcc:~w ~w
Subject:~w ~w
Body: ~w ~w
', [D, U, G, X, J, A1, M, D1, P, G1]], M1, N1)|O1]|P1]). component(status, A, screen_static, B, C, status_empty) :- grammar_constraint(device_model(screen_size, phone)), unif(B, [screen_static:[text:''|D]|E]). component(status, A, screen_static, B, C, status_1error) :- unif(B, [type:error, screen_static:[text:'Error!'|D]|E]). component(status, A, voice, B, C, status_2) :- unif(B, [task:[type:send_email|D], voice:[cat:status, text:'ERROR: Voice cat: status'|E]|F]). component(status, A, screen_dynamic, B, C, status_3) :- unif(B, [task:[type:send_email|D], screen_dynamic:[cat:status, text:'ERROR: Screen_dynamic cat: status'|E]|F]). component(pick, A, B, C, D, pick_1) :- ( B=voice ; B=screen_dynamic ), unif(C, [cardinality:E, action:F, B:[cat:pick, instruction:[type:eval(specificCommonType, [G], H, I), quantity:E, action:F, B:[cat:disambiguate, text:J|K]|L], user_interaction:[choices:[B:[cat:list|M], list:G|N], submit:[action:F|O], B:[cat:ui_chooseone, text:P|Q]|R], text:eval(concat, [[J, ' ', P]], S, T)|U]|V]), unif(F, [user_intention:[list:G|W]|X]), when(nonvar(G), applyOperators(eval(specificCommonType, [G], H, I))). component(askconfirmation, A, B, C, D, askconfirmation_1) :- ( B=screen_dynamic ; B=voice ), unif(C, [action:E, instruction:[action:E, B:[cat:confirm_mod, text:F|G]|H], user_input:[B:[cat:yesnolist, text:I|J]|K], B:[cat:askconfirmation, text:eval(concat, [[F, I]], L, M)|N]|O]). component(askinfo, A, voice, B, C, askinfo_1) :- unif(B, [experience:D, initiative:E, action:F, explain_context:[experience:D, initiative:E, actiontype:G, voice:[cat:explain_askinfo, text:H|I]|J], user_input:[action:F, voice:[cat:ui_modfield, text:K|L]|M], submit:[voice:[cat:submit, text:N|O]|P], voice:[cat:askinfo, text:eval(concat, [[H, K, N]], Q, R)|S]|T]), unif(F, [voice:[cat:G|U], type:G|V]). component(askinfo, A, screen_dynamic, B, C, askinfo_2) :- unif(B, [experience:D, initiative:E, action:F, explain_context:[experience:D, initiative:E, actiontype:G, screen_dynamic:[cat:explain_askinfo, text:H|I]|J], user_input:[action:F, screen_dynamic:[cat:ui_modfield, text:K|L]|M], submit:[screen_dynamic:[cat:submit, text:N|O]|P], screen_dynamic:[cat:askinfo, text:eval(concat, [[H, K, '
', N, '
']], Q, R)|S]|T]), unif(F, [screen_dynamic:[cat:G|U], type:G|V]). component(error, A, B, C, D, error_1) :- ( B=screen_dynamic ; B=voice ), unif(C, [experience:E, initiative:F, action:G, explain_context:[experience:E, initiative:F, actiontype:H, B:[cat:explain_error, text:I|J]|K], user_input:[action:G, B:[cat:error_text, text:L|M]|N], B:[cat:error, text:eval(concat, [[I, L]], O, P)|Q]|R]), unif(G, [B:[cat:H|S], type:H|T]). component(ui_chooseone, A, screen_dynamic, B, C, ui_chooseone_1) :- unif(B, [choices:[screen_dynamic:[text:D|E]|F], submit:[screen_dynamic:[cat:submit, realized:1, text:G|H]|I], screen_dynamic:[cat:ui_chooseone, text:eval(template, [[126, 119, 60, 98, 114, 47, 62, 126, 119], [D, G]], J, K)|L]|M]). component(ui_chooseone, A, voice, B, C, ui_chooseone_2) :- unif(B, [choices:[voice:[text:D|E]|F], submit:[voice:[cat:submit, text:G|H]|I], voice:[cat:ui_chooseone, text:eval(concat, [[D, G, '? ']], J, K)|L]|M]). component(yesnolist, A, voice, B, C, yesnolist1_voice) :- unif(B, [voice:[cat:yesnolist, realized:1, text:'Yes or No'|D]|E]). component(yesnolist, A, voice, B, C, yesnolist1_empty_voice) :- unif(B, [voice:[cat:yesnolist, realized:0, text:''|D]|E]). component(yesnolist, A, B, C, D, yesnolist1_screen) :- grammar_constraint(device_model(screen_size, pda)), grammar_constraint(B\=voice), unif(C, [B:[cat:yesnolist, text:'

'|E]|F]). component(yesnolist, A, B, C, D, yesnolist2_screen) :- grammar_constraint(device_model(screen_size, phone)), grammar_constraint(B\=voice), unif(C, [B:[cat:yesnolist, text:'
YesNo

'|E]|F]). component(message_body, en-A, B, C, D, message_body1) :- unif(C, [scope:[user_intention/email/body], user_intention:[email:[body:E|F]|G], B:[realized:1, text:E|H]|I]). component(subject, en-A, B, C, D, subject1) :- unif(C, [scope:[user_intention/email/to], user_intention:[email:[subject:E|F]|G], B:[realized:1, text:E|H]|I]). component(list, A, screen_dynamic, B, C, list_1phone) :- grammar_constraint(device_model(screen_size, phone)), unif(B, [list:D, screen_dynamic:[cat:list, realized:1, text:eval(concat, [['
    ', eval(concat, [eval(foreach, [eval(foreach, [eval(unifyEach, [D, [screen_dynamic:[realized:1|E]|F]], G, H), [salient:[I|J]|K], [screen_dynamic:[cat:eval(typeof, [L], M, N)|O], object:L|P]], Q, R), [screen_dynamic:[text:S|T]|U], eval(template, ['
  1. ~w
    ', [S]], V, W)], X, Y)], Z, A1), '

']], B1, C1)|D1]|E1]), freeze(I, (flag(frozen_goals_succeed, 1, 1)->true;unif([salient:[I|J]|K], [I:L|F1]))). component(list, A, screen_dynamic, B, C, list_1) :- grammar_constraint(device_model(screen_size, pda)), unif(B, [list:D, screen_dynamic:[cat:list, realized:1, text:eval(concat, [[eval(concat, [eval(foreach, [eval(foreach, [eval(unifyEach, [D, [screen_dynamic:[realized:1|E]|F]], G, H), [salient:[I|J]|K], [screen_dynamic:[cat:eval(typeof, [L], M, N)|O], object:L|P]], Q, R), [screen_dynamic:[text:S|T]|U], eval(template, ['
~w', [S]], V, W)], X, Y)], Z, A1), '

']], B1, C1)|D1]|E1]), freeze(I, (flag(frozen_goals_succeed, 1, 1)->true;unif([salient:[I|J]|K], [I:L|F1]))). component(list, A, voice, B, C, list_1b) :- unif(B, [list:[D|E], voice:[cat:list, realized:1, text:eval(concat, [[eval(concat, [eval(foreach, [eval(foreach, [eval(unifyEach, [[D], [voice:[realized:1|F]|G]], H, I), [salient:[J|K]|L], [voice:[cat:eval(typeof, [M], N, O)|P], object:M|Q]], R, S), [voice:[text:T|U]|V], T], W, X)], Y, Z), eval(concat, [eval(foreach, [eval(foreach, [eval(unifyEach, [E, [voice:[realized:1|A1]|B1]], C1, D1), [salient:[E1|F1]|G1], [voice:[cat:eval(typeof, [H1], I1, J1)|K1], object:H1|L1]], M1, N1), [voice:[text:O1|P1]|Q1], eval(concat, [[' or ', O1, ' ']], R1, S1)], T1, U1)], V1, W1)]], X1, Y1)|Z1]|A2]), freeze(E1, (flag(frozen_goals_succeed, 1, 1)->true;unif([salient:[E1|F1]|G1], [E1:H1|B2]))), freeze(J, (flag(frozen_goals_succeed, 1, 1)->true;unif([salient:[J|K]|L], [J:M|C2]))). component(list, A, screen_dynamic, B, C, list_2) :- grammar_constraint(device_model(screen_size, pda)), unif(D, [type:E, screen_dynamic:[cat:E, prefix:''|F]|G]), unif(H, [type:I, screen_dynamic:[cat:I, prefix:''|J]|K]), unif(L, [screen_dynamic:[text:M|N]|O]), unif(P, eval(template, ['
~w', [M]], Q, R)), unif(B, [list:[S|T], screen_dynamic:[cat:list, realized:1, text:eval(concat, [[eval(concat, [eval(foreach, [eval(multiply, [eval(unifyEach, [[S], [screen_dynamic:[realized:1|U]|V]], W, X), D], Y, Z), L, P], A1, B1)], C1, D1), eval(concat, [eval(foreach, [eval(multiply, [eval(unifyEach, [T, [screen_dynamic:[realized:1|E1]|F1]], G1, H1), H], I1, J1), [screen_dynamic:[text:K1|L1]|M1], eval(template, ['
~w', [K1]], N1, O1)], P1, Q1)], R1, S1)]], T1, U1)|V1]|W1]). component(list, A, voice, B, C, list_2_voice) :- unif(D, [type:E, voice:[cat:E, prefix:''|F]|G]), unif(H, [type:I, voice:[cat:I, prefix:''|J]|K]), unif(L, [voice:[text:M|N]|O]), unif(P, M), unif(B, [list:[Q|R], voice:[cat:list, realized:1, text:eval(concat, [[eval(concat, [eval(foreach, [eval(multiply, [eval(unifyEach, [[Q], [voice:[realized:1|S]|T]], U, V), D], W, X), L, P], Y, Z)], A1, B1), eval(concat, [eval(foreach, [eval(multiply, [eval(unifyEach, [R, [voice:[realized:1|C1]|D1]], E1, F1), H], G1, H1), [voice:[text:I1|J1]|K1], eval(concat, [[' or ', I1, ' ']], L1, M1)], N1, O1)], P1, Q1)]], R1, S1)|T1]|U1]). component(disambiguate, A, B, C, D, disambiguate_1) :- unif(C, [type:E, quantity:F, action:G, B:[cat:disambiguate, fullstring:[template:disambiguate, determiner:F, field_vp:G, type_np:E, text:H, B:[cat:template_mod, prefix:'', text:H|I]|J], text:H, realized:1|K]|L]), unif(G, [type:M, B:[cat:M|N]|O]). component(submit, A, voice, B, C, submit_1) :- unif(B, [voice:[text:' ', realized:0|D]|E]). component(submit, A, screen_dynamic, B, C, submit_2) :- grammar_constraint(device_model(screen_size, pda)), unif(B, [screen_dynamic:[cat:submit, realized:1, text:' '|D]|E]). component(submit, A, screen_dynamic, B, C, submit_3) :- grammar_constraint(device_model(screen_size, phone)), unif(B, [screen_dynamic:[text:'', realized:1, realized:0|D]|E]). component(empty, A, B, C, D, empty_1) :- unif(C, [B:[cat:empty, text:' '|E]|F]). component(optional_string, A, screen_dynamic, B, C, optional_string_1) :- unif(B, [string:D, screen_dynamic:[prefix:E, realized:1, text:eval(template, ['~w~w', [E, D]], F, G)|H]|I]), grammar_constraint(given D), grammar_constraint(given E). component(optional_string, en-A, voice, B, C, optional_string_2) :- unif(B, [string:D, voice:[prefix:E, realized:1, text:eval(template, ['~w~w', [E, D]], F, G)|H]|I]), grammar_constraint(given D), grammar_constraint(given E). component(optional_string, A, B, C, D, optional_string_n) :- unif(C, [B:[realized:0, text:''|E]|F]). component(objlist, A, screen_dynamic, B, C, objlist_1) :- unif(B, [elements:D|E]), F='', H='

', unif(B, [screen_dynamic:text:eval(concat, [[H, eval(concat, [eval(foreach, [D, [screen_dynamic:[text:J|K]|L], eval(concat, [[F, J, G]], M, N)], O, P)], Q, R), I]], S, T)|U]). component(objlist, A, voice, B, C, objlist_2) :- unif(B, [elements:D|E]), unif(B, [vxmllist:eval(collect_lim, [voice:text, D], F, G), voice:[text:H|I]|J]), unif(B, [vxmllist:K|L]), M=or, unif(N, eval(concat, [[eval(concat, [eval(foreach, [eval(select, [K, begin, end-1], O, P), Q, eval(concat, [[Q, M]], R, S)], T, U)], V, W), eval(select, [K, end, end], X, Y)]], Z, A1)), unif(B, [voice:text:[cat:string, string:N, text:H|B1]|C1]). component(string, A, B, C, D, string_1) :- unif(C, [string:E, B:[text:eval(concat, [[E]], F, G), realized:1|H]|I]). component(predefined, A, B, C, D, predefined_1) :- unif(C, [object:E, B:[text:eval(concat, [[E]], F, G), realized:1|H]|I]). component(template_mod, en-A, B, C, D, template_mod_p1) :- unif(C, [template:disambiguate, version:long, determiner:E, field_vp:[task:F, template:target, cardinality:E, B:[text:G, realized:1|H]|I], type_np:J, determiner_string:[B:[cat:template_mod|K], template:determiner, cardinality:E, text:L|M], type_string:[B:[cat:objtype, text:N|O], objecttype:J|P], text:eval(template, ['Please choose ~w ~w to ~w!', [L, N, G]], Q, R), realized:1|S]). component(template_mod, en-A, B, C, D, template_mod_p2) :- unif(C, [template:disambiguate, version:middle, determiner:E, type_np:F, determiner_string:[B:[cat:template_mod|G], template:determiner, cardinality:E, text:H|I], type_string:[B:[cat:objtype, text:J|K], objecttype:F|L], text:eval(template, ['Choose ~w ~w', [H, J]], M, N), realized:1|O]). component(template_mod, en-A, B, C, D, template_mod_p3) :- unif(C, [template:disambiguate, version:short, determiner:one, text:'Which one?', realized:1|E]). component(template_mod, en-A, B, C, D, template_mod_p4) :- unif(C, [template:disambiguate, version:short, determiner:some, text:'Choose several.', realized:1|E]). component(confirm_mod, en-A, B, C, D, confirm_mod_2) :- unif(C, [action:[B:[realized:0|E]|F], B:[realized:1, text:'Confirm? '|G]|H]). component(confirm_mod, en-A, B, C, D, confirm_mod_1) :- unif(C, [action:[type:E, B:[cat:E, realized:1, synrole:inf_vp, text:F|G]|H], B:[realized:1, text:eval(template, ['Do you want ~w? ', [F]], I, J)|K]|L]). component(confirm_mod, en-A, B, C, D, confirm_mod_3) :- unif(C, [action:[task:[type:E, B:[cat:E, realized:1, synrole:sentence, text:F|G]|H]|I], B:[realized:1, text:eval(template, ['~w? ', [F]], J, K)|L]|M]). component(explain_askinfo, en-A, B, C, D, template_mod_ai2) :- unif(C, [experience:expert, B:[text:'', realized:0|E]|F]). component(ui_modfield, en-A, B, C, D, ui_modfield_1_short) :- unif(C, [experience:expert, action:[type:addtolist, scope:[task/email/to], B:[realized:1|E]|F], B:[text:'To whom? ', realized:1|G]|H]). component(ui_modfield, en-A, B, C, D, ui_modfield_1_short_cc) :- unif(C, [experience:expert, action:[type:addtolist, scope:[task/email/cc], B:[realized:1|E]|F], B:[text:'CC whom? ', realized:1|G]|H]). component(ui_modfield, en-A, B, C, D, ui_modfield_1_short_bcc) :- unif(C, [experience:expert, action:[type:addtolist, scope:[task/email/bcc], B:[realized:1|E]|F], B:[text:'BCC whom? ', realized:1|G]|H]). component(ui_modfield, en-A, B, C, D, ui_modfield_2_long) :- unif(C, [action:[type:addtolist, scope:[task/email/to], task:[email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', realized:1, text:F|G]|H]|I], B:[realized:1|J]|K], B:[text:eval(template, ['Who do you want to send ~w to? ', [F]], L, M), realized:1|N]|O]). component(ui_modfield, en-A, B, C, D, ui_modfield_2_long_cc) :- unif(C, [action:[type:addtolist, scope:[task/email/cc], task:[email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', realized:1, text:F|G]|H]|I], B:[realized:1|J]|K], B:[text:eval(template, ['Who do you want to cc ~w to? ', [F]], L, M), realized:1|N]|O]). component(ui_modfield, en-A, B, C, D, ui_modfield_2_long_bcc) :- unif(C, [action:[type:addtolist, scope:[task/email/bcc], task:[email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', realized:1, text:F|G]|H]|I], B:[realized:1|J]|K], B:[text:eval(template, ['Who do you want to bcc ~w to? ', [F]], L, M), realized:1|N]|O]). component(ui_modfield, en-A, B, C, D, ui_modfield_6_fallback) :- unif(C, [action:[type:E, B:[cat:E, text:F, realized:1|G]|H], B:[text:eval(template, ['What do you want ~w? ', [F]], I, J), realized:1|K]|L]). component(ui_modfield, en-A, B, C, D, ui_modfield_subject) :- unif(C, [action:[scope:E, fieldtext:[scope:E, B:[cat:fieldtext, text:F, realized:1|G]|H]|I], B:[text:eval(template, ['What\'s the ~w?', [F]], J, K), realized:1|L]|M]). component(ui_modfield, en-A, voice, B, C, ui_modfield_body) :- unif(B, [action:[scope:D, fieldtext:[scope:[E/email/body], voice:[cat:fieldtext, text:F, realized:1|G]|H], voice:[realized:1|I]|J], voice:[text:eval(template, ['Please speak the body of the message now.', [F]], K, L), realized:1|M]|N]). component(ui_modfield, en-A, voice, B, C, ui_modfield_body_2) :- unif(B, [action:[scope:D, fieldtext:[scope:[E/email/body], voice:[cat:fieldtext, text:F, realized:1|G]|H], voice:[realized:1|I]|J], voice:[text:eval(template, ['Speak your message now.', [F]], K, L), realized:1|M]|N]). component(ui_modfield, en-A, B, C, D, ui_modfield_body_3) :- unif(C, [action:[scope:E, fieldtext:[scope:[F/email/body], B:[cat:fieldtext, text:G, realized:1|H]|I], B:[realized:1|J]|K], B:[text:eval(template, ['Give the body of the message now.', [G]], L, M), realized:1|N]|O]). component(addtolist, en-A, B, C, D, action_1) :- unif(C, [scope:E, user_intention:F, fieldcontent:[scope:E, content_source:F, B:[cat:fieldcontent, text:G, realized:1|H]|I], fieldtext:[scope:E, B:[cat:fieldtext, text:J, realized:1|K]|L], B:[text:eval(template, ['to add ~w to the ~w', [G, J]], M, N), realized:1|O]|P]). component(deletefromlist, en-A, B, C, D, action_2) :- unif(C, [scope:E, fieldtext:[scope:E, B:[cat:fieldtext, text:F, realized:1|G]|H], B:[text:eval(template, ['to remove from the ~w', [F]], I, J), realized:1|K]|L]). component(fillfield, en-A, B, C, D, action_3) :- unif(C, [scope:E, fieldtext:[scope:E, B:[cat:fieldtext, text:F, realized:1|G]|H], B:[text:eval(template, ['to enter as the ~w', [F]], I, J), realized:1|K]|L]). component(review, en-A, B, C, D, action_review) :- unif(C, [scope:E, fieldtext:[scope:E, B:[cat:fieldtext, text:F, realized:1|G]|H], B:[text:eval(template, ['to review', [F]], I, J), realized:1|K]|L]). component(task, en-A, B, C, D, action_task_4) :- unif(C, [task:[type:E, B:[cat:E, realized:1, synrole:inf_vp, text:F|G]|H], B:[realized:1, text:eval(concat, [['to ', F]], I, J)|K]|L]). component(fieldtext, en-A, B, C, D, fieldtext_1) :- unif(C, [scope:[E/email/to], B:[text:'recipients list', realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_1b) :- unif(C, [scope:[E/email/cc], B:[text:'"carbon-copy" list', realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_1c) :- unif(C, [scope:[E/email/bcc], B:[text:'"blind-copy" list', realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_2) :- unif(C, [scope:[E/email/from], B:[text:'"from" field', realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_3) :- unif(C, [scope:[E/email/subject], B:[text:subject, realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_3b) :- unif(C, [scope:[E/email/body], B:[text:body, realized:1|F]|G]). component(fieldtext, en-A, B, C, D, fieldtext_4) :- unif(C, [scope:[E/email/to, F/email/cc, G/email/bcc], B:[text:'recipients list', realized:1|H]|I]). component(fieldcontent, en-A, B, C, D, fieldcontent_1) :- unif(C, [scope:[user_intention/email/to], content_source:[email:[to:[type:E, B:[cat:E, realized:1, text:F|G]|H]|I]|J], B:[text:F, realized:1|K]|L]). component(fieldcontent, en-A, B, C, D, fieldcontent_1b) :- unif(C, [scope:[user_intention/email/cc], content_source:[email:[cc:[type:E, B:[cat:E, realized:1, text:F|G]|H]|I]|J], B:[text:F, realized:1|K]|L]). component(fieldcontent, en-A, B, C, D, fieldcontent_1c) :- unif(C, [scope:[user_intention/email/bcc], content_source:[email:[bcc:[type:E, B:[cat:E, realized:1, text:F|G]|H]|I]|J], B:[text:F, realized:1|K]|L]). component(fieldcontent, en-A, B, C, D, fieldcontent_2) :- unif(C, [scope:[user_intention/email/from], content_source:[email:[from:[type:E, B:[cat:E, realized:1, text:F|G]|H]|I]|J], B:[text:F, realized:1|K]|L]). component(fieldcontent, en-A, voice, B, C, fieldcontent_3) :- unif(B, [scope:[user_intention/email/subject], content_source:[email:[subject:[voice:[cat:content, prefix:'', realized:1, text:D|E]|F]|G]|H], voice:[text:eval(template, ['~w', [D]], I, J), realized:1|K]|L]). component(fieldcontent, en-A, screen_dynamic, B, C, fieldcontent_3b) :- unif(B, [scope:[user_intention/email/subject], content_source:[email:[subject:[screen_dynamic:[cat:content, prefix:'', realized:1, text:D|E]|F]|G]|H], screen_dynamic:[text:eval(template, ['~w', [D]], I, J), realized:1|K]|L]). component(fieldcontent, en-A, voice, B, C, fieldcontent_4) :- unif(B, [scope:[user_intention/email/body], content_source:[email:[body:[voice:[cat:content, prefix:'', realized:1, text:D|E]|F]|G]|H], voice:[text:eval(template, ['~w', [D]], I, J), realized:1|K]|L]). component(fieldcontent, en-A, screen_dynamic, B, C, fieldcontent_4b) :- unif(B, [scope:[user_intention/email/body], content_source:[email:[body:[screen_dynamic:[cat:content, prefix:'', realized:1, text:D|E]|F]|G]|H], screen_dynamic:[text:eval(template, ['~w', [D]], I, J), realized:1|K]|L]). component(fieldcontent, en-A, B, C, D, fieldtext_5) :- unif(C, [scope:[task/E/F], B:[text:'', realized:1|G]|H]). component(explain_error, en-A, B, C, D, template_mod_ai1) :- unif(C, [B:[text:'An error has occurred:', realized:1|E]|F]). component(error_text, en-A, B, C, D, error_text_1_short) :- unif(C, [action:[type:addtolist, scope:[task/email/to, task/email/cc, task/email/bcc], B:[realized:1|E]|F], B:[text:'Cannot add name.', realized:1|G]|H]). component(error_text, en-A, B, C, D, error_text_2_long) :- unif(C, [action:[type:addtolist, scope:[task/email/to, task/email/cc, task/email/bcc], B:[realized:1|E]|F], B:[text:'Cannot add *name* to the recipient list.', realized:1|G]|H]). component(error_text, en-A, B, C, D, error_text_5_fallback) :- unif(C, [action:[type:addtolist, scope:[E], task:[contexttype:F|G], B:[realized:1|H]|I], objtype:[objecttype:F, B:[cat:objtype, text:J, realized:1|K]|L], fieldtext:[scope:[E], B:[cat:fieldtext, text:M, realized:1|N]|O], B:[text:eval(template, ['Cannot add the ~w of the ~w.', [M, J]], P, Q)|R]|S]). component(error_text, en-A, B, C, D, error_text_6_fallback) :- unif(C, [action:[type:E, B:[cat:E, text:F, realized:1|G]|H], B:[text:eval(template, ['Cannot ~w.', [F]], I, J), realized:1|K]|L]). component(error_text, en-A, B, C, D, error_text_7_fallback) :- unif(C, [B:[text:' Unknown error.', realized:1|E]|F]). component(send_email, en-A, B, C, D, task_mod_send1s) :- unif(C, [polarity:positive, email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', realized:1, text:F|G]|H], to_refexp:[sem:I, B:[cat:refexp, case:acc, function:normal, prefix:to, text:J|K]|L], scope:[task/email], B:[realized:1, synrole:sentence, text:eval(template, ['Send ~w ~w', [F, J]], M, N)|O]|P]), unif(E, [to:I, objectid:Q, centering:[current:[cp:1|R], utterance:[cp:Q|S]|T]|U]). component(send_email, en-A, B, C, D, task_mod_send2) :- unif(C, [scope:[user_intention/email], B:[realized:1, synrole:inf_vp, text:' send email'|E]|F]). component(reply_email, en-A, B, C, D, task_mod_reply1) :- unif(C, [email:E|F]), unif(C, [polarity:positive, email:[from:G, to:H|I], email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:J|K]|L], from_refexp:[sem:G, B:[cat:refexp, case:acc, function:normal, prefix:'originally from', text:M|N]|O], to_refexp:[sem:H, B:[cat:refexp, case:acc, function:normal, prefix:to, text:P|Q]|R], B:[realized:1, synrole:inf_vp, text:eval(template, [' reply to ~w ~w ~w', [J, M, P]], S, T)|U]|V]). component(reply_email, en-A, B, C, D, task_mod_reply1s) :- unif(C, [email:E|F]), unif(C, [polarity:positive, email:[from:G, to:H|I], email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:J|K]|L], from_refexp:[sem:G, B:[cat:refexp, case:acc, function:normal, prefix:'originally from', text:M|N]|O], to_refexp:[sem:H, B:[cat:refexp, case:acc, function:normal, prefix:to, text:P|Q]|R], B:[realized:1, synrole:sentence, text:eval(template, ['Reply to ~w ~w ~w', [J, M, P]], S, T)|U]|V]). component(deleteemail, en-A, B, C, D, task_mod_del1) :- unif(C, [cat:deleteemail, polarity:positive, email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:F|G]|H], from_refexp:[sem:I, B:[cat:refexp, case:acc, function:normal, prefix:from, text:J|K]|L], to_refexp:[sem:M, B:[cat:refexp, case:acc, function:normal, prefix:to, text:N|O]|P], B:[realized:1, synrole:inf_vp, text:eval(template, [' delete ~w ~w ~w', [F, J, N]], Q, R)|S]|T]), unif(E, [from:I, to:M|U]). component(deleteemail, en-A, B, C, D, task_mod_del1s) :- unif(C, [email:E|F]), unif(C, [cat:deleteemail, polarity:positive, email:[from:G, to:H|I], email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:J|K]|L], from_refexp:[sem:G, B:[cat:refexp, case:acc, function:normal, prefix:from, text:M|N]|O], to_refexp:[sem:H, B:[cat:refexp, case:acc, function:normal, prefix:to, text:P|Q]|R], B:[realized:1, synrole:sentence, text:eval(template, ['Delete ~w ~w ~w', [J, M, P]], S, T)|U]|V]). component(forward_email, en-A, B, C, D, task_mod_forward1) :- unif(C, [polarity:positive, email:E, email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:F|G]|H], from_refexp:[sem:I, B:[cat:refexp, case:acc, function:normal, prefix:from, text:J|K]|L], to_refexp:[sem:M, B:[cat:refexp, case:acc, function:normal, prefix:'originally to', text:N|O]|P], B:[realized:1, synrole:inf_vp, text:eval(template, [' forward ~w ~w ~w', [F, J, N]], Q, R)|S]|T]), unif(E, [from:I, to:M|U]). component(forward_email, en-A, B, C, D, task_mod_forward1s) :- unif(C, [email:E|F]), unif(C, [polarity:positive, email:[from:G, to:H|I], email_refexp:[sem:E, B:[cat:refexp, case:acc, function:normal, prefix:'', text:J|K]|L], from_refexp:[sem:G, B:[cat:refexp, case:acc, function:normal, prefix:from, text:M|N]|O], to_refexp:[sem:H, B:[cat:refexp, case:acc, function:normal, prefix:'originally to', text:P|Q]|R], B:[realized:1, synrole:sentence, text:eval(template, ['Forward ~w ~w ~w', [J, M, P]], S, T)|U]|V]). component(task, en-A, B, C, D, task_mod_general1) :- ( B=screen_dynamic ; B=voice ), unif(C, [task:[scope:[], B:[text:E|F]|G], scope:[], B:[cat:task, realized:0, text:E|H]|I]). component(A, en-B, C, D, E, task_mod_general2) :- ( C=screen_dynamic ; C=voice ), ( A=send_email ; A=reply_email ; A=forward_email ), ( F/G=[task/email/cc]/'cc on your e-mail' ; F/G=[task/email/bcc]/'cc on your e-mail' ; F/G=[attachments]/'attach to your e-mail' ), unif(D, [scope:F, C:[cat:A, realized:0, text:G|H]|I]). component(A, en-B, C, D, E, task_mod_general3) :- ( C=screen_dynamic ; C=voice ), ( A=send_email ; A=reply_email ; A=forward_email ), unif(D, [C:[cat:A, realized:0, text:''|F]|G]). component(A, en-B, C, D, E, task_mod_general4) :- ( C=screen ; C=voice ), A=toplevel, unif(D, [C:[cat:A, realized:0, text:''|F]|G]). component(template_mod, en-A, B, C, D, template_mod_t1) :- unif(C, [template:target, task:[type:send_email|E], scope:[task/email/to], text:'send the email to'|F]). component(template_mod, en-A, B, C, D, template_mod_t2) :- unif(C, [template:target, task:[type:send_email|E], scope:[task/email/cc], text:'cc on your email'|F]). component(template_mod, en-A, B, C, D, template_mod_t3) :- unif(C, [template:target, task:[type:send_email|E], scope:[attach], text:'attach to your email'|F]). component(email, en-A, B, C, D, email_1) :- unif(C, [polarity:positive, subject:[content:E, string:eval(template, ['"~w"', [E]], F, G), B:[cat:optional_string, prefix:' regarding ', text:H|I]|J], B:[realized:1, synrole:inf_vp, text:eval(template, ['the email ~w ', [H]], K, L)|M]|N]). component(contact, en-A, B, C, D, contact_1) :- unif(C, [int_adr_is_empty:no, adr:E, B:[realized:1, prefix:F, text:eval(concat, [[F, E]], G, H)|I]|J]), grammar_constraint(given E). component(emailaddress, en-A, B, C, D, emailaddress_1) :- unif(C, [int_adr_is_empty:no, adr:E, B:[realized:1, text:eval(concat, [[E]], F, G)|H]|I]), grammar_constraint(given E). component(contact, en-A, B, C, D, contact_2) :- unif(C, [firstname:E, lastname:F, B:[realized:1, text:eval(concat, [[E, ' ', F]], G, H)|I]|J]), grammar_constraint(given E), grammar_constraint(given F). component(contact, en-A, B, C, D, contact_2firstname) :- unif(C, [firstname:E, form:firstname, B:[realized:1, form:firstname, text:E|F]|G]), grammar_constraint(given E). component(contact, en-A, B, C, D, contact_2lastname) :- unif(C, [lastname:E, form:lastname, B:[realized:1, form:lastname, text:E|F]|G]), grammar_constraint(given E). component(contact, en-A, B, C, D, contact_3) :- unif(C, [firstname:'', lastname:'', adr:'', int_name_is_empty:yes, int_adr_is_empty:yes, B:[realized:1, empty:yes, text:''|E]|F]). component(emailaddress, en-A, B, C, D, emailaddress_3) :- unif(C, [firstname:'', lastname:'', adr:'', int_name_is_empty:yes, int_adr_is_empty:yes, B:[realized:1, empty:yes, text:''|E]|F]). component(contact, en-A, B, C, D, contact_4) :- unif(C, [firstname:E, adr:F, int_name_is_empty:no, int_adr_is_empty:no, B:[realized:0, text:''|G]|H]), ( grammar_constraint(given E) ; grammar_constraint(given F) ), !. component(emailaddress, en-A, B, C, D, emailaddress_4) :- unif(C, [firstname:E, adr:F, int_name_is_empty:no, int_adr_is_empty:no, B:[realized:0, text:''|G]|H]), ( grammar_constraint(given E) ; grammar_constraint(given F) ), !. component(content, en-A, B, C, D, content_1) :- unif(C, [content:E, int_content_is_empty:no, B:[realized:1, prefix:F, maxlength:none, text:eval(concat, [[F, E]], G, H)|I]|J]), grammar_constraint(given E). component(content, en-A, B, C, D, content_1summarized) :- unif(C, [content:E, int_content_is_empty:no, B:[realized:1, prefix:F, maxlength:G, text:eval(concat, [[F, eval(summarize, [G, E], H, I)]], J, K)|L]|M]), grammar_constraint(given E), grammar_constraint(given G). component(content, en-A, B, C, D, content_2) :- unif(C, [content:'', int_content_is_empty:yes, B:[realized:1, text:''|E]|F]). component(content, en-A, B, C, D, content_3) :- unif(C, [int_content_is_empty:no, B:[realized:0, text:''|E]|F]). component(template_mod, en-A, B, C, D, template_mod_l1) :- unif(C, [template:determiner, cardinality:one, text:one|E]). component(template_mod, en-A, B, C, D, template_mod_l2) :- unif(C, [template:determiner, cardinality:more, text:several|E]). component(template_mod, en-A, B, C, D, template_mod_l3) :- unif(C, [template:determiner, cardinality:some, text:some|E]). clause_source_code(component(multimodal, A, B, C, multimodal_1), 'realizer-grammar.mug', '\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n%%% Multimodal Level %%%%%%%%%%%%%%%%%%%%%%% \n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n/* Top level display, these three cases cover everything. */\n \ncomponent(multimodal, _, Mode, FD, multimodal_1) :- \n\t(Mode=voice),\n\tFD === [\n\t\ttree:[\n\t\t % This is a bit of a cludge because different\n\t\t % bits of code want the scope in a different place.\n\t\t % It will need to be fixed eventually. EMP\n\t\t action: [ scope: Scope,\n\t\t\t\t task: [ scope: Scope]],\n\t\t Mode:[cat:DialogueAct,\n\t\t\t text:A], \n\t\t\ttype:DialogueAct\n\t\t ], \n\t\tMode:[\tcat:multimodal,\n\t\t\ttext:A]\n\t ].\n\n'). clause_source_code(component(multimodal, A, B, C, multimodal_2), 'realizer-grammar.mug', '\ncomponent(multimodal, _, Mode, FD, multimodal_2) :- \n(Mode=screen_dynamic),\n\tFD === [\n\t\ttree:[\n\t\t % This is a bit of a cludge because different\n\t\t % bits of code want the scope in a different place.\n\t\t % It will need to be fixed eventually. EMP\n\t\t action: [ scope: Scope,\n\t\t\t\t task: [ scope: Scope]],\n\n\t\t Mode:[cat:DialogueAct,\n\t\t\t text:A], \n\t\t\ttype:DialogueAct\n\t\t ], \n\t\tMode:[\tcat:multimodal,\n\t\t\ttext:template(\'
~w
\', [A])]].\n\n'). clause_source_code(component(multimodal, A, B, C, multimodal_3), 'realizer-grammar.mug', '\n\ncomponent(multimodal, _, Mode, FD, multimodal_3) :- \n(Mode=screen_static),\n\tFD === [\n\t\ttree:[\tMode:[cat: status,\n\t\t\t text: A]\n\t\t ], \n\t\tMode:[\tcat:multimodal,\n\t\t\t text:template(\'~w
\', [A])]].\n\n'). clause_source_code(component(status, A, screen_static, B, status_1), 'realizer-grammar.mug', '\n/* This is the large window that shows the overall status of the interaction. */\n\n\ncomponent(status, _, screen_static, FD, status_1) :-\n\tdevice_model(screen_size, pda),\n\tFD === [\n \t action: [task: [ type: \'send_email\',\n\t\t\t email: [ to: [ screen_static:[\n\t\t\t\t\t\t\t\tcat: contact, \n\t\t\t\t\t\t\t\tprefix:\'\', \n\t\t\t\t\t\t\t\trealized:1, \n\t\t\t\t\t\t\t\tform:full,\n\t\t\t\t\t\t\t\ttext:ToText] \n%\t\t\t\t\t\t\t, type: contact \n\t\t\t\t\t\t\t],\n\t\t\t cc: [ screen_static:[\n\t\t\t\t\t\t\t\tcat: contact,\n\t\t\t\t\t\t\t\tprefix:\'\', \n\t\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\t\tform:full, \n\t\t\t\t\t\t\t\ttext:CCText]%, \n\t\t\t\t\t\t\t\t% type: contact \n\t\t\t\t\t\t\t\t],\n\t\t\t bcc: [ screen_static:[\n\t\t\t\t\t\t\t\tcat: contact,\n\t\t\t\t\t\t\t\tprefix:\'\', realized:1, \n\t\t\t\t\t\t\t\tform:fullname,\n\t\t\t\t\t\t\t\ttext:BCCText]%, \n\t\t\t\t\t\t\t\t%type: contact \n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t subject: [ screen_static: [\n\t\t\t\t\t\t\t cat: content, \n\t\t\t\t\t\t\t prefix:\'\', realized:1, \n\t\t\t\t\t\t\t text:SubjectText]%, \n\t\t\t\t\t\t\t %type: text \n\t\t\t\t\t\t\t ],\n\t\t\t\t\t\tbody: [ screen_static: [\n\t\t\t\t\t\t\t cat: content, \n\t\t\t\t\t\t\t prefix:\'\', realized:1, \n\t\t\t\t\t\t\t text:BodyText, \n\t\t\t\t\t\t\t maxlength:40]% , \n\t\t\t\t\t\t\t %type: text \n\t\t\t\t\t\t\t ]\n\t\t\t\t\t ] \n\t\t\t ],\n\t\t\t user_intention: [\n\t\t\t\t\t email: [ to: [ screen_static: [\n\t\t\t cat: contact,\n\t\t\t\t\t\t\t\t\t form:full,\n\t\t\t\t\t\t\t\t\t prefix:\'\',\n\t\t\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t\t\t text:TentativeToText],\n\t\t\t\t\t\t\t type: contact ],\n\t\t\t\t\t\t\tcc: [ screen_static:[\n\t\t\t\t\t\t\t\t\t cat: contact,\n\t\t\t\t\t\t\t\t\t form:full,\n\t\t\t\t\t\t\t\t\t prefix:\'\',\n\t\t\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t\t\t text:TentativeCCText],\n\t\t\t\t\t\t\t type: contact ],\n\t\t\t\t\t\t\tbcc: [ screen_static:[\n\t\t\t\t\t\t\t\t\t cat: contact,\n\t\t\t\t\t\t\t\t\t form:full,\n\t\t\t\t\t\t\t\t\t prefix:\'\',\n\t\t\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t\t\t text:TentativeBCCText],\n\t\t\t\t\t\t\t type: contact ],\n\t\t\t\t\t\t\tsubject: [ screen_static: [\n\t\t\t\t\t\t\t\t\t\t cat: content,\n\t\t\t\t\t\t\t\t\t\t prefix:\'\',\n\t\t\t\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t\t\t\t text:TentativeSubjectText],\n\t\t\t\t\t\t\t\t type: text ],\n\t\t\t\t\t\t\tbody: [ screen_static: [\n\t\t\t\t\t\t\t\t\t\t cat: content,\n\t\t\t\t\t\t\t\t\t\t prefix:\'\',\n\t\t\t\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t\t\t\t text:TentativeBodyText],\n\t\t\t\t\t\t\t\t type: text ]\n\t\t\t\t\t\t ] ]\n\t\t\t \n\t\t\t ] ,\n\t\t\t \n\t screen_static:[cat: status, \n\t\t\t text: template(\' Sending Email
To: ~w ~w
cc:~w ~w
bcc:~w ~w
Subject:~w ~w
Body: ~w ~w
\',\n\t\t\t\t\t [ToText, TentativeToText,\n\t\t\t\t\t CCText, TentativeCCText,\n\t\t\t\t\t BCCText, TentativeBCCText,\n\t\t\t\t\t SubjectText, TentativeSubjectText,\n\t\t\t\t\t BodyText, TentativeBodyText])\n ]].\n\n'). clause_source_code(component(status, A, screen_static, B, status_empty), 'realizer-grammar.mug', '\n\n\n\n% no status field on small screens (phone mode)\ncomponent(status, _, screen_static, FD, status_empty) :-\n\tdevice_model(screen_size, phone),\n\tFD === [ \n\t\t\tscreen_static: [text: \'\']\n\t\t].\n\n'). clause_source_code(component(status, A, screen_static, B, status_1error), 'realizer-grammar.mug', '\n\ncomponent(status, _, screen_static, FD, status_1error) :-\n\tFD === [\n\t\t\ttype:error,\n\t\t\tscreen_static: [text: \'Error!\']\n\t\t].\n\n'). clause_source_code(component(status, A, voice, B, status_2), 'realizer-grammar.mug', '\n\ncomponent(status, _, voice, FD, status_2) :-\n%I\'m not sure why this is here, but the system doesn\'t work without it.\n\t\n\tFD === [\n\ttask: [type: \'send_email\'],\n\tvoice:[cat:status,\n\t\t\ttext: \'ERROR: Voice cat: status\']].\n\n'). clause_source_code(component(status, A, screen_dynamic, B, status_3), 'realizer-grammar.mug', '\n\t\t\t \ncomponent(status, _, screen_dynamic, FD, status_3) :-\n%I\'m not sure why this is here, but the system doesn\'t work without it.\n\t\n\tFD === [\n\ttask: [type: \'send_email\'],\n\tscreen_dynamic:[cat:status,\n\t\t\ttext: \'ERROR: Screen_dynamic cat: status\']].\n\n'). clause_source_code(component(pick, A, B, C, pick_1), 'realizer-grammar.mug', '\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n%%% Dialogue Act Level %%%%%%%%%%%%%%%%%%%%%% \n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n/* Pick one element from a list of elements. */\n\ncomponent(pick, _, Mode, FD, pick_1) :-\n\t(Mode=voice;Mode=screen_dynamic),\n\tFD === [cardinality: Card, \n\t\t\taction: Action = [ user_intention:[ list: List ] ], \n \t\tMode:[ cat: pick, \n\t\t\t\t\tinstruction: [ \n\t\t\t\t\t\t\t\t type: specificCommonType(List),\n\t\t\t\t\t\t\t\t quantity: Card, \n\t\t\t\t\t\t\t\t action: Action,\n\t\t\t\t\t\t\t\t Mode:[ cat: disambiguate,\n\t\t\t\t\t\t\t\t\t\t text: T1] \n\t\t\t\t\t\t \t\t ], \n \t\t\tuser_interaction: [ choices: [ Mode: [ cat:list ], \n \t\t\t\t\t\t\t\t\t\t list: List\n \t\t\t\t\t\t\t\t\t\t ] , \n\t\t\t\t\t\t\t\t submit: [ action:Action ],\n\t\t\t\t\t\t\t\t Mode:[ cat: ui_chooseone,\n\t\t\t\t\t\t\t\t\t \t text: T2\n\t\t\t\t\t\t\t\t\t\t ] \n\t\t\t\t\t \t\t\t ],\n \t\t\ttext: concat([T1,\' \', T2])\n\t\t ]\n\t ]. '). clause_source_code(component(askconfirmation, A, B, C, askconfirmation_1), 'realizer-grammar.mug', ' \n\n/* Confirm a user request.*/\ncomponent(askconfirmation, _, Mode, FD, askconfirmation_1) :-\n\t(Mode=screen_dynamic; Mode=voice),\n \n\tFD === [ \n\t\t action:Action,\n\t\t instruction: [ \n\t\t\t\t action: Action, \n\t\t\t\t Mode:[cat: confirm_mod,\n\t\t\t\t text:T1]\n\t\t\t ],\n\t\t user_input: [ \n\t\t\t Mode:[ cat:yesnolist,\n\t\t\t\t \n\t\t\t\t text:T2] \t\n\t\t\t ], \n\t \n\t\t Mode: [ cat:askconfirmation,\n\t\t\t \n\t\t\t text: concat([T1,T2])\n\t\t ]\n\t ].\n\n'). clause_source_code(component(askinfo, A, B, C, askinfo_1), 'realizer-grammar.mug', '\n/* Request information from a user. */\ncomponent(askinfo, _, Mode, FD, askinfo_1) :-\n\t(Mode=voice),\n\t\n\tFD === [ experience: Experience,\n\t\t initiative: Initiative,\n\t\t action: Action=[ Mode:[cat: ActionType], \n\t\t\t type: ActionType\n\t\t\t ],\n\t\t explain_context: [ \n\t\t\t\t experience: Experience,\n\t\t\t\t initiative: Initiative,\n\t\t\t\t actiontype: ActionType,\n\t\t\t\t Mode: [\tcat: explain_askinfo,\n\t\t\t\t\t\ttext: Explanation]\n\t\t\t\t ] ,\n\t\t user_input: [\n\t\t\t action: Action,\n\t\t\t Mode:[ cat: ui_modfield,\n\t\t\t\t text:UIText] \t\n\t\t\t ], \n\t\t submit: [\n\t\t \t\tMode: [ cat:submit,\n\t\t \t\t\t\ttext: Submit\n\t\t \t\t\t]\n\t\t \t],\n\t\t Mode: [ cat:askinfo,\n\t\t\t text: concat([Explanation,UIText, Submit])\n\t\t ]\n\t ].\n\t'). clause_source_code(component(askinfo, A, B, C, askinfo_2), 'realizer-grammar.mug', '\t \n/* This time, add an input field for the user to type into. \n\n\there, the Form/Input tag is directly included at a high level.\n\tThis is sort of provisional -- theoretically we would\n\twant to modify ui_modfield to make the text depend on\n\tthe type of field we\'re modifying. \n\t\n*/\ncomponent(askinfo, _, Mode, FD, askinfo_2) :-\n\t(Mode=screen_dynamic),\n\t\n\tFD === [ experience: Experience,\n\t\t initiative: Initiative,\n\t\t action: Action=[ Mode:[cat: ActionType], \n\t\t\t type: ActionType\n\t\t\t ],\n\t\t explain_context: [ \n\t\t\t\t experience: Experience,\n\t\t\t\t initiative: Initiative,\n\t\t\t\t actiontype: ActionType,\n\t\t\t\t Mode: [\tcat: explain_askinfo,\n\t\t\t\t\t\ttext: Explanation]\n\t\t\t\t ] ,\n\t\t user_input: [\n\t\t\t action: Action,\n\t\t\t Mode:[ cat: ui_modfield,\n\t\t\t\t text:UIText] \t\n\t\t\t ], \n\t submit: [\n\t\t \t\tMode: [ cat: submit,\n\t\t \t\t\t\ttext: Submit\n\t\t \t\t\t]\n\t\t \t],\n\t\t Mode: [ cat:askinfo,\n\t\t\t text: concat([Explanation,\n\t\t\t UIText, \n\t\t\t\t\t\'
\',\n\t\t\t\t\tSubmit, \'
\'])\n\t\t ]\n\t ].\n\n'). clause_source_code(component(error, A, B, C, error_1), 'realizer-grammar.mug', '\n%This is a simple error case. We need to do some work to get this running.\ncomponent(error, _, Mode, FD, error_1) :-\n\t(Mode=screen_dynamic; Mode=voice),\n\t\n\tFD === [ experience: Experience,\n\t\t initiative: Initiative,\n\t\t action: Action=[ Mode:[cat: ActionType], \n\t\t\t type: ActionType\n\t\t\t ],\n\t\t explain_context: [ \n\t\t\t\t experience: Experience,\n\t\t\t\t initiative: Initiative,\n\t\t\t\t actiontype: ActionType,\n\t\t\t\t Mode: [\tcat: explain_error,\n\t\t\t\t\t\ttext: Explanation]\n\t\t\t\t ] ,\n\t\t user_input: [\n\t\t\t action: Action,\n\t\t\t Mode:[ cat: error_text,\n\t\t\t\t text:UIText] \t\n\t\t\t ], \n\t\t Mode: [ cat: error,\n\t\t\t text: concat([Explanation,UIText])\n\t\t ]\n\t ].\n\n'). clause_source_code(component(ui_chooseone, A, screen_dynamic, B, ui_chooseone_1), 'realizer-grammar.mug', '\n\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n%%% Intermediate interface components %%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n\n% ui_chooseone\n% realizes a choice of one out of a list of elements.\n% the upper component has to instantiate cat features\n% within choices and submit.\n\ncomponent(ui_chooseone, _, screen_dynamic, FD, ui_chooseone_1) :-\n\tFD === [\n\t\tchoices: [\n\t\t\t\tscreen_dynamic:[text:T1] ],\n\t\tsubmit: [ screen_dynamic:[cat: submit, \n\t\t\t\t\t\t\trealized:1, \n\t\t\t\t\t\t\ttext:T2] ],\n\t\tscreen_dynamic: [ cat:ui_chooseone,\n\t\t\t text:\n\t\t\t\ttemplate("~w
~w", [T1, T2])]\n\t\t].\n%'). clause_source_code(component(ui_chooseone, A, voice, B, ui_chooseone_2), 'realizer-grammar.mug', '% the presence of radio buttons for choices on the screen\n% requires that a submit button is used. that\'s why we set\n% realized:1 for the submit component.\n\t\t\n\t\t\ncomponent(ui_chooseone, _, voice, FD, ui_chooseone_2) :-\n\tFD === [\n\t\tchoices: [\n\t\t\t voice:[text:T1] ],\n\t\tsubmit: [ voice:[cat: submit, text:T2] ],\n\t\tvoice: [ cat:ui_chooseone,\n\t\t\t text:concat([T1,T2,\'? \'])] ].\n\n'). clause_source_code(component(yesnolist, A, B, C, yesnolist1_voice), 'realizer-grammar.mug', '\ncomponent(yesnolist, _, Mode, FD, yesnolist1_voice) :-\n\tMode=voice,\n\tFD === [ Mode:[ cat:yesnolist,\n\t\t\t\trealized:1,\n\t\t\t\ttext: \'Yes or No\']\n\t ].\nc'). clause_source_code(component(yesnolist, A, B, C, yesnolist1_empty_voice), 'realizer-grammar.mug', 'component(yesnolist, _, Mode, FD, yesnolist1_empty_voice) :-\n\tMode=voice,\n\tFD === [ Mode:[ cat:yesnolist,\n\t\t\t\trealized:0,\n\t\t\t\ttext: \'\']\n\t ].\n\t'). clause_source_code(component(yesnolist, A, B, C, yesnolist1_screen), 'realizer-grammar.mug', '\t \t \n\t \ncomponent(yesnolist, _, Mode, FD, yesnolist1_screen) :-\n\tdevice_model(screen_size, pda),\n\tMode\\=voice,\n\tFD === [ Mode:[ cat:yesnolist,\n\t\t\ttext: \'

\']\n\t ].\n\n'). clause_source_code(component(yesnolist, A, B, C, yesnolist2_screen), 'realizer-grammar.mug', '\n\t \ncomponent(yesnolist, _, Mode, FD, yesnolist2_screen) :-\n\tdevice_model(screen_size, phone),\n\tMode\\=voice,\n\tFD === [ Mode:[ cat:yesnolist,\n\t\t\ttext: \'
YesNo

\']\n\t ].\n\n'). clause_source_code(component(message_body, en-A, B, C, message_body1), 'realizer-grammar.mug', '\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n%%% Language-independent elements %%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n \ncomponent(message_body, en-_, Mode, FD, message_body1) :-\n\tFD === [ scope: [user_intention/email/body],\n\t\t user_intention: [ email:\t[\n\t\t\t\t\t body: T1]],\n\t\t Mode: [realized:1,\n\t\t\ttext: T1]].\t\t'). clause_source_code(component(subject, en-A, B, C, subject1), 'realizer-grammar.mug', '\t\t\t\n\n\ncomponent(subject, en-_, Mode, FD, subject1) :-\n\tFD === [ scope: [user_intention/email/to],\n\t\t user_intention: [ email:\t[\n\t\t\t\t\t subject: T1]],\n \t Mode: [realized:1,\n\t\t\t text: T1]].\t\t'). clause_source_code(component(list, A, B, C, list_1phone), 'realizer-grammar.mug', '\t\t\t\n\n/*\n\nThe list algorithm warrants some detailed explanation:\n\nThe input is a list of FDs (ListFD), given in attribute list. Each\nelement of the ListFD is unified with a template that reads the first\nelement of the \'salient\' list. This element FieldName contains the\nattribute (KB property) that identifies the most salient information\nabout the object, which is usually used to identify the objects. For\ncontacts, this would be the name. For emails, this would be the\nsubject and the sender/recipient. In the same template, we unify a\npair FieldName:SalientItemIdentifier. Because FieldName is\ninstantiated late (read out of \'salient\'), we need to delay the\nunification of this pair.\n\nAs soon FieldName is instantiated, the pair is unified with the FD and\nSalientItemIdentifier is instantiated. It will usually contain a\nstring or another kind of object.\n\nFor each element from the original list, we create a new list with a\nscreen_dynamic/voice attribute and an object attribute. The type of\nSalientItemIdentifier is read using the typeof operator. (Usually it\nwill simply return the value of the type attribute of\nSalientItemIdentifier, or \'predefined\' in case it\'s just an atom like\nfor email subjects). The type is directly used in the \'cat\' attribute\n(for screen_dynamic or voice), which triggers the resulting FD to the expanded.\n\nFor predefined objects, we have defined a MUG component. Similarly,\nMUG components need to be defined for other types that can occur here.\n\nThe foreach function automatically applies the unifier to the resulting\nlist. Therefore, we can simply read out the screen_dynamic:text attribute\nand insert it in a template that generates a radio button.\n\nFor voice, we insert \' or \' inbetween the objects. Therefore, we have\nto treat the first object in the list differently -- after all, we don\'t\nwant to get a string like "or peter ustinov or keith jarrett" out\nof the component.\n\n\n */\n\ncomponent(list, _, Mode, FD, list_1phone) :-\n(Mode=screen_dynamic),\ndevice_model(screen_size, phone), % no radio buttons for the phone\n\t\t \n\t\t\t\t% Algorithm:\n\t\t\t\t% given: A list of objects, a task/field context description\n\t\t\t\t% For each object, show:\n\t\t\t\t% Value of the most salient (designated in type description) field\n\t\t\t\t% list of values: all entries of the object that could fill the task/field context description\n\t\n\tFD === [ \n\t\t list: ListFD, \n\t\t Mode:[cat:list,\n\t\t \t realized:1,\n\t\t\t text: concat([\'
    \', concat(foreach(foreach(unifyEach(ListFD, [Mode:[realized:1|_]]), \n\t\t\t\t\t\t\t [ salient:[FieldName|_],\n\t\t\t\t\t\t\t\tFieldName:SalientItemIdentifier|_],\n\t\t\t\t\t\t\t [ Mode:[cat:typeof(SalientItemIdentifier)|_],\n\t\t\t\t\t\t\t\tobject:SalientItemIdentifier |_]\n\t\t\t\t\t\t\t ), \n\t\t\t\t\t\t [ Mode:[text:Text|_]|_], \n\t\t\t\t\t\t template(\'
  1. ~w
    \',[Text])\n\t\t\t\t\t\t )\n\t\t\t\t\t ), \n\t\t\t\t \'

\']\n\t\t\t\t )\n\t\t\t] \n\t ].\n\n'). clause_source_code(component(list, A, B, C, list_1), 'realizer-grammar.mug', '\n\n\ncomponent(list, _, Mode, FD, list_1) :-\n(Mode=screen_dynamic),\ndevice_model(screen_size, pda), % no radio buttons for the phone\n\t\t \n\t\t\t\t% Algorithm:\n\t\t\t\t% given: A list of objects, a task/field context description\n\t\t\t\t% For each object, show:\n\t\t\t\t% Value of the most salient (designated in type description) field\n\t\t\t\t% list of values: all entries of the object that could fill the task/field context description\n\t\n\tFD === [ \n\t\t list: ListFD, \n\t\t Mode:[cat:list,\n\t\t \t realized:1,\n\t\t\t text: concat([concat(foreach(foreach(unifyEach(ListFD, [Mode:[realized:1|_]]), \n\t\t\t\t\t\t\t [ salient:[FieldName|_],\n\t\t\t\t\t\t\t\tFieldName:SalientItemIdentifier|_],\n\t\t\t\t\t\t\t [ Mode:[cat:typeof(SalientItemIdentifier)|_],\n\t\t\t\t\t\t\t\tobject:SalientItemIdentifier |_]\n\t\t\t\t\t\t\t ), \n\t\t\t\t\t\t [ Mode:[text:Text|_]|_], \n\t\t\t\t\t\t template(\'
~w\',[Text])\n\t\t\t\t\t\t )\n\t\t\t\t\t ), \n\t\t\t\t \'

\']\n\t\t\t\t )\n\t\t\t] \n\t ].\n\t'). clause_source_code(component(list, A, B, C, list_1b), 'realizer-grammar.mug', '\t \ncomponent(list, _, Mode, FD, list_1b) :-\n\n\t(Mode=voice),\n\n\tFD === [ \n\t\t list: [FirstOfListFD|RemainderOfList], \n\t\t Mode:[ \tcat:list,\n\t\t \t realized:1,\n\t\t\t\ttext: \n\t\t concat([concat(foreach(foreach(unifyEach([FirstOfListFD], [Mode:[realized:1|_]]),\n\t\t\t\t\t\t [ salient:[FieldName|_],\n\t\t\t\t\t\t\t\tFieldName:ItemIdentifier\n\t\t\t\t\t\t |_], \n\t\t\t\t\t\t [ Mode:[cat:typeof(ItemIdentifier)|_], \n\t\t\t\t\t\t\tobject:ItemIdentifier|_]\n\t\t\t\t\t\t ), \n\t\t\t\t\t [Mode:[text:Text|_]|_], \n\t\t\t\t\t Text\n\t\t\t\t\t )),\n\t\t\t concat(foreach(foreach(unifyEach(RemainderOfList, [Mode:[realized:1|_]]),\n\t\t\t\t\t\t [ salient:[FieldName1|_],\n\t\t\t\t\t\t\t\tFieldName1:ItemIdentifier1\n\t\t\t\t\t\t |_], \n\t\t\t\t\t\t [ Mode:[cat:typeof(ItemIdentifier1)|_], \n\t\t\t\t\t\t\tobject:ItemIdentifier1|_]\n\t\t\t\t\t\t ), \n\t\t\t\t\t [Mode:[text:Text1|_]|_], \n\t\t\t\t\t concat([\' or \',Text1,\' \'])\n\t\t\t\t\t ))\n\t\t\t ])\n\t\t ]\n\t ].\n\n'). clause_source_code(component(list, A, screen_dynamic, B, list_2), 'realizer-grammar.mug', '\ncomponent(list, _, screen_dynamic, FD, list_2) :-\n\n/* Display the whole item, instead of just the salient elements */\n/* This displays it as a list of radio buttons */\n\t\t\t\t% Algorithm:\n\t\t\t\t% given: A list of objects, a task/field context description\n\t\t\t\t% For each object, show:\n\t\t\t\t% Value of the most salient (designated in type description) field\n\t\t\t\t% list of values: all entries of the object that could fill the task/field context description\n\tMode=screen_dynamic,\ndevice_model(screen_size, pda), % no radio buttons for the phone\n\n\tDisplayFD === [type: Type,\n\t\t Mode:[cat: Type,\n\t\t\t prefix:\'\']\n\t\t ],\n\n\tDisplayFD2 === [type: Type2,\n\t\t\tMode:[cat: Type2,\n\t\t\t prefix:\'\']\n\t\t ],\n\tTemplateFD === [Mode: [text: T1]],\n\tOutTemplateFD === template(\'
~w\',[T1]),\n\t\n\tFD === [ \n\t\t list: [FirstOfListFD|RemainderOfListFD],\n\t\t % If this is a list, for each item in the list,\n\t\t % get the cat of the item type\n\t\t % For each of these augmented items, unify it with the templatefd to\n\t\t % create the output fd\n\t\t % then concatenate them all together.\n\t\t Mode:[ cat:list,\n\t\t \t realized:1,\n\t\t\t\t text:\n\t\t\t\tconcat([concat(foreach(multiply(\n\t\t\t\t\t\t\t unifyEach([FirstOfListFD], [Mode:[realized:1]]),\n\t\t\t\t\t\t\t DisplayFD\n\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t TemplateFD,\n\t\t\t\t\t\t OutTemplateFD\n\t\t\t\t\t\t \n\t\t\t\t\t\t )),\n\t\t\t\t concat(foreach(multiply(\n\t\t\t\t\t\t\t unifyEach(RemainderOfListFD, [Mode:[realized:1]]),\n\t\t\t\t\t\t\t DisplayFD2\n\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t [Mode: [text: T2]],\n\t\t\t\t\t\t template(\'
~w\',[T2])\n\t\t\t\t\t\t \n\t\t\t\t\t\t ))])\n\t\t\t\t]].\n\n'). clause_source_code(component(list, A, B, C, list_2_voice), 'realizer-grammar.mug', '\n\ncomponent(list, _, Mode, FD, list_2_voice) :-\n/* Display the whole item, instead of just the salient elements */\n\t\t\t\t% Algorithm:\n\t\t\t\t% given: A list of objects, a task/field context description\n\t\t\t\t% For each object, show:\n\t\t\t\t% Value of the most salient (designated in type description) field\n\t\t\t\t% list of values: all entries of the object that could fill the task/field context description\n\tMode=voice,\n\t\n\tDisplayFD === [type: Type,\n\t\t Mode:[cat: Type,\n\t\t\t prefix:\'\']\n\t\t ],\n\n\tDisplayFD2 === [type: Type2,\n\t\t\tMode:[cat: Type2,\n\t\t\t prefix:\'\']\n\t\t ],\n\tTemplateFD === [Mode: [text: T1]],\n\tOutTemplateFD === T1,\n\t\n\tFD === [ \n\t\t list: [FirstOfListFD|RemainderOfListFD],\n\t\t % If this is a list, for each item in the list,\n\t\t % get the cat of the item type\n\t\t % For each of these augmented items, unify it with the templatefd to\n\t\t % create the output fd\n\t\t % then concatenate them all together.\n\t\t voice:[cat:list,\n\t\t \t realized:1,\n\t\t\t\t text:\n\t\t\t\tconcat([concat(foreach(multiply(\n\t\t\t\t\t\t\t \t unifyEach([FirstOfListFD], [Mode:[realized:1]]),\n\t\t\t\t\t\t\t DisplayFD\n\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t TemplateFD,\n\t\t\t\t\t\t OutTemplateFD\n\t\t\t\t\t\t \n\t\t\t\t\t\t )),\n\t\t\t\t concat(foreach(multiply(\n\t\t\t\t\t\t\t unifyEach(RemainderOfListFD, [Mode:[realized:1]]),\n\t\t\t\t\t\t\t DisplayFD2\n\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t [Mode: [text: T2]],\n\t\t\t\t\t\t concat([\' or \', T2, \' \'])\n\t\t\t\t\t\t \n\t\t\t\t\t\t ))])\n\t\t\t\t]].\n\n'). clause_source_code(component(disambiguate, A, B, C, disambiguate_1), 'realizer-grammar.mug', '\n\n\n\n% output the long version stuff via voice and on screen_dynamic\n\n/* disambiguate\n\nThis calls up a MUG component for the ActionType specified (such as\nfillfield, addtolist). The resulting structure is contained in the\nfullstring attribute (Target variable), so the template \'disambiguate\'\n(see template components below) can read it and insert it in its\ntemplate.\n\nThe structure of this is somewhat awkward, we might want to simplify\nthese things.\n\n \n */\n\ncomponent(disambiguate, _, Mode, FD, disambiguate_1) :- \n\tFD === [\n\t\t\n \t\ttype: CommonType, \n \t\tquantity:Card, \n \t\taction:Target=[\n \t\t\t\n\t\t\ttype: ActionType,\n\t\t\tMode: [\tcat: ActionType\n\t\t\t \n\t\t\t\t]\n\t\t ],\n \t \tMode:[ \t \tcat:disambiguate, \t\t \t\t\t\n\t\t\t\tfullstring:[\t\n\t\t\t\t\t\t\n\t\t\t\t\t\ttemplate: disambiguate,\n\t\t\t\t\t\tdeterminer:Card,\n\t\t\t\t\t\tfield_vp:Target,\n\t\t\t\t\t\ttype_np:CommonType,\n\t\t\t\t\t\t\n\t\t\t\t\t\ttext:Text, \n\t\t\t\t\t\tMode:[\tcat:template_mod,\n\t\t\t\t\t\t\tprefix: \'\',\n\t\t\t\t\t\t\ttext:Text]],\n\t\t\t\ttext:Text,\n\t\t\t\trealized:1\n\t\t ]\n\t ].\n\n'). clause_source_code(component(submit, A, voice, B, submit_1), 'realizer-grammar.mug', '\n\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n%%% Mode-specific Code Generation Level %%%%%%%%%%%%%%%%%%%%%%%%\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\n\n%%%%% HTML/VXML PRODUCING LEVEL %%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n%% SCREEN_DYNAMIC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n/* Creating various html components. */\n % the submit component is currently not used\ncomponent(submit, _, voice, FD, submit_1) :- \n\tFD === [ \n\t\t voice:[text:\' \', \n\t\t\trealized:0] \n\t ].\n\n'). clause_source_code(component(submit, A, screen_dynamic, B, submit_2), 'realizer-grammar.mug', '\ncomponent(submit, _, screen_dynamic, FD, submit_2) :-\n\tdevice_model(screen_size, pda),\nFD === [\n \t\tscreen_dynamic:[cat:submit,\n \t\trealized:1,\n\t\t text: \' \' ]].\n\n'). clause_source_code(component(submit, A, screen_dynamic, B, submit_3), 'realizer-grammar.mug', '\n\ncomponent(submit, _, screen_dynamic, FD, submit_3) :-\n\tdevice_model(screen_size, phone),\n\tFD === [ \n\t\t \n\t\t screen_dynamic:[\ttext:\'\', \n\t\t realized:1,\n\t\t\t\t\t\trealized:0\n\t\t\t\t\t]\n\t ].\n\t'). clause_source_code(component(empty, A, B, C, empty_1), 'realizer-grammar.mug', '\t \n\t \n\ncomponent(empty, _, Mode, FD, empty_1) :-\n\tFD === [\n\t\tMode:[\tcat:empty, text:\' \'] ].\n\n'). clause_source_code(component(optional_string, A, screen_dynamic, B, optional_string_1), 'realizer-grammar.mug', '\n\n\ncomponent(optional_string, _, screen_dynamic, FD, optional_string_1) :-\n\tFD === [\t\tstring: String, \n\t\t\t\tscreen_dynamic:[\n\t\t\t\t\tprefix:P,\n\t\t\t\t\trealized:1,\n\t\t\t\t\t\t text:template(\'~w~w\', [P,String]) ]],\n\tgiven(String),\n\tgiven(P).\n\n'). clause_source_code(component(optional_string, en-A, voice, B, optional_string_2), 'realizer-grammar.mug', '\n\t\t\t\t%Note: for now, we are not using VXML, so voice strings are output to html\n\ncomponent(optional_string, en-_, voice, FD, optional_string_2) :-\n\tFD === [\t\tstring:String, \n\t\t\t\tvoice:[\n\t\t\t\t prefix:P,\n\t\t\t\t realized:1,\n\t\t\t\t text:template(\'~w~w\', [P,String]) ]],\n\tgiven(String),\n\tgiven(P).\n\n'). clause_source_code(component(optional_string, A, B, C, optional_string_n), 'realizer-grammar.mug', '\n\t\t\t\t% null realization\ncomponent(optional_string, _, Mode, FD, optional_string_n) :-\n\tFD === [\t\t \n\t\t\t\t Mode:[ \trealized:0,\n\t\t\t\t\t\ttext: \'\']].\n\n'). clause_source_code(component(objlist, A, screen_dynamic, B, objlist_1), 'realizer-grammar.mug', '\n\ncomponent(objlist, _, screen_dynamic, FD, objlist_1) :-\n\tFD === [elements:Elem ], \n\tStart = \'\',\n\tListStart = \'

\',\n\tFD === [screen_dynamic:text: concat([ListStart, concat(foreach(Elem, [screen_dynamic:[text:Text|_]|_],concat([Start, Text, End]))), ListEnd])]. \n'). clause_source_code(component(objlist, A, voice, B, objlist_2), 'realizer-grammar.mug', '\n\ncomponent(objlist, _, voice, FD, objlist_2) :-\n\tFD === [ elements:Elem ], \n\tFD === [vxmllist: collect_lim(voice:text, Elem), \n\t\tvoice:[text:VXML2]],\n\tFD === [vxmllist: VXL], \n\t\t\t\t%getFunctional(or,ORString),\n\tORString = or,\n\tC === concat([concat(foreach(select(VXL, begin, end-1),X,concat([X, ORString]))),select(VXL, end, end)]),\n\tFD === [voice:text:[cat:string, string:C, text:VXML2]].\n\n'). clause_source_code(component(string, A, B, C, string_1), 'realizer-grammar.mug', '\n\n\n\n%% OBJECTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\ncomponent(string, _, Mode, FD, string_1) :- \n\tFD === [ string:SSS, Mode:[text:concat([SSS]),\n\t\t\t\t realized:1]].\n\n'). clause_source_code(component(predefined, A, B, C, predefined_1), 'realizer-grammar.mug', '\ncomponent(predefined, _, Mode, FD, predefined_1) :- \n\tFD === [ object:String, Mode:[text:concat([String]),\n\t\t\t\t realized:1 ]].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_p1), 'realizer-grammar.mug', '\n\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n%%% Language-specific stuff: Phrases, Lexicon %%%%%%%%%%%%%%% \n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Phrases\n% this is language-specific\n\n% called from the component \'disambiguate\'\n% ex: "Please choose the contact to send the e-mail to!"\ncomponent(template_mod, en-_, Mode, FD, template_mod_p1) :-\n\t\n% \tdebug_output([trying_template_mod_p1, fd(FD)]),\n\n\tFD === [\n\t\ttemplate: disambiguate,\n\t\tversion:long,\n\t\tdeterminer:Card,\n\t\tfield_vp:[\t\n\t\t\ttask:Task, \n\t\t\n\t\t\t\ttemplate: target,\n\t\t\t\tcardinality: Card, \n\t\t\t\t \n\t\t\t\tMode: [ text:TargetS, \n\t\t\t\t\t\trealized:1\n\t\t\t\t\t]\n\t\t\t\t],\n\t\ttype_np:CommonType,\n\t\tdeterminer_string:[\t\n\t\t\t\t\tMode:[cat: template_mod],\n\t\t\t\t\ttemplate: determiner,\n\t\t\t\t\tcardinality:Card,\n\t\t\t\t\ttext:CardS \t \t\n\t\t\t\t ], \n\t\ttype_string: [\n\t\t\t Mode:[cat: objtype, text:TypeS], \n\t\t\t objecttype:CommonType\t\t\t \n\t\t\t ],\n\t\ttext: template(\'Please choose ~w ~w to ~w!\', [CardS, TypeS, TargetS]),\n\t\trealized:1\n\t ].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_p2), 'realizer-grammar.mug', '\n% Shorter variant\n% "Choose the/some contact(s)!"\ncomponent(template_mod, en-_, Mode, FD, template_mod_p2) :-\n\tFD === [\n\t\ttemplate: disambiguate,\n\t\tversion:middle,\n\t\tdeterminer:Card, \n\t\ttype_np:CommonType,\n\t\tdeterminer_string:[\t\n\t\t\t\t\tMode:[cat: template_mod],\n\t\t\t\t\ttemplate: determiner,\n\t\t\t\t\tcardinality:Card,\n\t\t\t\t\ttext:CardS \t \t\n\t\t\t\t ], \n\t\ttype_string: [\n\t\t\t Mode:[cat: objtype,\n\t\t\t \t\t text:TypeS], \n\t\t\t objecttype:CommonType\n\t\t\t ],\n\t\ttext: template(\'Choose ~w ~w\', [CardS, TypeS]),\n\t\trealized:1\n\t ].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_p3), 'realizer-grammar.mug', '\n% Shortest variant: "Which one?"\ncomponent(template_mod, en-_, Mode, FD, template_mod_p3) :-\n\tFD === [\n\t\ttemplate: disambiguate,\n\t\tversion:short,\n\t\tdeterminer:one,\n\t\ttext: \'Which one?\',\n\t\trealized:1\n\t ].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_p4), 'realizer-grammar.mug', '\n% Shortest variant: "Choose several."\ncomponent(template_mod, en-_, Mode, FD, template_mod_p4) :-\n\tFD === [\n\t\ttemplate: disambiguate,\n\t\tversion:short,\n\t\tdeterminer:some,\n\t\ttext: \'Choose several.\',\n\t\trealized:1\n\t ].\n\n'). clause_source_code(component(confirm_mod, en-A, B, C, confirm_mod_2), 'realizer-grammar.mug', '\n\n% Confirmation\n% "Do you want to send the e-mail to Kerry?"\n\ncomponent(confirm_mod, en-_, Mode, FD, confirm_mod_2) :- \n\tFD === [ \n\t\t action:[Mode: [realized:0]], \n\t\t Mode:[\trealized:1, \n\t\t\ttext: \'Confirm? \']\n\t ].\n\n'). clause_source_code(component(confirm_mod, en-A, B, C, confirm_mod_1), 'realizer-grammar.mug', '\ncomponent(confirm_mod, en-_, Mode, FD, confirm_mod_1) :- \n\tFD === [ \n\t\t action:[\n\t\t\t type:AT, \n\t\t\t Mode:[cat:AT,\n\t\t\t\trealized:1,\n\t\t\t\tsynrole:inf_vp, \n\t\t\t\ttext:TaskText]\n\t\t\t\t], \n\t\t Mode:[realized:1,\n\t\t\ttext: template(\'Do you want ~w? \',[TaskText])\n\t\t ]\n\t ].\t\t'). clause_source_code(component(confirm_mod, en-A, B, C, confirm_mod_3), 'realizer-grammar.mug', '\t\t\n\n\ncomponent(confirm_mod, en-_, Mode, FD, confirm_mod_3) :- \n\tFD === [ \n\t\t action:[task: [type:TaskType,\n\t\t\t\t Mode: [ cat: TaskType,\n\t\t\t\t\t realized:1,\n\t\t\t\t\t synrole:sentence,\n\t\t\t\t\t text:Text ]\n\t\t\t\t ]], \n\t\t Mode:[realized:1,\n\t\t\ttext: template(\'~w? \',[Text])\n\t\t ]\n\t ].\t\t'). clause_source_code(component(explain_askinfo, en-A, B, C, template_mod_ai2), 'realizer-grammar.mug', '\t\t\t\n\n% askinfo stuff\n\n/* This has been removed for usability. */\n\n%component(explain_askinfo, en-_, Mode, FD, template_mod_ai1) :-\n%\tFD === [\n%\t\texperience: novice,\n%\t\tMode:[ \n%\t\t text: \'VPA needs additional information to complete the task:\',\n%\t\t realized:1]\n%\t ].\n\ncomponent(explain_askinfo, en-_, Mode, FD, template_mod_ai2) :-\n\tFD === [\n\t\texperience:expert,\n\t\tMode:[text: \'\', realized:0]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_1_short), 'realizer-grammar.mug', '\n\n% a single task field is to be modified.\n% there are components for the different actions, such as addtolist or deletefromlist.\n% these are tied to the scope specifications\n\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_1_short) :-\n\t(Scope=task/email/to),\n\tFD === [ \t experience:expert,\n\t\t\t action: [\ttype: \'addtolist\',\n \t\t\t\tscope: [Scope],\n\t\t\t\t\tMode:[ realized:1]],\n\t\t\t Mode:[text: \'To whom? \',\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_1_short_cc), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_1_short_cc) :-\n\t(Scope=task/email/cc),\n\tFD === [ \t experience:expert,\n\t\t\t action: [\ttype: \'addtolist\',\n \t\t\t\tscope: [Scope],\n\t\t\t\t\tMode:[ realized:1]],\n\t\t\t Mode:[text: \'CC whom? \',\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_1_short_bcc), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_1_short_bcc) :-\n\t(Scope=task/email/bcc),\n\tFD === [ \t experience:expert,\n\t\t\t action: [\ttype: \'addtolist\',\n \t\t\t\tscope: [Scope],\n\t\t\t\t\tMode:[ realized:1]],\n\t\t\t Mode:[text: \'BCC whom? \',\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_2_long), 'realizer-grammar.mug', '\n\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_2_long) :-\n\t(Scope=task/email/to),\n\tFD === [ \n\t\t action: [\ttype: \'addtolist\',\n\t\t\t\tscope: [Scope],\n\t\t\t\ttask: [\n\t\t\t\t\t\temail: EmailSem,\n\t\t\t\t\t\temail_refexp: [ sem: EmailSem,\n\t\t\t\t\t\t\t Mode: [cat: refexp,\t \n\t\t\t\t\t\t\t\t\tcase:acc,\n\t\t\t\t\t\t\t\tfunction:normal,\n\t\t\t\t\t\t\t\tprefix: \'\',\n\t\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\t\ttext: Email\n\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t],\n\t\t\t\tMode:[ realized:1]], \n\t\t Mode:[text: template(\'Who do you want to send ~w to? \', [Email]),\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_2_long_cc), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_2_long_cc) :-\n\t(Scope=task/email/cc),\n\tFD === [ \n\t\t action: [\ttype: \'addtolist\',\n\t\t\t\tscope: [Scope],\n\t\t\t\ttask: [\n\t\t\t\t\t\temail: EmailSem,\n\t\t\t\t\t\temail_refexp: [ sem: EmailSem,\n\t\t\t\t\t\t\t Mode: [cat: refexp,\t \n\t\t\t\t\t\t\t\t\tcase:acc,\n\t\t\t\t\t\t\t\tfunction:normal,\n\t\t\t\t\t\t\t\tprefix: \'\',\n\t\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\t\ttext: Email\n\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t],\n\t\t\t\tMode:[ realized:1]], \n\t\t Mode:[text: template(\'Who do you want to cc ~w to? \', [Email]),\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_2_long_bcc), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_2_long_bcc) :-\n\t(Scope=task/email/bcc),\n\tFD === [ \n\t\t action: [\ttype: \'addtolist\',\n\t\t\t\tscope: [Scope],\n\t\t\t\ttask: [\n\t\t\t\t\t\temail: EmailSem,\n\t\t\t\t\t\temail_refexp: [ sem: EmailSem,\n\t\t\t\t\t\t\t Mode: [cat: refexp,\t \n\t\t\t\t\t\t\t\t\tcase:acc,\n\t\t\t\t\t\t\t\tfunction:normal,\n\t\t\t\t\t\t\t\tprefix: \'\',\n\t\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\t\ttext: Email\n\t\t\t\t\t\t\t\t ]\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t],\n\t\t\t\tMode:[ realized:1]], \n\t\t Mode:[text: template(\'Who do you want to bcc ~w to? \', [Email]),\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_6_fallback), 'realizer-grammar.mug', '\n/* This has been removed for usability. */\n% %component(ui_modfield, en-_, Mode, FD, ui_modfield_5_fallback) :-\n% %%\tFD === [ \n% \t\t action: [\n% \t\t\t\ttype: \'addtolist\',\n% \t\t\t\tscope: [Field],\n% \t\t\t task: [contexttype: KBType],\n% \t\t\t\tMode:[realized: 1]],\n% \t\t objtype: [objecttype: KBType,\n% \t\t\t Mode: [cat: objtype,\n% \t\t\t\t text: ObjTypeText,\n% \t\t\t\t realized: 1]\n% \t\t\t ],\n% \t\t fieldtext: [\n% \t\t\t scope: [Field],\n% \t\t\t Mode:[ \tcat: fieldtext,\n% \t\t\t\t\ttext: FieldText,\n% \t\t\t\t\trealized: 1]\n% \t\t\t ], \t\t\n% \t\t Mode:[ text: template(\'Please fill in the ~w of the ~w. \', [FieldText, ObjTypeText] )]\n% ].\n/* This has been removed for usability. */\n% component(ui_modfield, en-_, Mode, FD, ui_modfield_6_fallback) :-\n% \tFD === [ \n% \t\t action: [\n% \t\t\t\ttype: \'fillfield\',\n% \t\t\t\tscope: [Field],\n% \t\t\t task: [contexttype: KBType],\n% \t\t\t\tMode:[realized: 1]],\n% \t\t objtype: [objecttype: KBType,\n% \t\t\t Mode: [cat: objtype,\n% \t\t\t\t text: ObjTypeText,\n% \t\t\t\t realized: 1]\n% \t\t\t ],\n% \t\t fieldtext: [\n% \t\t\t scope: [Field],\n% \t\t\t Mode:[ \tcat: fieldtext,\n% \t\t\t\t\ttext: FieldText,\n% \t\t\t\t\trealized: 1]\n% \t\t\t ], \t\t\n% \t\t Mode:[ text: template(\'Please fill in the ~w of the ~w. \', [FieldText, ObjTypeText] )]\n% ].\n\n\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_6_fallback) :-\n\tFD === [ \n\t\t action: [\n\t\t\t type: Type,\n\t\t\t Mode: [\tcat: Type,\n\t\t\t\t\ttext: ActionText,\n\t\t\t\t\trealized:1]\t\n\t\t\t ], \t\t\n\t\t Mode:[ text: template(\'What do you want ~w? \', [ActionText] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_subject), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_subject) :-\n\tFD === [ \n\t\t action: [\n\t\t\t scope: Fields,\n\t\t\t fieldtext: [\n\t\t\t\t\t scope: Fields, % [_/email/subject], \n\t\t\t\t\t Mode:[cat:fieldtext, \n\t\t\t\t\t\ttext: FieldText,\n\t\t\t\t\t\trealized:1]\n\t\t\t\t ]],\n\t\t Mode:[ text: template(\'What\\\'s the ~w?\', [FieldText] ),\n\t\t\t realized:1]\n ].\n/'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_body), 'realizer-grammar.mug', '/*\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_subject_long) :-\n\tFD === [ \n\t\t action: [\n\t\t\t scope: Fields,\n\t\t\t fieldtext: [\n\t\t\t\t\t scope: [_/email/subject], \n\t\t\t\t\t Mode:[cat:fieldtext,\n\t\t\t\t\t\ttext: FieldText,\n\t\t\t\t\t\trealized:1]\n\t\t\t\t ]],\n\t\t Mode:[ text: template(\'What\\\'s the ~w of the email?\', [FieldText] ),\n\t\t\t realized:1]\n ].\n */\n\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_body) :-\n(Mode=voice),\n\tFD === [ \n\t\t action: [\n\t\t\t scope: Fields,\n\t\t\t fieldtext: [\n\t\t\t\t\t scope: [_/email/body], \n\t\t\t\t\t Mode:[cat:fieldtext,\n\t\t\t\t\t\ttext: FieldText,\n\t\t\t\t\t\trealized:1]\n\t\t\t\t \t],\n\t\t\t\t Mode: [ realized:1 ]\n\t\t\t\t ],\n\t\t Mode:[ text: template(\'Please speak the body of the message now.\', [FieldText] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_body_2), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_body_2) :-\n(Mode=voice),\n\tFD === [ \n\t\t action: [\n\t\t\t scope: Fields,\n\t\t\t fieldtext: [\n\t\t\t\t\t scope: [_/email/body], \n\t\t\t\t\t Mode:[cat:fieldtext,\n\t\t\t\t\t\ttext: FieldText,\n\t\t\t\t\t\trealized:1]\n\t\t\t\t ],\n\t\t\t\t \n\t\t\t\t Mode: [ realized:1 ]\n\t\t\t\t ],\n\t\t Mode:[ text: template(\'Speak your message now.\', [FieldText] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(ui_modfield, en-A, B, C, ui_modfield_body_3), 'realizer-grammar.mug', '\ncomponent(ui_modfield, en-_, Mode, FD, ui_modfield_body_3) :-\n\tFD === [ \n\t\t action: [\n\t\t\t scope: Fields,\n\t\t\t fieldtext: [\n\t\t\t\t\t scope: [_/email/body], \n\t\t\t\t\t Mode:[cat:fieldtext,\n\t\t\t\t\t\ttext: FieldText,\n\t\t\t\t\t\trealized:1]\n\t\t\t\t ],\n\t\t\t\t \n\t\t\t\t Mode: [ realized:1 ]\n\t\t\t\t ],\n\t\t Mode:[ text: template(\'Give the body of the message now.\', [FieldText] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(addtolist, en-A, B, C, action_1), 'realizer-grammar.mug', '\n\n% the following components cover actions on task fields,\n% and they are more generic than the previous ones\n\ncomponent(addtolist, en-_, Mode, FD, action_1) :-\n\tFD === \n\t[\n\t scope: Fields,\n\t user_intention: User_Intention,\n\t fieldcontent: [scope: Fields,\n\t\t\tcontent_source: User_Intention,\n\t\t\tMode: [cat:fieldcontent,\n\t\t\t text: Content,\n\t\t\t realized:1]], \n\t fieldtext: [\n\t\t scope: Fields,\n\t\t Mode: [cat:fieldtext,\n\t\t\t text: FieldText,\n\t\t\t realized:1]],\n\t Mode: [text: template(\'to add ~w to the ~w\', [Content, FieldText]),\n\t\trealized:1]\n\t].\n\n'). clause_source_code(component(deletefromlist, en-A, B, C, action_2), 'realizer-grammar.mug', '\ncomponent(deletefromlist, en-_, Mode, FD, action_2) :-\n\tFD === \n\t[\n\t scope: Fields,\n\t fieldtext: [\n\t\t scope: Fields,\n\t\t Mode: [cat:fieldtext,\n\t\t\t text: FieldText,\n\t\t\t realized:1]],\n\t Mode: [text: template(\'to remove from the ~w\', [FieldText]),\n\t\trealized:1]\n\t].\n\n'). clause_source_code(component(fillfield, en-A, B, C, action_3), 'realizer-grammar.mug', '\ncomponent(fillfield, en-_, Mode, FD, action_3) :-\n\tFD === \n\t[\n\t scope: Fields,\n\t fieldtext: [\n\t\t scope: Fields,\n\t\t Mode:[cat:fieldtext,\n\t\t\t text: FieldText,\n\t\t\t realized:1]\n\t\t ],\n\t Mode: [text: template(\'to enter as the ~w\', [FieldText]),\n\t\trealized:1]\n\t].\n\n'). clause_source_code(component(review, en-A, B, C, action_review), 'realizer-grammar.mug', '\ncomponent(review, en-_, Mode, FD, action_review) :-\n\tFD === \n\t[\n\t scope: Fields,\n\t fieldtext: [\n\t\t scope: Fields,\n\t\t Mode:[cat:fieldtext,\n\t\t\t text: FieldText,\n\t\t\t realized:1]],\n\t Mode: [text: template(\'to review\', [FieldText]),\n\t\trealized:1]\n\t].\n\n'). clause_source_code(component(task, en-A, B, C, action_task_4), 'realizer-grammar.mug', '\n\n% the task component realizes an infinite verbal phrase that\n% expresses a task, such as \'to send the e-mail\'\ncomponent(task, en-_, Mode, FD, action_task_4) :-\n\tFD === \n\t[ \ttask: [\n\t\t\t\ttype:TaskType,\n\t\t\t\tMode: [\tcat:TaskType,\n\t\t\t\t\t\trealized: 1, \n\t\t\t\t\tsynrole:inf_vp,\n\t\t\t\t\t\ttext: Text\n\t\t\t\t\t]\n\t\t\t],\n\t\tMode: [realized: 1, text: concat([\'to \', Text])]\n\t].\n\n'). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_1), 'realizer-grammar.mug', '\n% the fieldtext templates are used in more generic variants that play with the\n% fields. For example: "what would you like to [delete] from the [recipients list]?"\n\ncomponent(fieldtext, en-_, Mode, FD, fieldtext_1) :-\n\tFD === [\n\t\tscope:[_/email/to],\n\t\tMode:[ text: \'recipients list\',\n\t\t realized:1]\n\t ].\nc'). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_1b), 'realizer-grammar.mug', 'component(fieldtext, en-_, Mode, FD, fieldtext_1b) :-\n\tFD === [\n\t\tscope:[_/email/cc],\n\t\tMode:[ text: \'\\"carbon-copy\\" list\',\n\t\t realized:1]\n\t ].\t '). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_1c), 'realizer-grammar.mug', ' \ncomponent(fieldtext, en-_, Mode, FD, fieldtext_1c) :-\n\tFD === [\n\t\tscope:[_/email/bcc],\n\t\tMode:[ text: \'\\"blind-copy\\" list\',\n\t\t realized:1]\n\t ].\t '). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_2), 'realizer-grammar.mug', ' \ncomponent(fieldtext, en-_, Mode, FD, fieldtext_2) :-\n\tFD === [ \n\t\t scope:[_/email/from],\n\t\t Mode:[ text: \'\\"from\\" field\',\n\t\t\trealized:1]\n\t ].\nc'). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_3), 'realizer-grammar.mug', 'component(fieldtext, en-_, Mode, FD, fieldtext_3) :-\n\tFD === [ \n\t\t scope:[_/email/subject],\n\t\t Mode:[ text: \'subject\',\n\t\t\trealized:1]\n\t ].\n\n'). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_3b), 'realizer-grammar.mug', '\ncomponent(fieldtext, en-_, Mode, FD, fieldtext_3b) :-\n\tFD === [ \n\t\t scope:[_/email/body],\n\t\t Mode:[ text: \'body\',\n\t\t\trealized:1]\n\t ].\nc'). clause_source_code(component(fieldtext, en-A, B, C, fieldtext_4), 'realizer-grammar.mug', 'component(fieldtext, en-_, Mode, FD, fieldtext_4) :-\n\tFD === [ \n\t\t scope:[_/email/to,_/email/cc,_/email/bcc],\n\t\t Mode:[ text: \'recipients list\',\n\t\t\trealized:1]\n\t ]. '). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_1), 'realizer-grammar.mug', ' \t\t \t\t\n\n\t\t\t\t% needs to be extended\n\n\n% the fieldcontent templates are used in more generic variants that play with the\n% fields. For example: "Do you want to add John Jones to the recipients list?"\n% Several of these could probably be collapsed together.\ncomponent(fieldcontent, en-_, Mode, FD, fieldcontent_1) :-\n\tFD === [\n\t\tscope:[user_intention/email/to],\n\t\tcontent_source: [ email: [ to: [type:Type,\n\t\t\t\t\t\tMode: [cat:Type,\n\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\ttext:Content]]]],\n\t\tMode:[ text: Content,\n\t\t realized:1]\n\t ].\nc'). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_1b), 'realizer-grammar.mug', 'component(fieldcontent, en-_, Mode, FD, fieldcontent_1b) :-\n\tFD === [\n\t\tscope:[user_intention/email/cc],\n\t\tcontent_source: [ email: [ cc: [ type: Type,\n\t\t\t\t\t\t Mode: [cat:Type,\n\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\ttext:Content]]]],\n\t\tMode:[ text: Content,\n\t\t realized:1]\n\t ].\t '). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_1c), 'realizer-grammar.mug', ' \ncomponent(fieldcontent, en-_, Mode, FD, fieldcontent_1c) :-\n\tFD === [\n\t\tscope:[user_intention/email/bcc],\n\t\tcontent_source: [ email: [ bcc: [type: Type,\n\t\t\t\t\t\t Mode: [cat:Type,\n\t\t\t\t\t\t\trealized:1,\n\t\t\t\t\t\t\ttext:Content]]]],\n\t\tMode:[ text: Content,\n\t\t realized:1]\n\t ].\t '). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_2), 'realizer-grammar.mug', ' \ncomponent(fieldcontent, en-_, Mode, FD, fieldcontent_2) :-\n\tFD === [ \n\t\t scope:[user_intention/email/from],\n\t\t content_source: [ email: [ from: [type:Type,\n\t\t\t\t\t\t Mode: [cat:Type,\n\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t text:Content]]]],\n\t\tMode:[ text: Content,\n\t\t\trealized:1]\n\t ].\nc'). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_3), 'realizer-grammar.mug', 'component(fieldcontent, en-_, Mode, FD, fieldcontent_3) :-\n(Mode=voice),\n\tFD === [ \n\t\t scope:[user_intention/email/subject],\n\t\t content_source: [ email: [ subject: [\n\t\t\t\t\t\t Mode: [cat:content,\n\t\t\t\t\t\t\t prefix: \'\',\n\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t text:Content]]]],\n\t\t Mode:[ text: template(\'~w\', [Content]),\n\t\t\trealized:1]\n\t ].\n\n'). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_3b), 'realizer-grammar.mug', '\ncomponent(fieldcontent, en-_, Mode, FD, fieldcontent_3b) :-\n(Mode=screen_dynamic),\n\tFD === [ \n\t\t scope:[user_intention/email/subject],\n\t\t content_source: [ email: [ subject: [\n\t\t\t\t\t\t Mode: [cat:content,\n\t\t\t\t\t\t\t prefix: \'\',\n\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t text:Content]]]],\n\t\t Mode:[ text: template(\'~w\', [Content]),\n\t\t\trealized:1]\n\t ].\nc'). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_4), 'realizer-grammar.mug', 'component(fieldcontent, en-_, Mode, FD, fieldcontent_4) :-\n(Mode=voice),\n\tFD === [ \n\t\t scope:[user_intention/email/body],\n\t\t content_source: [ email: [ body: [\n\t\t\t\t\t\t Mode: [cat:content,\n\t\t\t\t\t\t\t prefix: \'\',\n\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t text:Content]]]],\n\t\t Mode:[ text: template(\'~w\', [Content]),\n\t\t\trealized:1]\n\t ].\n\n'). clause_source_code(component(fieldcontent, en-A, B, C, fieldcontent_4b), 'realizer-grammar.mug', '\ncomponent(fieldcontent, en-_, Mode, FD, fieldcontent_4b) :-\n(Mode=screen_dynamic),\n\tFD === [ \n\t\t scope:[user_intention/email/body],\n\t\t content_source: [ email: [ body: [\n\t\t\t\t\t\t Mode: [cat:content,\n\t\t\t\t\t\t\t prefix: \'\',\n\t\t\t\t\t\t\t realized:1,\n\t\t\t\t\t\t\t text:Content]]]],\n\t\t Mode:[ text: template(\'~w\', [Content]),\n\t\t\trealized:1]\n\t ].\n\n'). clause_source_code(component(fieldcontent, en-A, B, C, fieldtext_5), 'realizer-grammar.mug', '\ncomponent(fieldcontent, en-_, Mode, FD, fieldtext_5) :-\n/* If task is in the scope, we\'re confirming the whole thing */\n\tFD === [ \n\t\t scope:[task/_/_],\n\t\t Mode:[ text: \'\',\n\t\t\trealized:1]\n\t ].\n\n'). clause_source_code(component(explain_error, en-A, B, C, template_mod_ai1), 'realizer-grammar.mug', '\n\n%Error stuff\ncomponent(explain_error, en-_, Mode, FD, template_mod_ai1) :-\n\tFD === [\n\t\t\n\t\tMode:[ \n\t\t text: \'An error has occurred:\',\n\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(error_text, en-A, B, C, error_text_1_short), 'realizer-grammar.mug', '\ncomponent(error_text, en-_, Mode, FD, error_text_1_short) :-\n\tFD === [ \t \n\t\t\t action: [\ttype: \'addtolist\',\n \t\t\t\tscope: [task/email/to,task/email/cc,task/email/bcc],\n\t\t\t\t\tMode:[ realized:1]],\n\t\t\t Mode:[text: \'Cannot add name.\',\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(error_text, en-A, B, C, error_text_2_long), 'realizer-grammar.mug', '\n\ncomponent(error_text, en-_, Mode, FD, error_text_2_long) :-\n\tFD === [ \n\t\t action: [\ttype: \'addtolist\',\n\t\t\t\tscope: [task/email/to,task/email/cc,task/email/bcc],\n\t\t\t\tMode:[ realized:1]], \n\t\t Mode:[text: template(\'Cannot add *name* to the recipient list.\', [] ),\n\t\t\t realized:1]\n\t ].\n\n'). clause_source_code(component(error_text, en-A, B, C, error_text_5_fallback), 'realizer-grammar.mug', '\n\n\ncomponent(error_text, en-_, Mode, FD, error_text_5_fallback) :-\n\tFD === [ \n\t\t action: [\n\t\t\t\ttype: \'addtolist\',\n\t\t\t\tscope: [Field],\n\t\t\t task: [contexttype: KBType],\n\t\t\t\tMode:[realized: 1]],\n\t\t objtype: [objecttype: KBType,\n\t\t\t Mode: [cat: objtype,\n\t\t\t\t text: ObjTypeText,\n\t\t\t\t realized: 1]\n\t\t\t ],\n\t\t fieldtext: [\n\t\t\t scope: [Field],\n\t\t\t Mode:[ \tcat: fieldtext,\n\t\t\t\t\ttext: FieldText,\n\t\t\t\t\trealized: 1]\n\t\t\t ], \t\t\n\t\t Mode:[ text: template(\'Cannot add the ~w of the ~w.\', [FieldText, ObjTypeText] )]\n ].\n\n'). clause_source_code(component(error_text, en-A, B, C, error_text_6_fallback), 'realizer-grammar.mug', '\n\ncomponent(error_text, en-_, Mode, FD, error_text_6_fallback) :-\n\tFD === [ \n\t\t action: [\n\t\t\t type: Type,\n\t\t\t Mode: [\tcat: Type,\n\t\t\t\t\ttext: ActionText,\n\t\t\t\t\trealized:1]\t\n\t\t\t ], \t\t\n\t\t Mode:[ text: template(\'Cannot ~w.\', [ActionText] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(error_text, en-A, B, C, error_text_7_fallback), 'realizer-grammar.mug', '\ncomponent(error_text, en-_, Mode, FD, error_text_7_fallback) :-\n\tFD === [ \n\t\t Mode:[ text: template(\' Unknown error.\', [] ),\n\t\t\t realized:1]\n ].\n\n'). clause_source_code(component(send_email, en-A, B, C, task_mod_send1s), 'realizer-grammar.mug', '\n\n%%%%%%%%%%%%%%%%%%%%\n%%% TASKS\n%%% verbal phrase (infinitive form) with complements\t\t \n\n% the following components are like the fillfield components as they\n% describe a task. However, they cover whole tasks, not just single\n% properties that are to be modified or confirmed.\n\n% Usually, they are fed through the \'task\' component to form an\n% infinite verbal phrase\n\n% Example: \'send the email\'\n\n% currently used by confirmation components\n \n%em\n%Changed the component for send_email.\n \n\n \ncomponent(send_email, en-_, Mode, FD, task_mod_send1s) :- \n \n\tFD === [ polarity:positive,\n\t\t email:EmailSem=[to: ToSem,\n\t\t\tobjectid: ThisEmailIndex,\n\t\t\tcentering:[current:[cp:1],\n\t\t\t\t utterance:[cp:ThisEmailIndex]\n\t\t\t\t ]\n\t\t ],\n\t\t email_refexp: [ sem: EmailSem,\n\t\t\t\t Mode: [cat: refexp,\t \n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'\',\n\t\t\t\t\trealized:1,\n\t\t\t\t\ttext: Email\n\t\t\t\t ]\n\t\t\t ],\n\t\t to_refexp: [sem: ToSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'to\',\n\t\t\t\t text: To\n\t\t\t\t ]\n\t\t\t ], \n\t\t scope: [task/email],\n\t\t Mode:[realized: 1,\n\t\t synrole:sentence,\n\t\t text: template(\'Send ~w ~w\', [Email, To]) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(send_email, en-A, B, C, task_mod_send2), 'realizer-grammar.mug', '\n\ncomponent(send_email, en-_, Mode, FD, task_mod_send2) :- \n/* to confirm that user wants to send a new email */\n\tFD === [ scope: [user_intention/email],\n\t\t Mode:[realized: 1,\n\t\t synrole:inf_vp, \n\t\t text: template(\' send email\', []) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(reply_email, en-A, B, C, task_mod_reply1), 'realizer-grammar.mug', '\n\n%em\ncomponent(reply_email, en-_, Mode, FD, task_mod_reply1) :- \n\n\tFD === [email: EmailSem],\n\tFD === [\n\t\tpolarity:positive,\n\t\temail:[\n\t\t from:FromSem,\n\t\t to:ToSem\n\t\t ],\n\t\t email_refexp: [ sem: EmailSem,\n\t\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'\',\n\t\t\t\t\ttext: Email\n\t\t\t\t ]\n\t\t\t ],\n\t\t from_refexp: [sem:FromSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'originally from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]\n\t\t\t ],\n\t\t to_refexp: [sem: ToSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]\n\t\t\t ],\n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:inf_vp, \n\t\t text: template(\' reply to ~w ~w ~w\', [Email, From, To]) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(reply_email, en-A, B, C, task_mod_reply1s), 'realizer-grammar.mug', '\n\ncomponent(reply_email, en-_, Mode, FD, task_mod_reply1s) :- \n\n\tFD === [email: EmailSem],\n\tFD === [\n\t\tpolarity:positive,\n\t\temail:[\n\t\t from:FromSem,\n\t\t to:ToSem\n\t\t ],\n\t\t email_refexp: [ sem: EmailSem,\n\t\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'\',\n\t\t\t\t\ttext: Email\n\t\t\t\t ]\n\t\t\t ],\n\t\t from_refexp: [sem:FromSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'originally from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]\n\t\t\t ],\n\t\t to_refexp: [sem: ToSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]\n\t\t\t ],\n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:sentence,\n\t\t text: template(\'Reply to ~w ~w ~w\', [Email, From, To]) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(deleteemail, en-A, B, C, task_mod_del1), 'realizer-grammar.mug', '\n\t\n %em\ncomponent(deleteemail, en-_, Mode, FD, task_mod_del1) :- \n\n\tFD === [\n\t\tcat:deleteemail,\n\t\tpolarity:positive,\n\t\temail:EmailSem=[\n\t\t from:FromSem,\n\t\t to:ToSem\n\t\t ],\n\t\temail_refexp: [sem:EmailSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'\',\n\t\t\t\t text: Email\n\t\t\t\t ]],\n\t\tfrom_refexp:[sem:FromSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]],\n\t\tto_refexp:[sem:ToSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]],\n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:inf_vp, \n\t\t text: template(\' delete ~w ~w ~w\', [Email,From, To]) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(deleteemail, en-A, B, C, task_mod_del1s), 'realizer-grammar.mug', '\ncomponent(deleteemail, en-_, Mode, FD, task_mod_del1s) :- \n\tFD ===[email: EmailSem],\n\tFD === [\n\t\tcat:deleteemail,\n\t\tpolarity:positive,\n\t\temail:[\n\t\t from:FromSem,\n\t\t to:ToSem\n\t\t ],\n\t\temail_refexp: [sem:EmailSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'\',\n\t\t\t\t text: Email\n\t\t\t\t ]],\n\t\tfrom_refexp:[sem:FromSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]],\n\t\tto_refexp:[sem:ToSem,\n\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t prefix: \'to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]],\n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:sentence,\n\t\t text: template(\'Delete ~w ~w ~w\', [Email,From, To]) \n\t\t ]\n\t ].\n\n'). clause_source_code(component(forward_email, en-A, B, C, task_mod_forward1), 'realizer-grammar.mug', '\n%em\ncomponent(forward_email, en-_, Mode, FD, task_mod_forward1) :- \n\n\tFD === [ \t\t\t\n\t\tpolarity:positive,\n\t\temail:EmailSem=[\n\t\t\tfrom:FromSem,\n\t\t\tto:ToSem\n\t\t\t\t\t\n\t\t\t],\n\t\temail_refexp:[ sem: EmailSem,\n\t\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'\',\n\t\t\t\t\ttext: Email\n\t\t\t\t ]\n\t\t\t ],\n\t\t from_refexp: [sem:FromSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]\n\t\t\t ],\n\t\t to_refexp: [sem: ToSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'originally to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]\n\t\t\t ],\n\t \n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:inf_vp, \n\t\t text: template(\' forward ~w ~w ~w\', [Email, From, To]) \n\t\t\t\t\t ]\n\t ].\n\n'). clause_source_code(component(forward_email, en-A, B, C, task_mod_forward1s), 'realizer-grammar.mug', '\n\n%em\ncomponent(forward_email, en-_, Mode, FD, task_mod_forward1s) :- \n\tFD === [email:EmailSem\n\t ],\n\tFD === [ \t\t\t\n\t\tpolarity:positive,\n\t\temail:[\n\t\t\tfrom:FromSem,\n\t\t\tto:ToSem\n\t\t\t\t\t\n\t\t\t],\n\t\temail_refexp:[ sem: EmailSem,\n\t\t\t\t Mode: [cat: refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix:\'\',\n\t\t\t\t\ttext: Email\n\t\t\t\t ]\n\t\t\t ],\n\t\t from_refexp: [sem:FromSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'from\',\n\t\t\t\t\ttext: From\n\t\t\t\t ]\n\t\t\t ],\n\t\t to_refexp: [sem: ToSem,\n\t\t\t Mode: [cat:refexp,\n\t \t\tcase:acc,\n\t\t\t\t\tfunction:normal,\n\t\t\t\t\tprefix: \'originally to\',\n\t\t\t\t\ttext: To\n\t\t\t\t ]\n\t\t\t ],\n\t \n\t\tMode:[\n\t\t realized:1, \n\t\t synrole:sentence,\n\t\t text: template(\'Forward ~w ~w ~w\', [Email, From, To]) \n\t\t\t\t\t ]\n\t ].\n\n'). clause_source_code(component(task, en-A, B, C, task_mod_general1), 'realizer-grammar.mug', '\n/* ==============================================================\n\n \t\tACTION TYPES\t\t\n\n*/\t \n\t \n\n\ncomponent(task, en-_, Mode, FD, task_mod_general1) :- \n\t(Mode=screen_dynamic;Mode=voice),\n\t\t\t\t%(Task/Text=send_email/\'send the e-mail\'; \n\t\t\t\t% Task/Text=reply_email/\'reply to the e-mail\'; \n\t\t\t\t% Task/Text=forward_email/\'forward the e-mail\'),\n\tFD === [ \t \n\t\t\t \n\t\t\t task: [scope: [],\n\t\t\t\tMode: [text:Text]], \n\t\t\t scope: [],\n\t\t\t Mode:[\tcat:task,\n\t\t\t\trealized:0, \n\t\t\t\ttext: Text ]\n\t ].\n\n'). clause_source_code(component(A, en-B, C, D, task_mod_general2), 'realizer-grammar.mug', '\ncomponent(Task, en-_, Mode, FD, task_mod_general2) :- \n\t(Mode=screen_dynamic;Mode=voice),\t\n\t(Task=send_email; Task=reply_email; Task=forward_email),\n\t(Fields/Text=[task/email/cc]/\'cc on your e-mail\'; \n\t Fields/Text=[task/email/bcc]/\'cc on your e-mail\'; \n\t Fields/Text=[attachments]/\'attach to your e-mail\'),\n\tFD === [ \t \n\t\t\t \n\t\t\t scope: Fields,\n\t\t\t Mode:[\tcat:Task,\n\t\t\t\trealized:0, \n\t\t\t\ttext: Text ]\n\t ].\n\n'). clause_source_code(component(A, en-B, C, D, task_mod_general3), 'realizer-grammar.mug', '\n\n\ncomponent(Task, en-_, Mode, FD, task_mod_general3) :- \n\t(Mode=screen_dynamic;Mode=voice),\n\t(Task=send_email; Task=reply_email; Task=forward_email),\n\tFD === [ \t \n\t\t\t \n\t\t\t Mode:[\tcat:Task,\n\t\t\t\trealized:0, \n\t\t\t\ttext: \'\' ]\n\t ].\n\n'). clause_source_code(component(A, en-B, C, D, task_mod_general4), 'realizer-grammar.mug', '\ncomponent(Task, en-_, Mode, FD, task_mod_general4) :- \n\t(Mode=screen;Mode=voice),\n\t(Task=toplevel),\n\tFD === [ \t \n\t\t\t \n\t\t\t Mode:[\tcat:Task,\n\t\t\t\trealized:0, \n\t\t\t\ttext: \'\' ]\n\t ].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_t1), 'realizer-grammar.mug', '\n\ncomponent(template_mod, en-_, Mode, FD, template_mod_t1) :-\n\tFD === [\n\t\t\n\t\ttemplate: target,\n\t\ttask:[type: send_email],\n\t\tscope: [task/email/to],\n\t\ttext:\'send the email to\' \t\n\t ].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_t2), 'realizer-grammar.mug', '\ncomponent(template_mod, en-_, Mode, FD, template_mod_t2) :-\n\tFD === [\n\t\t\n\t\ttemplate: target,\n\t\ttask:[type: send_email],\n\t\tscope: [task/email/cc],\n\t\ttext:\'cc on your email\' \t\n\t ]. '). clause_source_code(component(template_mod, en-A, B, C, template_mod_t3), 'realizer-grammar.mug', ' \t \t\t \ncomponent(template_mod, en-_, Mode, FD, template_mod_t3) :-\n\tFD === [\n\t\t\n\t\ttemplate: target,\n\t\ttask:[type: send_email],\n\t\tscope: [attach],\n\t\ttext:\'attach to your email\' \t\n\t ]. '). clause_source_code(component(email, en-A, B, C, email_1), 'realizer-grammar.mug', ' \t\n\n/* ==============================================================\n\n \t\ttype-specific realization variants\n \t\t(e.g. contact, emailaddress, etc.)_\t\t\n\n*/\n\n\n% the following components contain object descriptions\n \n \n%em:\n%The value of the text feature contained in the subject feature of an email is automatically instantiated as part of its standard referring text Text.\n%Text represents the default referring expresssion for an object which is used if a full referring expression is to be generated for that object.\n%see refexp_full component\n%The email component now takes care of the optional \'regarding Content\' string.\ncomponent(email, en-_, Mode, FD, email_1) :- \n\tFD === [ polarity:positive,\n\t\t subject:[content: Subj,\n\t\t \t\tstring: template(\'"~w"\', [Subj]),\n\t\t\t\t Mode: [cat:optional_string,\n\t\t\t\t\t prefix:\' regarding \',\n\t\t\t\t\t text: SubjText]\n\t\t\t\t ],\n\t\t Mode:[realized: 1,\n\t\t synrole:inf_vp, \n\t\t text: template(\'the email ~w \', [SubjText]) \n\t\t \n\t\t ]\n\t ].\n '). clause_source_code(component(contact, en-A, B, C, contact_1), 'realizer-grammar.mug', ' \n\n%There are several different ways to display a contact\'s name.\n\ncomponent(contact, en-_, Mode, FD, contact_1) :- \n\t\n\tFD === [ \t int_adr_is_empty:no,\n\t\t\t adr:Adr,\n\t\t\t Mode:[realized:1, \n\t\t\t prefix:P,\n\t\t\t text: concat([P, Adr]) ]\n\t ],\n\t given(Adr).\n\n'). clause_source_code(component(emailaddress, en-A, B, C, emailaddress_1), 'realizer-grammar.mug', '\n%If we know their email address, we can display that.\n\n%took out prefix value - not sure how it works when no prefix is given\ncomponent(emailaddress, en-_, Mode, FD, emailaddress_1) :- \n\n\tFD === [ \t int_adr_is_empty:no,\n\t\t\t adr:Adr,\n\t\t\t Mode:[realized:1, \n\t\t\t\n\t\t\t text: concat([Adr]) ]\n\t ],\n\tgiven(Adr).\n%'). clause_source_code(component(contact, en-A, B, C, contact_2), 'realizer-grammar.mug', '%If we know their given and surnames, we can concatenate those together.\n\ncomponent(contact, en-_, Mode, FD, contact_2) :- \n\n\tFD === [ \t \n\t\t\t firstname: Name,\n\t\t lastname: Name2,\n\t\t\t Mode:[ realized:1, \n\t\t\t \n\t\t\t text: concat([Name, \' \', Name2]) ]\n\t ],\n\tgiven(Name),\n\tgiven(Name2).\n\n'). clause_source_code(component(contact, en-A, B, C, contact_2firstname), 'realizer-grammar.mug', '\n/*\ndr: i took this out. it generated way too much ambiguity,\nwithout the \'realized\' figure differentiating.\nwe can do first names, but only for salient elements (cb feature).\n \n put it back in temporarily\n */\n % In some cases, we want to give only their first name, for brevity. \ncomponent(contact, en-_, Mode, FD, contact_2firstname) :- \n\t\n\tFD === [ \t \n\t\t\t firstname:FirstName, \n\t\t\t form:firstname,\t% enforced cross-modal coordination\n\t\t\t Mode:[realized:1,\n\t\t\t form:firstname, \n\t\t\t text: FirstName ]\n\t ],\n\tgiven(FirstName).\n\t'). clause_source_code(component(contact, en-A, B, C, contact_2lastname), 'realizer-grammar.mug', '\t\ncomponent(contact, en-_, Mode, FD, contact_2lastname) :- \n\t \n\tFD === [ \t \n\t\t\t lastname:LastName, \n\t\t\t form:lastname,\t% enforced cross-modal coordination\n\t\t\t Mode:[realized:1,\n\t\t\t form:lastname, \n\t\t\t text: LastName ]\n\t ],\n\tgiven(LastName).\n\t'). clause_source_code(component(contact, en-A, B, C, contact_3), 'realizer-grammar.mug', '\t \t \n\n%If we don\'t have a name or an email address, we won\'t display them,\n%but (note that realized is 1) we incur no penalty.\n\ncomponent(contact, en-_, Mode, FD, contact_3) :- \n\tFD === [ \n\t\t\t firstname:\'\',\n\t\t lastname:\'\',\n\t\t\t adr:\'\',\n\t\t\t int_name_is_empty:yes,\n\t\t int_adr_is_empty:yes,\n\t\t\t Mode:[realized:1,\n\t\t\t empty:yes, \n\t\t\t\ttext: \'\' ]\n\t ].\n\n'). clause_source_code(component(emailaddress, en-A, B, C, emailaddress_3), 'realizer-grammar.mug', '\ncomponent(emailaddress, en-_, Mode, FD, emailaddress_3) :- \n\tFD === [ \n\t\t\t firstname:\'\',\n\t\t lastname:\'\',\n\t\t\t adr:\'\',\n\t\t\t int_name_is_empty:yes,\n\t\t int_adr_is_empty:yes,\n\t\t\t Mode:[realized:1, \n\t\t\t empty:yes,\n\t\t\t\ttext: \'\' ]\n\t ].\t\n'). clause_source_code(component(contact, en-A, B, C, contact_4), 'realizer-grammar.mug', '\n\n%We may choose not to show the contact\'s name, even if we have the\n%information. This will reduce the cognitive load. However, the\n%information is recorded as being un realized.\n\ncomponent(contact, en-_, Mode, FD, contact_4) :- \nFD === [ \n\t\t\tfirstname: FirstName,\n\t\t\tadr: Adr,\n\t\t\t int_name_is_empty:no,\n \t\tint_adr_is_empty:no,\t \n\t\t\t Mode:[realized:0, \n\t\t\t\ttext: \'\' ]\n\t ],\n\t((given(FirstName);given(Adr)), !).\n\t'). clause_source_code(component(emailaddress, en-A, B, C, emailaddress_4), 'realizer-grammar.mug', '\t\n\ncomponent(emailaddress, en-_, Mode, FD, emailaddress_4) :- \n\n\tFD === [ \tfirstname: FirstName,\n\t\t\t\tadr: Adr, \n\t\t\t int_name_is_empty:no,\n \t\t\t int_adr_is_empty:no,\t \n\t\t\t Mode:[realized:0, \n\t\t\t\ttext: \'\' ]\n\t ],\n\t((given(FirstName);given(Adr)),!).\n\t'). clause_source_code(component(content, en-A, B, C, content_1), 'realizer-grammar.mug', '\t\n\t\n%Give a text content (body, subject)\ncomponent(content, en-_, Mode, FD, content_1) :-\n\tFD === [ content: T1,\n\t\t int_content_is_empty:no,\n\t\t \n\t\t Mode: [realized:1,\n\t\t prefix:P,\n\t\t maxlength:none,\n\t\t text: concat([P, T1])]],\n\t\n\tgiven(T1).\n\n'). clause_source_code(component(content, en-A, B, C, content_1summarized), 'realizer-grammar.mug', '\n\n%Give a text content (body, subject)\ncomponent(content, en-_, Mode, FD, content_1summarized) :-\n\t\n\tFD === [ content: T,\n\t\t int_content_is_empty:no,\n\t\t Mode: [realized:1,\n\t\t prefix:P,\n\t\t maxlength:MaxLength,\n\t\t text: concat([P, summarize(MaxLength, T)])]],\n\t(given(T)),\n\t(given(MaxLength)).\n\t'). clause_source_code(component(content, en-A, B, C, content_2), 'realizer-grammar.mug', '\t\n\n\n%If there is no text field.\ncomponent(content, en-_, Mode, FD, content_2) :-\n\tFD === [ content: \'\',\n int_content_is_empty:yes,\n\t\t\tMode: [realized:1,\n\t\t\t text: \'\']].\n\n'). clause_source_code(component(content, en-A, B, C, content_3), 'realizer-grammar.mug', '\n%Or it can just be left blank.\ncomponent(content, en-_, Mode, FD, content_3) :-\n\tFD === [ int_content_is_empty:no,\n\t\t\tMode: [realized:0,\n\t\t\t text: \'\']].\n\n'). clause_source_code(component(template_mod, en-A, B, C, template_mod_l1), 'realizer-grammar.mug', '\n\n\n\n\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n% Lexicon -- the MUG dictionary\n% this is language-specific\n\n\n% this lexicon just contains some reusable words\n% localization may include adding attributes to these\n% and to the higher components that call them up,\n% so linguistic agreement restrictions can be expressed.\n\ncomponent(template_mod, en-_, Mode, FD, template_mod_l1) :-\n\tFD === [\n\t\t\n\t\ttemplate: determiner,\n\t\tcardinality:one,\n\t\ttext:\'one\' \t \t\n\t ].\nc'). clause_source_code(component(template_mod, en-A, B, C, template_mod_l2), 'realizer-grammar.mug', 'component(template_mod, en-_, Mode, FD, template_mod_l2) :-\n\tFD === [\n\t\t\n\t\ttemplate: determiner,\n\t\tcardinality:more,\n\t\ttext:\'several\' \t \t\n\t ]. '). clause_source_code(component(template_mod, en-A, B, C, template_mod_l3), 'realizer-grammar.mug', ' \t\t \n component(template_mod, en-_, Mode, FD, template_mod_l3) :-\n\tFD === [\n\t\t\n\t\ttemplate: determiner,\n\t\tcardinality:some,\n\t\ttext:\'some\' \t \t\n\t ]. '). mug-workbench/_realizer-tests.pl0000644000076700000240000005300010410111274017016 0ustar drstaff00000000000000% MUG file, automatically generated. Do not edit. % Original file: realizer-tests.mug :- discontiguous(component/5). :- discontiguous(ex/2). :- multifile(component/5). :- discontiguous(component/6). :- multifile(component/6). :- multifile(clause_source_code/3). % component clauses contain compiled component code. % clause_source_code clauses contain original source code used by the MUG Workbench :-mug_grammar_info('MUG System, FASiL demo', 'Erin Panttaja, David Reitter'). ex(demo1, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', gend:masc, realize:1|B], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie'|C], subject:[type:text, content:'Irish weather'|D], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|E]|F]|G], scope:[task/email]|H]|I]). ex(demo2, A) :- unif(A, [type:pick, initiative:implicit, experience:novice, error:none, cardinality:one, action:[type:addtolist, task:[type:send_email, contexttype:email, email:[type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', gend:masc|B], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', gend:fem|C], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie'|D], subject:[type:text, content:'Aussie weather'|E], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|F]|G]|H], scope:[user_intention/email/bcc], user_intention:[list:[[type:contact, firstname:'Jenna', lastname:'Templeton', gend:fem|I], [type:contact, firstname:'Jenna', lastname:'Elfman', gend:fem|J]]|K]|L]|M]). ex(demo3, A) :- unif(A, [type:askinfo, experience:expert, error:none, action:[type:addtolist, task:[type:send_email, contexttype:email, email:[type:email|B]|C], scope:[task/email/to]|D]|E]). ex(demo4, A) :- unif(A, [type:askinfo, experience:expert, error:none, action:[type:fillfield, task:[type:send_email, contexttype:email, email:[type:email|B]|C], scope:[user_intention/email/subject], user_intention:[email:[to:[type:contact, firstname:'Septimus', lastname:'Hodge'|D]|E]|F]|G]|H]). ex(demo5, A) :- unif(A, [type:askconfirmation, experience:expert, error:none, action:[type:addtolist, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Septimus', lastname:'Hodge'|B]|C]|D], scope:[user_intention/email/subject], user_intention:[email:[subject:[type:text, content:'On Algebra'|E]|F]|G]|H]|I]). ex(demo6, A) :- unif(A, [type:askinfo, experience:expert, initiative:implicit, error:none, action:[type:fillfield, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Septimus', lastname:'Hodge'|B], subject:[type:text, content:'On Algebra'|C]|D]|E], scope:[user_intention/email/body]|F]|G]). ex(demo7, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:expert, error:none, action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Septimus', lastname:'Hodge'|B], subject:[type:text, content:'On Algebra'|C], body:[type:text, content:'file.au'|D]|E]|F], scope:[task/email]|G]|H]). ex(demo8, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, objectid:10, salient:[subject, to], to:[type:emailaddress, objectid:9, adr:'michael.cody@medialabeurope.org', gend:masc, realize:1|B], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie', realize:1|C], subject:[type:text, content:'Irish weather'|D], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|E]|F]|G], scope:[task/email]|H]|I]). ex(talk1, A) :- unif(A, [type:askinfo, action:[type:addtolist, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Michael', lastname:'Cody'|B], subject:[content:'Project report deadline'|C]|D], scope:[task/email/to]|E]|F]|G]). discourse_ex(disc1, A) :- grammar_constraint(ex(mugtest3, B)), grammar_constraint(copy_term(B, C)), unif(A, [sem:[B, C]|D]). ex(mugtest1, A) :- unif(A, [action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, salient:[subject, to], from:[type:emailaddress, adr:'ustinov@yahoo.com'|B], to:[type:contact, firstname:'Keith', lastname:'Jarrett', gend:masc, realize:1|C], subject:[content:'EU-Project Proposal'|D], realize:1|E], realize:1|F]|G], type:askconfirmation|H]). ex(mugtest2, A) :- unif(A, [type:askinfo, action:[type:addtolist, scope:[task/email/to], task:[type:send_email, contexttype:email, email:[type:email, from:[type:emailaddress, adr:'ustinov@yahoo.com'|B], subject:[content:'EU-Project Proposal'|C], realize:1|D], realize:1|E]|F]|G]). ex(mugtest3, A) :- grammar_constraint(new_object(contact, B)), grammar_constraint(set_property(B, firstname, 'Peter')), grammar_constraint(set_property(B, lastname, 'Ustinov')), grammar_constraint(new_object(emailaddress, C)), grammar_constraint(set_property(C, adr, 'peter@yahoo.com')), grammar_constraint(convObjsToFD(obj(B), D)), grammar_constraint(convObjsToFD(obj(C), E)), unif(A, [type:pick, cardinality:one, action:[type:addtolist, task:[type:send_email|F], scope:[task/email/to], user_intention:[list:[D, E]|G]|H]|I]). ex(mugtest4, A) :- unif(A, [type:askconfirmation, action:[type:task, scope:[task/email], task:[type:send_email, contexttype:email, email:[type:email, objectid:10, from:[type:contact, objectid:8, firstname:'Erin', lastname:'Panttaja', gend:fem|B], to:[type:contact, objectid:9, firstname:'Keith', lastname:'Jarrett', gend:masc, realize:1|C], subject:[content:'EU-Project Proposal'|D], realize:1|E]|F]|G]|H]). ex(mugtest5, A) :- unif(A, [type:askconfirmation, initiative:explicit, experience:novice, action:[type:task, scope:[user_intention/email], task:[type:send_email, contexttype:email|B]|C]|D]). ex(mugtest6, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:addtolist, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Keith', lastname:'Jarrett', gend:masc|B], from:[type:emailaddress, adr:'ustinov.com'|C], subject:[content:'EU-Project Proposal'|D]|E]|F], scope:[user_intention/email/bcc], user_intention:[email:[type:email, bcc:[type:contact, firstname:'Kerry', lastname:'Robinson', gend:masc|G]|H]|I]|J]|K]). ex(mugtest7, A) :- unif(A, [type:pick, initiative:implicit, experience:novice, error:none, cardinality:one, action:[type:fillfield, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Mick', lastname:'Cody', gend:masc|B], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', gend:fem|C], from:[type:emailaddress, adr:'reitter@mle.ie'|D]|E]|F], scope:[user_intention/email/bcc], user_intention:[list:[[type:contact, firstname:'Jenna', lastname:'Templeton', gend:fem|G], [type:contact, firstname:'Jenna', lastname:'Elfman', gend:fem|H]]|I]|J]|K]). mug_engine_test :- grammar_constraint(atom_codes(A, [27])), grammar_constraint(mug_engine_declare(B)), grammar_constraint(format('~w: ~t~t', [B])), grammar_constraint(once((mug_engine_test(B)->format('ok\n', []);format('~w[31mfailed!~w[0m\n', [A, A])))), grammar_constraint(fail). mug_engine_test. mug_engine_time :- grammar_constraint(mug_engine_test), grammar_constraint(time(times(5000, mug_engine_time2))). mug_engine_time2 :- grammar_constraint(mug_engine_declare(A)), grammar_constraint(once(mug_engine_test(A))), grammar_constraint(fail). mug_engine_time2. mug_engine_declare(concat). mug_engine_test(concat) :- unif(A, [result:eval(concat, [[B, sweet, sarah]], C, D)|E]), unif(B, gutentag), grammar_constraint(wrapeval(A, F)), grammar_constraint(applyOperators(F)), grammar_constraint(fd_read_value(F, result, none, gutentagsweetsarah)). mug_engine_declare(collect). mug_engine_test(collect) :- unif(A, [things:[big:[middle:[small:[text:hello|B]|C]|D]|E]|F]), unif(A, [things:[redbig:[redmiddle:[text:' lovely'|G]|H]|I]|J]), unif(A, [things:[bluebig:[bluemiddle:[bluesmall:[text:' world'|K]|L]|M]|N]|O]), unif(A, [things:P|Q]), unif(A, [result:eval(collect, [text, P], R, S)|T]), grammar_constraint(wrapeval(A, U)), grammar_constraint(applyOperators(U)), grammar_constraint(fd_read_value(U, result, none, [hello, ' lovely', ' world'])). mug_engine_declare(concat_collect). mug_engine_test(concat_collect) :- unif(A, [things:[big:[middle:[small:[text:hello|B]|C]|D]|E]|F]), unif(A, [things:[redbig:[redmiddle:[text:' lovely'|G]|H]|I]|J]), unif(A, [things:[bluebig:[bluemiddle:[bluesmall:[text:' world'|K]|L]|M]|N]|O]), unif(A, [things:P|Q]), unif(A, [result:eval(concat, [eval(collect, [text, P], R, S)], T, U)|V]), grammar_constraint(wrapeval(A, W)), grammar_constraint(applyOperators(W)), grammar_constraint(fd_read_value(W, result, none, 'hello lovely world')). mug_engine_declare(concat_collect2). mug_engine_test(concat_collect2) :- unif(A, [things:[big:[middle:[small:[text:hello|B]|C]|D]|E]|F]), unif(A, [things:[redbig:[redmiddle:[text:' lovely'|G]|H]|I]|J]), unif(A, [things:[bluebig:[bluemiddle:[bluesmall:[text:' world'|K]|L]|M]|N]|O]), unif(A, [things:P|Q]), unif(A, [preresult:eval(collect, [text, P], R, S)|T]), unif(A, [preresult:U, result:eval(concat, [U], V, W)|X]), grammar_constraint(wrapeval(A, Y)), grammar_constraint(applyOperators(Y)), grammar_constraint(fd_read_value(Y, result, none, 'hello lovely world')). mug_engine_declare(multiply). mug_engine_test(multiply) :- unif(A, [things:[big:[middle:[small:[text:hello|B]|C]|D]|E]|F]), unif(A, [things:[redbig:[redmiddle:[text:' lovely'|G]|H]|I]|J]), unif(A, [things:[bluebig:[bluemiddle:[bluesmall:[text:' world'|K]|L]|M]|N]|O]), unif(A, [things:P|Q]), unif(A, [result:eval(multiply, [[[name:david|R], [name:paul|S], [name:anna|T]], P], U, V)|W]), grammar_constraint(wrapeval(A, X)), grammar_constraint(applyOperators(X)), grammar_constraint(fd_read_value(X, result, none, Y)), Y=[[name:david, big:[middle:[small:[text:hello|Z]|A1]|B1], redbig:[redmiddle:[text:' lovely'|C1]|D1], bluebig:[bluemiddle:[bluesmall:[text:' world'|E1]|F1]|G1]|H1], [name:paul, big:[middle:[small:[text:hello|I1]|J1]|K1], redbig:[redmiddle:[text:' lovely'|L1]|M1], bluebig:[bluemiddle:[bluesmall:[text:' world'|N1]|O1]|P1]|Q1], [name:anna, big:[middle:[small:[text:hello|R1]|S1]|T1], redbig:[redmiddle:[text:' lovely'|U1]|V1], bluebig:[bluemiddle:[bluesmall:[text:' world'|W1]|X1]|Y1]|Z1]]. mug_engine_declare(foreach). mug_engine_test(foreach) :- unif(A, [elements:eval(foreach, [[[mood:good|B], [mood:better|C], [mood:best|D]], [mood:E|F], [ifeel:E|G]], H, I)|J]), grammar_constraint(wrapeval(A, K)), grammar_constraint(applyOperators(K)), grammar_constraint(fd_read_value(K, elements, none, L)), unif(L, [[ifeel:good|M], [ifeel:better|N], [ifeel:best|O]]). mug_engine_declare(specificCommonType). mug_engine_test(specificCommonType) :- unif(A, [result:eval(specificCommonType, [[[type:contact, firstname:'Peter', lastname:'Ustinov'|B], [type:emailaddress, adr:'peter@yahoo.com'|C]]], D, E)|F]), when(nonvar([[type:contact, firstname:'Peter', lastname:'Ustinov'|B], [type:emailaddress, adr:'peter@yahoo.com'|C]]), applyOperators(eval(specificCommonType, [[[type:contact, firstname:'Peter', lastname:'Ustinov'|B], [type:emailaddress, adr:'peter@yahoo.com'|C]]], D, E))), grammar_constraint(wrapeval(A, G)), grammar_constraint(applyOperators(G)), grammar_constraint(fd_read_value(G, result, none, H)), H=contact. mug_engine_declare(delay). mug_engine_test(delay) :- unif(A, [elements:B, elements:hallo, result:B|C]), grammar_constraint(wrapeval(A, D)), grammar_constraint(applyOperators(D)), grammar_constraint(fd_read_value(D, result, none, hallo)). mug_engine_declare(foreach_delay_typeof). mug_engine_test(foreach_delay_typeof) :- unif(A, [elements:eval(foreach, [[[objectid:2, salient:[name], name:'Peter Ustinov'|B], [objectid:3, salient:[name], name:'Peter Pan'|C]], [objectid:D, salient:[E|F]|G], [cat:eval(typeof, [H], I, J), obj:H|K]], L, M)|N]), freeze(E, (flag(frozen_goals_succeed, 1, 1)->true;unif([objectid:D, salient:[E|F]|G], [E:H|O]))), grammar_constraint(wrapeval(A, P)), grammar_constraint(applyOperators(P)), grammar_constraint(fd_read_value(P, elements, none, Q)), unif(Q, [[cat:predefined, obj:'Peter Ustinov'|R], [cat:predefined, obj:'Peter Pan'|S]]). mug_engine_declare(foreach_delay2_typeof). mug_engine_test(foreach_delay2_typeof) :- unif(A, [mode_screen:[elements:eval(foreach, [[[objectid:2, salient:[name], name:'Peter Ustinov'|B], [objectid:3, salient:[name], name:'Peter Pan'|C]], [objectid:D, salient:[E|F]|G], [cat:eval(typeof, [H], I, J), obj:H|K]], L, M)|N]|O]), freeze(E, (flag(frozen_goals_succeed, 1, 1)->true;unif([objectid:D, salient:[E|F]|G], [E:H|P]))), grammar_constraint(wrapeval(A, Q)), grammar_constraint(applyOperators(Q)), grammar_constraint(fd_read_value(Q, mode_screen:elements, none, R)), R=[[cat:predefined, obj:'Peter Ustinov'|S], [cat:predefined, obj:'Peter Pan'|T]]. mug_engine_declare(collect). mug_engine_test(collect) :- unif(A, [cat:string, obj:'Peter Ustinov', text:'

Peter Ustinov

', html:'upper html', deeper:[html:'this should only be seen when recurse=lim or full', deeper:[html:'this is deepest (only full!)'|B]|C]|D]), grammar_constraint(fd_collect(text, A, recurse_full, E)), grammar_constraint(fd_collect(html, A, recurse_limited, F)), grammar_constraint(fd_collect(deeper:html, A, recurse_limited, G)), grammar_constraint(fd_collect(deeper:html, A, recurse_full, H)), grammar_constraint(nonvar(E)), grammar_constraint(nonvar(F)), grammar_constraint(nonvar(G)), grammar_constraint(nonvar(H)), E=['

Peter Ustinov

'], F=['upper html'], G=['this should only be seen when recurse=lim or full'], H=['this should only be seen when recurse=lim or full', 'this is deepest (only full!)']. mug_engine_declare(stepbystepeval). mug_engine_test(stepbystepeval) :- unif(A, [source:'here ', deep:[source:'i come'|B]|C]), D=multiply([A], [addtl:tag|E]), F=collect(source, G), unif(H, [orig:A, list:eval(concat, [F], I, J), prep:G|K]), unif(G, D), grammar_constraint(wrapeval(H, L)), grammar_constraint(applyOperators(L)), grammar_constraint(fd_read_value(L, list, none, M)), M='here i come'. mug_engine_declare(linkCenters). mug_engine_test(linkCenters) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, objectid:44, task:[type:send_email, contexttype:email, email:[type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', realize:1|B], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie'|C], subject:[type:text, content:'Irish weather'|D], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|E]|F]|G]|H]|I]), unif(J, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, objectid:44, task:[type:send_email, contexttype:email, email:[type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', realize:1|K], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie'|L], subject:[type:text, content:'Irish weather'|M], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|N]|O]|P]|Q]|R]), grammar_constraint(linkCenters([], A, S, T)), grammar_constraint(linkCenters(T, J, U, V)), grammar_constraint(fd_read_value(S, action:task:email:from:centering:previous:cb, unknown, none)), grammar_constraint(fd_read_value(S, action:task:email:centering:current:cf, unknown, unknown)), grammar_constraint(fd_bind_value(S, action:task:email:centering:utterance, W)), grammar_constraint(fd_bind_value(S, action:task:email:centering:utterance, X)), grammar_constraint(W==X), grammar_constraint(fd_bind_value(S, action:task:email:to:centering:current, Y)), grammar_constraint(fd_bind_value(U, action:task:email:to:centering:previous, Z)), grammar_constraint(Y==Z), grammar_constraint(fd_bind_value(S, action:task:email:centering:current, A1)), grammar_constraint(fd_bind_value(U, action:task:email:centering:previous, B1)), grammar_constraint(A1==B1), grammar_constraint(fd_read_value(U, action:task:email:to:centering:current:cf, unknown, unknown)), grammar_constraint(fd_bind_value(U, action:task:email:to:centering:utterance, C1)), grammar_constraint(fd_bind_value(U, action:task:email:centering:utterance, D1)), grammar_constraint(\+W==C1), grammar_constraint(C1==D1). ex(mugtest8, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, scope:[task/email], task:[type:send_email, contexttype:email, email:[png:[gend:neut, num:sing|B], objectid:10, centering:[current:[cp:1, cb:1|C], previous:[cp:0, form:null|D], utterance:[cb:10, cp:10|E]|F], type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', png:[gend:masc, num:sing|G], centering:[current:[cb:0|H], previous:[cp:0, form:null|I]|J]|K], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', png:[gend:fem, num:sing|L], centering:[current:[cp:0, cb:0|M], previous:[cp:0|N]|O]|P], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie', png:[gend:masc, num:sing|Q], centering:[current:[cp:0, cb:0|R], previous:[cp:0|S]|T]|U], subject:[type:text, content:'Aussie weather'|V], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|W]|X]|Y]|Z]|A1]). ex(mugtest9, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, scope:[task/email], task:[type:send_email, contexttype:email, email:[png:[gend:neut, num:sing|B], centering:[current:[cp:1, cb:1|C], previous:[cp:1, form:pronoun|D], utterance:[cb:10, cp:10|E]|F], type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', png:[gend:masc, num:sing|G], centering:[current:[cp:0, cb:0|H], previous:[cp:1, form:pronoun|I]|J]|K], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', png:[gend:fem, num:sing|L], centering:[current:[cp:0, cb:0|M], previous:[cp:0|N]|O]|P], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie', png:[gend:masc, num:sing|Q], centering:[current:[cp:0, cb:0|R], previous:[cp:0|S]|T]|U], subject:[type:text, content:'Aussie weather'|V], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|W]|X]|Y]|Z]|A1]). ex(mugtest10, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, scope:[task/email], task:[type:send_email, contexttype:email, email:[png:[gend:neut, num:sing|B], centering:[previous:[cp:0, form:full|C]|D], type:email, objectid:10, salient:[subject, to], to:[type:contact, objectid:9, firstname:'Mick', lastname:'Cody', png:[gend:masc, num:sing|E], centering:[previous:[cp:0, form:definite|F]|G]|H], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', png:[gend:fem, num:sing|I], centering:[previous:[cp:0|J]|K]|L], from:[type:emailaddress, objectid:8, adr:'reitter@mle.ie', png:[gend:masc, num:sing|M], centering:[previous:[cp:0|N]|O]|P], subject:[type:text, content:'Aussie weather'|Q], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|R]|S]|T]|U]|V]). ex(mugtest11, A) :- unif(A, [type:pick, initiative:implicit, experience:novice, error:none, cardinality:one, action:[type:fillfield, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Mick', lastname:'Cody', gend:masc|B], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', gend:fem|C], from:[type:emailaddress, adr:'reitter@mle.ie'|D]|E]|F], scope:[user_intention/email/bcc], user_intention:[list:[[type:contact, firstname:'Jenna', lastname:'Templeton', gend:fem|G], [type:contact, firstname:'Jenna', lastname:'Elfman', gend:fem|H], [type:contact, firstname:'Jenna', lastname:'Bruce', gend:fem|I]]|J]|K]|L]). ex(mugtest12, A) :- unif(A, [type:pick, initiative:implicit, experience:novice, error:none, cardinality:one, action:[type:fillfield, task:[type:send_email, contexttype:email, email:[type:email|B]|C], scope:[user_intention/email/bcc], user_intention:[list:[[type:contact, firstname:'Jenna', lastname:'Templeton', gend:fem|D], [type:emailaddress, adr:'reitter@mle.ie'|E], [type:contact, firstname:'Jenna', lastname:'Elfman', gend:fem|F]]|G]|H]|I]). ex(paper1, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Fred', lastname:'Cummins', realize:1|B], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', realize:1|C], from:[type:emailaddress, adr:'reitter@mle.ie'|D], subject:[type:text, content:'Aussie weather'|E], body:[type:text, content:'G\'day mates. Happy New Year Everybody! -Dave'|F]|G]|H], scope:[task/email]|I]|J]). ex(paper2, A) :- unif(A, [type:askconfirmation, initiative:implicit, experience:novice, error:none, action:[type:task, task:[type:send_email, contexttype:email, email:[type:email, to:[type:contact, firstname:'Fred', lastname:'Cummins', realize:1|B], cc:[type:contact, firstname:'Erin', lastname:'Panttaja', realize:1|C], from:[type:emailaddress, adr:'reitter@mle.ie'|D], subject:[type:text, content:'Aussie weather'|E], body:[type:text, content:'G\'day mates. The summer is really nice down under, warm and sunny. Are you enjoying the Irish rain? Happy New Year Everybody! -Dave'|F]|G]|H]|I]|J]). ex(erin1, A) :- unif(A, [type:pick, cardinality:one, action:[type:addtolist, task:[type:send_email|B], scope:[task/email/to], user_intention:[list:[[type:contact, firstname:'Peter', lastname:'Ustinov'|C], [type:emailaddress, adr:'peter@yahoo.com'|D]]|E]|F]|G]). mug-workbench/_workbench.conf.pl0000644000076700000240000000064610410111247016757 0ustar drstaff00000000000000% MUG Workbench Configuration. This file is auto-generated. :- dynamic(workbench_config/1). :- retractall(workbench_config(_)). workbench_config(filter('no score', 0, [score])). workbench_config(filter(generation, '1', [text, screen_static, screen_dynamic, voice, cat])). workbench_config(filter('only type', '1', [type])). workbench_config(filter(scoring, 0, [score, utility, overall, reading, realize, realized])). mug-workbench/all0000755000076700000240000000006710127046041014054 0ustar drstaff00000000000000yap -s 18000 -h 20000 -t 18000 -l all_api_yap.pl mug-workbench/all_api_yap.pl0000644000076700000240000000155510127046041016170 0ustar drstaff00000000000000% realizer_api_gpl :- yap_flag(language,sicstus). :- yap_flag(informational_messages,on). :- ensure_loaded('compat_yap.pl'). :- ensure_loaded('lists.pl'). :- ensure_loaded('realizer-api.pl'). :- ensure_loaded('realizer.pl'). :- ensure_loaded('debug.pl'). :- ensure_loaded('ff-tools-opt.pl'). :- ensure_loaded('punif.pl'). :- ensure_loaded('score.pl'). :- ensure_loaded('tools.pl'). :- ensure_loaded('uni.pl'). :- ensure_loaded('unif.pl'). :- ensure_loaded('kb_engine.pl'). :- ensure_loaded('database.pl'). :- ensure_loaded('tools.pl'). % grammars :- ensure_loaded('_realizer-grammar.pl'). :- ensure_loaded('_centering-grammar.pl'). % :- ensure_loaded('_realizer-autoconv.pl'). :- ensure_loaded('_realizer-tests.pl'). :- ensure_loaded('dm.pl'). :- ensure_loaded('fusion.pl'). % socket-based API :- ensure_loaded('sockets_api.pl'). :- server(all, 'localhost').mug-workbench/._all_dev_swi.pl0000400000076700000000000000012210145243607016400 0ustar drwheel00000000000000Mac OS X  2 RTEXTmug-workbench/all_dev_swi.pl0000644000076700000240000000035210145243607016207 0ustar drstaff00000000000000% realizer_api_gpl :- load_files(['siteconfig.pl', 'realizer-dev.pl', 'realizer.pl'], [silent(true)]). :- ensure_loaded('dm.pl'). :- ensure_loaded('fusion.pl'). % socket-based API :- ensure_loaded('sockets_api.pl'). mug-workbench/ao-tests.mug0000644000076700000240000000041110127046041015620 0ustar drstaff00000000000000% -*-Prolog-*- /* These are unit tests for parts of the Fission MUG engine. Author: David Reitter, reitter@mle.media.mit.edu Copyright 2003, Media Lab Europe Ltd. CONFIDENTIAL. Last Change: $Id: ao-tests.mug,v 1.5 2004/02/16 16:59:49 dr Exp $ */ % deletedmug-workbench/basic-grammar.mug0000644000076700000240000000430710155176636016615 0ustar drstaff00000000000000% -*-Prolog-*- /* This grammar components demonstrate the MUG principles It should not interfere with the other grammars or examples. */ grammar_info('Basic sample grammar and test case','David Reitter'). output_mode(screen). output_mode(voice). /* test case */ ex(basic1, FD) :- FD === [ type: give_explanation, action: none, theme: [ type: gui_button, label: 'Save', png: [gend: neut, num: sing], function: [ type:save, scope: document ] ] ]. /* root component for all modes */ component(multimodal, _, Mode, FD, demo_multimodal_1) :- FD === [ tree:[ Mode:[ cat:DialogueAct, text:A], type:DialogueAct ], Mode:[ cat:multimodal, text:A] ]. /* Dialogue Act component */ component(give_explanation, _, Mode, FD, give_explanation) :- FD === [ theme: Theme = [ function: Function ], theme_refexp: [ sem: Theme, Mode: [ cat:refexp, prefix: '', realized:1, function:normal, case:nom, text: Subject ] ], pred: [ function: Function, Mode: [ cat:describe_function, form: 'vp\\np', text: Predicate ] ], Mode:[ cat: give_explanation, realized: 1, text: concat([capitalize(Subject), ' ', Predicate, '.']) ] ]. /* canned text: description of some program function. must realize a verbal phrase */ component(describe_function, _, Mode, FD, describe_function_1) :- FD === [ function: [ type: save, scope: document ], Mode:[ cat:describe_function, form: 'vp\\np', text: concat(['saves your document to disk']) ] ]. /* realizes a GUI element */ component(gui_button, _, Mode, FD, gui_button_1) :- FD === [ label: Label, Mode:[ cat:gui_button, realized:1, text: concat(['the ', Label, ' button']) ] ]. /* lexical element, bneeded by refexp component */ component(objtype, en-_, Mode, FD, demo_objtype_1) :- FD === [ objecttype: gui_button, Mode: [text: 'button'] ]. mug-workbench/benchmark.pl0000644000076700000240000000257410127046041015652 0ustar drstaff00000000000000 run_benchmark :- time(run_tests('benchmark.out')). run_tests(File) :- abolish(benchmark_result/2), choose(maximum_number_of_results, [50,200,500]), choose(search_algorithm, [depthfirst, bestfirst]), choose(bounded_search, [on,off]), choose(iterative_deepening, [on, off]), choose(scoring_heuristic, [admissible, practical]), choose(experimental_beam_search, [off]), \+ (experimental_beam_search(on), bounded_search(off)), \+ (iterative_deepening(on), bounded_search(off)), get_siteconfig(Conf), writeln(Conf), run_tests2(Res), assertz(bechmark_result(Conf, Res)), fail. run_tests(File) :- tell(File), print_results, told. print_results :- bechmark_result(Conf, Res), nl, write('\t'), foreach((Ex, Time), Res, format('~w \t ', [Ex])), nl, format('~w \t ', [Conf]), foreach((Ex, Time), Res, format('~w \t', [ Time])), nl, fail. print_results. choose(Pred, List) :- member(V, List), abolish(Pred/1), PredA =.. [Pred,V], assertz(PredA). run_tests2(TL) :- findall((Ex, Time), ( member(Ex, [demo1, demo2, demo3, demo4, demo5, demo6,demo7,demo8] %[demo1, demo8] ), write(Ex),nl, time((\+ \+ fist(Ex)),Time) , write(time:Time),nl), TL), foreach((Ex, Time), TL, format('~w \t ~w \n', [Ex, Time])). time(Goal, CPUT) :- statistics(cputime,CPU), call(Goal), statistics(cputime,CPU2), CPUT is CPU2-CPU. mug-workbench/cache_mfug.pl0000644000076700000240000000166510127046041016001 0ustar drstaff00000000000000% grammar cache % % doesn't make sense to include this in uni(), because % there is a Cat preselection anyways. % Experiments show that unificatino doesn't fail anyways!! % :- dynamic cache_mfug/4. :- index(cache_mfug(1,1,1,1)). index_mfug_unifications(OutFile) :- retractall(cache_mfug(_,_,_,_)), tell(OutFile), index_mfug_unifications1, told. index_mfug_unifications1 :- output_modes(Modes), member(M1, Modes), component(_Cat1, L, M1, FD1, UniqueID1), member(M2, Modes), component(_Cat2, L, M2, FD2, UniqueID2), (M1/UniqueID1) \== (M2/UniqueID2), % don't try to unify the same rule twice unify(FD1, FD2), % should unify if(cache_mfug(UniqueID1,M1,UniqueID2,M2), true, (assertz(cache_mfug(UniqueID1,M1,UniqueID2,M2)), writeq(cache_mfug(UniqueID1,M1,UniqueID2,M2)), write('.'), nl) ), fail. index_mfug_unifications1. :- index_mfug_unifications('_realizer-cache.pl'), ensure_loaded('_realizer-cache.pl'). mug-workbench/._centering-grammar.mug0000400000076700000000000000012210176167171017674 0ustar drwheel00000000000000Mac OS X  2 RTEXTmug-workbench/centering-grammar.mug0000644000076700000240000002540010176167171017504 0ustar drstaff00000000000000/* Authors: Eva Maguire, David Reitter Components required for the generation of referring expressions Refexp instantiates a surface realization depending on whether the same object has been mentioned in the previous sentence, and whether various centering conditions are fulfilled. */ grammar_info('MUG Centering Grammar for Referring Expressions','Eva Maguire, David Reitter'). /* because CF setting not implemented, we cannot do deictics / highlighed stuff component(refexp, en-_, Mode, FD, Utterance, refexp_full_focused_screen) :- Mode\=voice, Utterance === [utterance: [cb:ThisObjectID]], FD === [sem:[ type: ObjectType, objectid: ThisObjectID, png:[num:sing], centering:[ current:[form: full, cp:1, cf:1], % this element is definitely top of CF previous:[cp:0, form: null] ], Mode:[cat: ObjectType, realized:1, text: SurfaceForm ] ], Mode:[text: concat(['',P,' ',SurfaceForm, '']), prefix: P, function: normal, realized: 1 ] ], given(ObjectType). */ component(refexp, en-_, Mode, FD, Utterance, refexp_full) :- FD === [sem:[ type: ObjectType, png:[num:sing], centering:[ current:[form: full, cb:0], previous:[cp:0, form: null] ], Mode:[cat: ObjectType, realized:1, text: SurfaceForm ] ], Mode:[text: concat([P,' ',SurfaceForm]), prefix: P, function: normal, realized: 1 ] ] , given(ObjectType). % Full, Possessive component(refexp, en-_, Mode, FD, refexp_full_poss) :- FD === [sem:[ type: ObjectType, png:[num:sing], centering:[ current:[form: full ], previous:[cp:0, form: null] ], Mode:[cat: ObjectType, realized:1, text: SurfaceForm ] ], Mode:[text: concat([P,' ',SurfaceForm, '`s']), prefix: P, function: poss, realized: 1 ] ]. %em %If an object was referred to in a non-sentence intial position in the last expression then it may be referred to using a definite referring expression. component(refexp, en-_, Mode, FD, refexp_definite) :- FD === [ sem:[ type: ObjectType, png:[num:sing], centering:[ current:[form: definite ], previous:[cp:0, form:PreviousForm] ], Mode:[ cat: objtype, text: TypeText ], objecttype:ObjectType ], Mode:[text: template('~w the ~w', [P,TypeText]), prefix: P, function: normal, realized: 1] ], % not pronoun ( PreviousForm=null; PreviousForm=full; PreviousForm=deictic ) , given(ObjectType). /* component(refexp, en-_, Mode, FD, Utterance, refexp_definite_in_focus_scr) :- (Mode=screen_dynamic; Mode=screen), Utterance === [utterance: [cb:ThisObjectID]], FD === [ sem:[ type: ObjectType, objectid: ThisObjectID, png:[num:sing], centering:[ current:[form: definite, cb:1], previous:[cp:0, form:PreviousForm] ], Mode:[ cat: objtype, text: TypeText ], objecttype:ObjectType ], Mode:[text: template('~w the ~w', [P,TypeText]), prefix: P, function: normal, realized: 1] ], % not pronoun ( PreviousForm=null; PreviousForm=full; PreviousForm=deictic ) , given(ObjectType). */ %em %If an object was referred to in the last utterance it may be pronominalised according to its semantics. %If an object was a pronoun in the last utterance it is excluded from begin referred to by any referring expression other than a pronoun. component(refexp, en-_, Mode, FD, refexp_pronoun/Function/Word) :- FD === [ sem:[ type:ObjectType, png:PNG, centering:[current:[form:pronoun ], previous:[form:PreviousForm] ] ], Mode:[text: template('~w ~w',[P, Word]), realized: 1, function: Function, case:Case, prefix: P ] ], given(ObjectType), /* first pronominalization rule at least one of the following conditions must hold: - the currently pronominalized concept did not appear in U(i-1), - the CB of the current utterance is realized as pronoun This excludes the case that is forbidden by the rule: - this element occurred in Cf (u-1), but CB(U) is not realized as pronoun */ % ( WasInCF = 0 ; FormOfCurrentCB = pronoun ), /* it MUST have been realized somehow in the previous utterance */ % not null ( PreviousForm=pronoun; PreviousForm=full; PreviousForm=deictic;PreviousForm=definite ), /* cheap lexicon access */ pronoun(PNG, Function, Case, Word). pronoun(PNG, normal, _, 'it') :- PNG === [gend: neut, num: sing]. pronoun(PNG, normal, nom, 'she') :- PNG === [gend: fem, num: sing]. pronoun(PNG, normal, acc, 'her') :- PNG === [gend: fem, num: sing]. pronoun(PNG, normal, nom, 'he') :- PNG === [gend: masc, num: sing]. pronoun(PNG, normal, acc, 'him') :- PNG === [gend: masc, num: sing]. pronoun(PNG, normal, nom, 'they') :- PNG === [num: plural]. pronoun(PNG, normal, acc, 'them') :- PNG === [num: plural]. pronoun(PNG, poss, _, 'its') :- PNG === [gend: neut, num: sing]. pronoun(PNG, poss, _, 'her') :- PNG === [gend: fem, num: sing]. pronoun(PNG, poss, _, 'his') :- PNG === [gend: masc, num: sing]. pronoun(PNG, poss, _, 'their') :- PNG === [num: plural]. %em %If the screen mode refers to the cb it can use a definite. %this email/this contact etc. Note that the object must be the cb. %if underspecified the cb will be instantiated as one. component(refexp, en-_, Mode, FD, refexp_empty) :- FD === [ sem:[ type:ObjectType, centering:[current:[cf: 0, cb: 0] ] ], Mode:[text: '', realized: 0 ] ], given(ObjectType). % dr % if underspecified, we don't realize at all. component(refexp, en-_, Mode, FD, refexp_unspecified) :- FD === [ sem:[ type:ObjectType, centering:[current:[cf: 0, cb: 0] ] ], Mode:[text: '', realized: 0 % must be zero, in case it's a complement! ] ], notgiven(ObjectType), freeze(ObjectType, fail). % may not be instantiated at a later point in time! /* these are all the centering transitions */ /* not in use -- the problem is that the cb cannot be determined until it is clear which or the referring expressions are going to be realized in the utterance. only one of these - the one that is the highest ranking one in Cf(U i-1) - will receive 'cb' status. */ /* component(centering_transition, en-_, Mode, FD, continue_cb) :- FD === [ current:[cb:CBCP, cp:CBCP, form:CBF], previous:[cb:CBPrev], utterance:[ cb_form:CBF, transition:continue] ], (CBCP = CBPrev ; CBPrev = none ), CBCP = 1. component(centering_transition, en-_, Mode, FD, continue_noncb) :- FD === [ current:[cb:CBCP, cp:CBCP], previous:[cb:CBPrev], utterance:[ transition:continue] ], (CBCP = CBPrev ; CBPrev = none ), (CBCP = 0; CBCP = none). component(centering_transition, en-_, Mode, FD, retain_cb/CBPrev/ZeroOrNone) :- FD === [ current:[cb:1, cp:ZeroOrNone, form:CBF], previous:[cb:CBPrev], utterance:[ cb_form:CBF, transition:retain] ], (CBPrev = 1 ; CBPrev = none ). % (ZeroOrNone = 0; ZeroOrNone = none). % to be realized as constrained when possible component(centering_transition, en-_, Mode, FD, retain_nocb/CBPrev) :- FD === [ current:[cb:0], % cp is unknown previous:[cb:CBPrev], utterance:[ transition:retain] ], (CBPrev = 1 ; CBPrev = none ). component(centering_transition, en-_, Mode, FD, retain_none_cb) :- FD === [ current:[cb:none, cp:NotNone], % cp is unknown previous:[cb:none], % previously, must be none utterance:[ transition:retain] ]. % (NotNone = 0; NotNone = 1). % NotNone to be implemented when constraints are available. otherwise it will only % generate ambiguous structures or stuff that is pruned lateron. */ /* retain, smooth-shift, rough-shift are still missing! */ /* this */ /* component(refexp, en-_, voice, FD, Utterance, refexp_deictic_voice) :- Utterance === [utterance: [cb:ThisObjectID]], FD === [ sem: [ png: [num: sing], objectid: ThisObjectID, centering: [ current:[ cb:CB, cp:CP ] ], type:ObjectType ], typetext: [ objecttype: ObjectType, voice: [cat: objtype, text: TypeText ] ], voice:[ form:deictic, prefix:Pre, realized: 1, text: template('~w this! ~w', [Pre, TypeText]) ], screen:[ form:full, realized: 1, highlighted:1 ] ], % deictics must be either on top of the current CF (deictic) % on in the CB (discourse-deictic) when(ground((CB,CF)), ((CB=1;CP=1), !)). */ /* Nota bene: The CF setting (after grammar application) has not been implemented yet. Sorry! dr 09/2004 See my MSc thesis for a definition of the algorithm that would need to be implemented. */ /* no deictics from screen to voice comm_component(refexp, en-_, screen, FD, Utterance, refexp_deictic_screen) :- Utterance === [utterance: [cb:ThisObjectID]], FD === [ sem:[png: [num: sing], objectid:ThisObjectID, centering:[ current:[cb:1, highlighted:1], utterance:[cb:ThisObjectID] ], type:ObjectType ], typetext: [ objecttype: ObjectType, screen: [cat: objtype, text: TypeText ] ], screen:[form:deictic, prefix:Pre, realized: 1, text: template('~w this ~w', [Pre, TypeText])] ]. */ /* more stuff that is shared between grammars */ % object types % this translates a single object type (from the knowledge base) % to a natural language noun component(objtype, en-_, Mode, FD, objtype_1) :- ( KBType/Text = email/'e-mail'; KBType/Text = appointment/'appointment'; KBType/Text = document/'document'; KBType/Text = 'contact'/contact; KBType/Text = 'person'/person ), FD === [ objecttype: KBType, Mode: [text: Text] ]. mug-workbench/centering.pl0000644000076700000240000002043610127046041015673 0ustar drstaff00000000000000/* Centering instantiation These predicates establish links between the centering information of each object instance in an utterance, and then between the utterances -- acording to transitions. At the end of the process, the transitions should be decided and the centering information instantiated. - unfinished - current issue: weird cyclism in term, probably bug in replaceSemEntities Author: David Reitter $Log: centering.pl,v $ Revision 1.3 2004/06/27 17:46:15 dr merge with dmdev branch Revision 1.2.2.2 2004/05/25 14:01:34 dr get_proptype fix Revision 1.2.2.1 2004/05/21 20:44:33 dr removed singleton warning Revision 1.2 2004/04/02 23:56:47 dr merged dev branch Revision 1.1.2.11 2004/04/02 19:12:39 dr no error message any more when scope attribute and similar stuff is preprocessed Revision 1.1.2.10 2004/03/31 23:47:04 dr can determine cb, various improvements Revision 1.1.2.9 2004/03/31 19:30:30 dr work on centering. socnet grammar generates the odd pronoun every now and then! Revision 1.1.2.8 2004/03/31 08:08:35 dr centering, fixes -- took CB planning out again Revision 1.1.2.7 2004/03/30 21:52:57 dr work_on_centering Revision 1.1.2.6 2004/03/24 01:48:39 dr new centering architecture implemented: single utterances are realized directly starting with 'multimodal', a discourse is realized with 'discourse'. Text planning has essentially a separate grammar. The entry point for this is the 'plan' component, which takes discourse semantics in a 'sem' attribute and has a 'plan' attriibute as outcome. Revision 1.1.2.5 2004/03/23 14:44:13 dr centering Revision 1.1.2.4 2004/03/23 01:40:00 dr dev Revision 1.1.2.3 2004/03/19 13:28:30 dr one bugfix in sbt Revision 1.1.2.2 2004/03/19 13:23:48 dr one bugfix in sbt (display, used in pfd/1 pretty-printing), which generated cyclic terms when outputting to screen. Also optimization Revision 1.1.2.1 2004/03/18 21:10:44 dr first version, still buggy */ :- ensure_loaded(tools). :- ensure_loaded(display). :- ensure_loaded(debug). :- use_module('kb_engine', [ get_proptype/3 ]). % test case tc :- ex(demo1, Ex), linkCenters([Ex], [ExL]), pfd(ExL). /* linkCenters This takes a list of the entities in the previous utterance (empty if first utterance), the current utterance FD (U2) and instantiates an utterance FD with linked entities and a list of entities in U2. */ linkCenters(U1Entities, U2, U2Linked, U2Entities) :- % find all semantic entities and replace them replaceSemEntities([x:U2], [x:U2Linked], [], [], ListToLink, ListLinked), % link all the centers linkCentersOneUtterance(ListToLink, _, U1Entities, [], U2Entities, ListLinked). findFocus(FD) :- replaceSemEntities([x:FD], [x:_], [], [], ToLink, _), determineCB(ToLink). %replaceSemEntities(FD, FDNew, ToLink, Linked, ToLink2, Linked2) % finds all sem. entities in the FD and binds them with a variable % in ToLink2. Creates a new FD (FDNew) that has the same % structures, but variables in place of all semantic entities, % which are listed in Linked2. For each variable in ToLink2, there % is a variable in Linked2, and FD/FDNew are isomorph (?) via % the pairs from ToLink2 and Linked2. replaceSemEntities(FD, FD, ToLink, Linked, ToLink, Linked) :- (var(FD); atom(FD); integer(FD)), !. replaceSemEntities([F|R], [F2|R2], ToLink, Linked, ToLink4, Linked4) :- !, (nonvar(F) -> (F= A:V;F=V), !, (true -> ( replaceSemEntities(V, VR, ToLink2, Linked2, ToLink3, Linked3), (is_fd(V) -> fd_read_value(V, type, _, Type), (is_no_centering_object(Type) -> V2 = V, ToLink2 = ToLink, Linked2 = Linked ; ToLink2 = [VR|ToLink], Linked2 = [V2|Linked] ) ; V2 = V, ToLink2 = ToLink, Linked2 = Linked ), F2 = A:V2 ) ; F2=F, ToLink3 = ToLink, Linked3 = Linked ) ; F2 = F, ToLink3 = ToLink, Linked3 = Linked ), replaceSemEntities(R, R2, ToLink3, Linked3,ToLink4, Linked4). % everything else % for example paths like 'task/email' replaceSemEntities(FD, FD, ToLink, Linked, ToLink, Linked). is_no_centering_object(Type) :- var(Type), !. % a non-centering object has no 'centering' property is_no_centering_object(Type) :- \+ get_proptype(Type, centering, _). linkCentersOneUtterance([], _, _, Store, Store, []). linkCentersOneUtterance([F|R], UttCentFD, InstancesPriorUtt, ObjectStorage, StoreAcc, [FNew|RNew]) :- % instantiate centering prev / current and link them somehow % the current center has % fd_bind_value(F, sem, Sem), % nonvar(Sem), fd_bind_value(F, objectid, ID), (var(ID) -> gensym(obj, ID); true), % try to find old centering information % read first matching element in list (memberchk(ID-_-SemPrev, ObjectStorage) -> % object was realized previously in this utterance % read the previous realization info unif(SemPrev, [centering:[current:PreviousCentering|_]|_]) ; (memberchk(ID-_-SemPrev, InstancesPriorUtt) -> % Object was mentioned in previous utt unif(SemPrev, [centering:[current:PreviousCentering|_]|_]) ; % Object was not mentioned in previous utt PreviousCentering = [ cp:0, cb:none, cf:0, form:null |_ ] ) ), !, % does this instantiation have centering information? fd_read_value(F, centering, _, Cent), (var(Cent) -> % no, good F=FNew ; % yes, we need to copy then copy_term(F, FNew1), remove_attributes(FNew1, FNew, [centering]) ), % target is FNew % all FDs share the same utterance structure unif(FNew, [centering:[previous:PreviousCentering, utterance: UttCentFD|_]|_]), linkCentersOneUtterance(R, UttCentFD, InstancesPriorUtt, [ID-_-FNew|ObjectStorage], StoreAcc, RNew). /* % find out the discourse status DR: this has to be done with the PREVIOUS utterance, not the current one we cant do thuis here anyways discourse old depends on whether it was mentioned and had a form != null somewhere this can't be done unification wise only after generation of utterance that means 1. generate plan (order sentences) 2. linkCenters 3. for each utterance a) instantiate discourse status depending on previous instantiations b) generate c) determine centering transition for utterance d) optimize via b) and c) e) determine focus set for U f) determine cp for U henschels algorithm defines 'focus set': everything in U that is discourse_old plus subject focus attribute: 1 if in focus set 0 if not pronoun realization if centering:previous:focus:1 strong parallelism: ignore for now. % read first matching element in list (memberchk(ID-_-SemPrev2, AllInstances) -> % object was realized previously in an earlier utterance % read the previous realization info fd_read_value(SemPrev2, centering:current:form, 0, Form), (Form == null -> Status = discourse_old ; Status = discourse_new ) ; Status = discourse_new ), */ /* the item realized in Ui that has the lowest 'previous:cf' value greater than zero gets to be the CB */ /* at the end, we know that the assumed CB is the actual CB, so we can bind the value to 1 */ determineCB(L) :- determineCB(L, 999999, _, _). % end of recursion, no CB has been found determineCB([], 999999, _, none) :-!. % end of recursion, CB was found determineCB([], _, 1, 0). /* this won't work because we don't know what exactly is going to be realized, and what is going to be empty. therefore, we cannot decide what the CB is going to be! */ determineCB([_ID-_-F|R], CFValue, CBValue, NonCBValue) :- % unrealized stuff -> null fd_bind_value(F, centering:current:form, CurrForm), (var(CurrForm) -> CurrForm=null; true), fd_read_value(F, centering:previous:cf, 0, PrevCFValue), ((PrevCFValue>0, PrevCFValue (/* found a new CB */ /* bind previously assumed CB to 0 */ CBValue = NonCBValue, /* the NewCBValue is not instantiated, but we assume that F is the new CB */ fd_bind_value(F, centering:current:cb, NewCBValue), NewCFValue = PrevCFValue ) ; ( /* this is not a new CB, keep the currently assumed CB */ NewCBValue = CBValue, NewCFValue = CFValue, /* not the CB */ fd_bind_value(F, centering:current:cb, NonCBValue) ) ), determineCB(R, NewCFValue, NewCBValue, NonCBValue). mug-workbench/._CHANGELOG0000400000076700000000000000012210410110012014737 0ustar drwheel00000000000000Mac OS X  2 REMAxmug-workbench/CHANGELOG0000644000076700000240000001521710410110012014554 0ustar drstaff00000000000000MUG System Fission - Changelog David Reitter, dreitter at inf.ed.ac.uk ** This file describes overall changes in Fission ** Refer to the CVS logs of source files for more detailed information. ***************** 1.2 A fix to make it compatible with latest (>=5.5) versions of SWI Prolog. ***************** 1.1 small bugs in documentation (./fi instead of ./mug) took out deictics from big grammar better warning message if template arguments are bad assumes default scoring for unknown (new) modes simple-grammar now has output_mode/1 specification robust against multiple output_mode declarations updated one author's e-mail addresses implemented benchmarking in benchmark.pl ***************** 1.0 - release ***************** 03 June 2004 - many improvements to the workbench. Use of CSS. - unit tests available from workbench - SWI-Prolog >=5.3.8 required - better unification algorithm. demo2 gives additional results now. - much more documentation, source code refactored and tidied up - dialogue manager included (incomplete) - best first search (and best-only search) provided. change setting in fission.pl ***************** 10 Feb 2004 Over the past couple of days, Fission saw massive changes to its internal ongoings. These contribute to two main achievements: - Speed and memory optimizations - Scoring consolidation, improvements - Error checking ******************************************************************************************** Speed: ******************************************************************************************** - the code responsible for storing intermediate results ready to be used by the workbench has changed. (SWI specific.) It is now twice as fast, and uses half the memory. Running the maximum of 100 examples should be manageable again. - the central unifier was completely rewritten in order to allow for some optimizations such as minimum remaining values optimization. The optimization itself could not speed up the process (we're working on it...), however, the rewrite brought about a 50 percent speed improvement for the MUG application code (try fist/1 instead of fisd/1). This is evident in YAP as well, and across several big examples. Search techniques such as A* search (or at least Branch&Bound) are very hard to realize in Prolog. Given their known memory requirements, combined with Prolog's bad performance when copying large terms, it is unclear whether A*search would really improve things. - The scoring improvement (see below) speeds up the process further. Data: teested with SWI, development (debugging environment), fisd command and YAP, production environment , fist command tested on Feb7, 04 CVS main trunk release, Powerbook: SWI fisd, demo1, 64 variants, 12.34 CPU time, effectively 37.46 seconds (memory swapping) SWI fisd, ex2, 9 variants, 1.64 CPU in 2.09 seconds YAP fist, demo1, 2050ms YAP fist, ex2, 440ms performance with new revision, Powerbook: SWI fisd, demo1, 64 variants, 2.94 CPU time, effectively 4.98 seconds SWI fisd, ex2, 9 variants 1.03 CPU in 1.58 seconds YAP fist, demo1, 580ms YAP fist, ex2, 290ms tested on Feb8, 04 CVS main trunk release, Franka: YAP fist, demo1, 719ms YAP fist, ex2, 164ms performance with new revision (with MRV opt.), Franka: YAP fist, demo1, 203ms YAP fist, ex2, 104ms ******************************************************************************************** SCORING: ******************************************************************************************** - The utility score is now computed in two steps: before applying the MUG, an arithmetic expression is calculated (score:utility:X in the FDs). This way, we can be sure that every semantic entity is only scored once. - The scoring model functions for redundant information was improved - The scoring model has now device coefficients phi (see HLT paper) - Reading cost on screen is lower than before ******************************************************************************************** ERROR CHECKING ******************************************************************************************** - less screen output when we start ./fi - syntax errors in the code are marked red - MUG and KB warnings are yellow now - the KB serves as a type hierarchy for the FDs. FDs are not fully typed, but when equipped with a type attribute, they will be checked against the types defined in the KB. Attributes should be declared and typed in the KB. Undeclared attributes in typed FDs, values with non-matching types or FDs with non-existing types will lead to a complaint of the structure checking algorithm (warning only). FDs in the input and the MUG are checked like this. This feature is experimental. Warnings should never break the process. They can be resolved over time. ******************************************************************************************** UNIT TESTS ******************************************************************************************** - some unit tests produce output - most unit tests produce "malformed request". I investigated this and found that the "scope" attribute always (983 cases) is a prolog term like user_intention/email/bcc instead of a list containing the scope elements, such as [user_intention/email/bcc]. In 19 cases of several elements, it is given as a string, i.e. "task/email/to,task/email/cc,task/email/bcc" Giving a prolog string doesn't really make sense. In 5 cases, the syntax was scope: "task/email/to,task/email/cc,task/email/bcc,task/email/priority,task/email/body]", This bugs seem to result from a problem with the excel2mug script and the excel spreadsheets. My last revision of this left some irregularities. The output of fission was "malformed request" (as no MUG generation path could be found), which was correct for these cases. - assuming that we wanted to keep lists in the scope attribute instead of terms (i think we talked about this), I changed the excel2mug script accordingly and regenerated the auto test cases. - the sockets interface now outputs the request / session ID with its answer, which comes in handy when you want to trace a problem. Well, the IDs in the unit tests were 23784 all the time... so I changed that as well in the excel2mug program. - Some unit tests still don't work, and for the ones i have taken a look at, this is not because of technical problems with the engine, but rather missing components in the MUG or the like: changelist (see example confirm1) is not an action type in the MUG inform (see ex inform1) is not yet a task (dialogue act) type in the MUG To DO: - scoring, complementarity / redundancy bias, model explicitly mug-workbench/._compat_gnu.pl0000400000076700000000000000012210410107133016230 0ustar drwheel00000000000000Mac OS X  2 REMAxmug-workbench/compat_gnu.pl0000644000076700000240000001432110410107133016040 0ustar drstaff00000000000000/* GNU Prolog compatibility layer This implements many essential predicates found in SWI Prolog and many other Prolog implementations that aren't available in GNU Prolog. Generally, these predicates behave as expected; in exceptional circumstances (i.e. errors/argument instantiation which throw an exception),these predicates may silently fail. In an implementation that is ready to be compiled (and that's what's GNU Prolog good at), these bugs should have been eliminated. Time-complexity and optimization issues may be differ between SWI/GNU. In general, SWI will be much faster at things like flag/3, as we simply use the assert/retract mechanism. Additionally, you need to include lists.pl from the SWI distribution. Some predicates cannot be used in their original form: Use eval_arith/2 instead of is/2 to enable custom functions in GNU/YAP. Author: David Reitter, reitter at media.mit.edu -- stealing and copying stuff from various sources, in particular from Jan Wielemaker's SWI Prolog. Version: $Id: compat_gnu.pl,v 1.6 2004/06/27 17:46:15 dr Exp $ (C) 2003 Media Lab Europe Ltd. Licensed under the GNU public license. See end for licensing information. */ prolog_verbosity(_). not(Goal) :- \+ Goal. % is_list taken from the SWI manual is_list(X) :- var(X), !, fail. is_list([]). is_list([_|T]) :- is_list(T). succ(I,J) :- nonvar(I), I>=0, J is I+1. succ(I,J) :- nonvar(J), I is J-1, I>=0. sformat(String, Templ, Args) :- open_output_atom_stream(Stream), format(Stream, Templ, Args), close_output_atom_stream(Stream, String). % SWI-Strings are represented as codes-lists in GNU string_to_atom(Atom, Atom) :- atom(Atom), !. string_to_atom(String, Atom) :- atom_codes(Atom, String). string(S) :- is_codes(S). is_codes(X) :- var(X), !, fail. is_codes([]). is_codes([N|T]) :- integer(N), N>0, N<256, is_codes(T). % evaluation :- dynamic(register_arithmetic/1). arithmetic_function(Functor/Arity) :- %print(register_arithmetic(Functor/Arity)),nl, retractall(register_arithmetic(Functor/Arity)), assertz(register_arithmetic(Functor/Arity)). eval_arith(Term, Result) :- Term =.. [F|Args], eval_arith2(Args, Args2), ((length(Args2,L), register_arithmetic(F/L), append(Args2, [Result], Args3), ATermN =.. [F|Args3], ATermN, !) ; (ATerm =.. [F|Args2], Result is ATerm % try internal eval routine )), !. eval_arith2([], []). eval_arith2([Term|Rest], [TermResult|RestResult]) :- eval_arith(Term, TermResult), eval_arith2(Rest, RestResult). % rewrite atom into lower case downcase_atom(Atom, AtomLower) :- atom_chars(Atom, Chars), downcase_codes(Chars, CharsLower), atom_chars(AtomLower, CharsLower). downcase_codes([],[]). downcase_codes([F|R], [FL|RL]) :- lower_upper(FL,F), downcase_codes(R,RL). % For all possible Bindings in Cond, Action can be proven. forall(Cond, Action) :- Cond, (Action -> fail ; (!, fail)). forall(_,_). flag(Sym, Old, NewExp) :- g_read(Sym, Old), nonvar(NewExp) -> New is NewExp, % evaluate g_assign(Sym, New) ; g_read(Sym, New). % between(Min, Max, X) % X is a value between Min and Max % usually used to generate all possible values [Min..Max] between(Min, Max, _) :- (var(Min);var(Max)), write('ERROR: between/3: Arguments are not sufficiently instantiated'). between(Min, Max, X) :- nonvar(X), X >= Min, X =< Max. between(Min, Max, Min) :- nonvar(Min), nonvar(Max), Min =< Max. between(Min, Max, X) :- nonvar(Min), nonvar(Max), Mincurrent_output(Str), print(''), print_message_lines(Str, 'ERROR: ', Lines), print('') ; print_message_lines(user_error, 'ERROR: ', Lines) ), format(user_error, '\033[0m', []). user:message_hook(_Term, doesntwork_warning, Lines) :- !, format(user_error, '\033[33m', []), print_message_lines(user_error, 'WARNING: ', Lines), format(user_error, '\033[0m', []). prolog_verbosity(V) :- % V = true or silent set_prolog_flag(verbose, V). if_init. % must be called at initialization time, % otherwise program will slow down in GNU if(Goal, Then) :- ((Goal *-> Then); true). if(Goal, Then, Else) :- ((Goal *-> Then); Else). current_host(X) :- gethostname(X). % predicates contribute by Steve Moyle: :- redefine_system_predicate(false), style_check(+singleton), style_check(-discontiguous), dynamic(false/0), dynamic(example/3). gc:- garbage_collect. depth_bound_call(G,L):-call_with_depth_limit(G,L,_). :- (predicate_property(numbervars(_,_,_),built_in) -> true; assert((numbervars(A,B,C):- numbervars(A,'$VAR',B,C)))), (predicate_property(thread_local(_),_) -> true; assert(thread_local(_))), (predicate_property(delete_file(_),built_in) -> true; assert_static(delete_file(_))). assert_static(X):- assert(X). system(X):- shell(X). exists(X):- exists_file(X). % timing time(Goal, CPUT) :- statistics(cputime,CPU), writeln(CPU), call(Goal), statistics(cputime,CPU2), writeln(CPU2), CPUT is CPU2-CPU. % term analysis % this is a yap predicate read_from_chars(Chars, Term) :- atom_chars(Atom, Chars), atom_to_term(Atom, Term, _). current_prolog_implementation(swi_prolog). % workaround (needed in some versions of swi prolog) :- ensure_loaded(library(readutil)). read_util:file_options(X) :- read_util:file_option(X). /* Authors: David Reitter, Steve Moyle Copyright (C): 2003 Media Lab Europe This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA As a special exception, if you link this library with other files, compiled with a Free Software compiler, to produce an executable, this library does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ mug-workbench/._compat_yap.pl0000400000076700000000000000012210410107162016232 0ustar drwheel00000000000000Mac OS X  2 REMAxmug-workbench/compat_yap.pl0000644000076700000240000001435610410107162016052 0ustar drstaff00000000000000/* YAP Prolog / SWI Prolog compatibility layer This implements many essential predicates found in SWI Prolog and many other Prolog implementations that aren't available in YAP Prolog. Generally, these predicates behave as expected; in exceptional circumstances (i.e. errors/argument instantiation which throw an exception),these predicates may silently fail. Eliminate your bugs using SWI's excellent development facilities. Time-complexity and optimization issues may be differ between SWI/GNU/YAP. In general, SWI will be much faster at things like flag/3, as we simply use the assert/retract mechanism. Some predicates cannot be used in their original form: Use eval_arith/2 instead of is/2 to enable custom functions in GNU/YAP. Author: David Reitter, reitter at media.mit.edu -- stealing and copying stuff from various sources, in particular from Jan Wielemaker's SWI Prolog. Version: $Id: compat_yap.pl,v 1.10 2004/06/28 22:35:13 dr Exp $ (C) 2003 Media Lab Europe Ltd. Licensed under the GNU public license. See end for licensing information. */ :- use_module(library(system)). :- use_module(library(lists)). :- use_module(library(charsio)). :- use_module(library(terms)). prolog_verbosity(silent) :- !, yap_flag(informational_messages, off). prolog_verbosity(_) :- yap_flag(informational_messages, on). flag(Sym, Old, NewExp) :- ((bb_get(Sym, Old), !) ; Old=0), New is NewExp, bb_put(Sym, New). % emulate backtrackable global variables b_setval(Atom, Value) :- recorda(Atom, Value, Ref), (true ; erase(Ref), fail). b_getval(Atom, Value) :- recorded(Atom, Value, _Ref), !, b_setval(Atom, Value). % may instantiate global variable further b_getval(Atom,_) :- throw(error(existence_error(variable, Atom), context(b_getval/2))) . % not implemented dwim_match(_,_) :- fail. hash_term(T, H) :- term_hash(T, H). exists_directory(X) :- file_exists(X). ignore(Goal) :- Goal, !. ignore(_). %simple gensym % gensym(+Base, -Unique) gensym(Base, Atom) :- atom_concat('gs_', Base, Key), flag(Key, N, N+1), number_atom(N, NA), atom_concat(Base, NA, Atom). concat_atom(_,_,_) :- fail. % just define it concat_atom([], ''). concat_atom([F|R], C) :- concat_atom(R, C1), atom_concat(F, C1, C). sformat(String, Templ, Args) :- format_to_chars(Templ, Args, String). if(Goal, Then) :- if(Goal, Then, true). % SWI-Strings are represented as codes-lists in yAP string_to_atom(String, Atom) :- atom_codes(Atom, String). string(S) :- is_codes(S). is_codes(X) :- var(X), !, fail. is_codes([]). is_codes([N|T]) :- integer(N), N>0, N<256, is_codes(T). %time time(Goal) :- time(Goal, CPUT), write('time: '), write(CPUT), write('ms.\n'). time(Goal, CPUT) :- statistics(cputime,[CPU,_]), writeln(CPU), call(Goal), statistics(cputime,[CPU2,_]), writeln(CPU2), CPUT is CPU2-CPU. % internal database recordz(K,V) :- recordz(K,V,_). recorded(K,V) :- recorded(K,V,_). % For all possible Bindings in Cond, Action can be proven. forall(Cond, Action) :- Cond, (Action -> fail ; (!, fail)). forall(_,_). % between(Min, Max, X) % X is a value between Min and Max % usually used to generate all possible values [Min..Max] between(Min, Max, _) :- (var(Min);var(Max)), write('ERROR: between/3: Arguments are not sufficiently instantiated'). between(Min, Max, X) :- nonvar(X), X >= Min, X =< Max. between(Min, Max, Min) :- nonvar(Min), nonvar(Max), Min =< Max. between(Min, Max, X) :- nonvar(Min), nonvar(Max), Min E=[] ; E=[X|R], read_file(R)) */ writeln(X) :- write(X),nl. current_prolog_implementation(yap). % functions by Steve Moyle :- system_predicate(false,false), hide(false), style_check(single_var), (predicate_property(delete_file(_),built_in) -> true; assert_static((delete_file(_) :- write('file deletion not implemented in YAP compatibility layer.\n')))). % thread_local(_). % profiling, taken from the YAP manual :- yap_flag(profiling, on). list_profile :- % get number of calls for each profiled procedure setof(D-[M:P|D1],(current_module(M),profile_data(M:P,calls,D),profile_data(M:P,retries,D1)),LP), % output so that the most often called % predicates will come last: write_profile_data(LP). list_profile(Module) :- % get number of calls for each profiled procedure setof(D-[Module:P|D1],(profile_data(Module:P,calls,D),profile_data(Module:P,retries,D1)),LP), % output so that the most often called % predicates will come last: write_profile_data(LP). write_profile_data([]). write_profile_data([D-[M:P|R]|SLP]) :- % swap the two calls if you want the most often % called predicates first. format('~a:~w: ~32+~t~d~12+~t~d~12+~n', [M,P,D,R]), write_profile_data(SLP). /* Author: David Reitter Copyright (C): 2003 Media Lab Europe This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA As a special exception, if you link this library with other files, compiled with a Free Software compiler, to produce an executable, this library does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ mug-workbench/COPYRIGHT0000644000076700000240000004313110127046041014650 0ustar drstaff00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. mug-workbench/database.pl0000644000076700000240000000745010127046041015462 0ustar drstaff00000000000000%%%%%%%%%%%%%%%%%% % OBJECT DATABASE % :- module('fasil_database', [test_db/0, test_db2/0, init_db/0, new_object/2, delete_object/1, get_type/2, set_property/3, override_property/3, get_property/3, list_db/0, show_object/1]). :- use_module('kb_engine', [kb_isa/2,get_proptype/3,get_propdefault/3]). % unit tests test_db :- init_db, new_object(document, ID), user:string_to_atom(S, 'http://www.davids-welt.de/'), set_property(ID, url, S), user:string_to_atom(S2, 'text/html'), set_property(ID, type, S2), test_db2, !, kb_isa(ID, top), !, kb_isa(ID, document), !, \+ kb_isa(ID, smalldoc), !, \+ kb_isa(ID, task), !, \+ kb_isa(ID, email), !, get_property(ID, url, S), !, \+ get_property(ID, temporary, _), !. test_db2 :- kb_isa(T, thing), new_object(T, ID), set_property(ID, temporary, false), fail. test_db2 :- !, list_db. % initialize init_db :- db_eraseall, user:flag(kb_objcount, _,0). db_eraseall :- user:flag(kb_objcount, Max, Max), user:between(0, Max, SomeID), user:recorded(SomeID, _, Ref), erase(Ref), fail. db_eraseall. % create a new object new_object(Type, ObjectID) :- nonvar(Type), var(ObjectID), user:flag(kb_objcount, ObjectID, ObjectID+1), user:recordz(ObjectID, obj_type(Type)), % set initial values of properties user:forall(fasil_kb_engine:get_propdefault(Type, Prop, Val), fasil_database:set_property(ObjectID, Prop, Val)). delete_object(ObjectID) :- nonvar(ObjectID), user:forall(user:recorded(ObjectID, _Prop, Reference), erase(Reference)). get_type(SimpleType, string) :- user:string(SimpleType),!. % can't use integer because ObjectID is integer get_type(SimpleType, integer) :- integer(SimpleType),!. get_type(ObjectID, Type) :- user:recorded(ObjectID, obj_type(Type)). % sets a property. Value must unify with its current value. set_property(ObjectID, PropName, Value) :- nonvar(ObjectID), nonvar(PropName), nonvar(Value), user:recorded(ObjectID, obj_prop(PropName, Value2)), !, (kb_isa(Value, Value2);kb_isa(Value2, Value)), % override, override_property(ObjectID, PropName, Value). set_property(ObjectID, PropName, Value) :- nonvar(ObjectID), nonvar(PropName), nonvar(Value), % if not yet recorded % check type of object get_type(ObjectID, ObjectType), (get_proptype(ObjectType, PropName, PropType) -> true; (trace, write('set_property : attempt to set undeclared property '), write(PropName),write(' in object: '), show_object(ObjectID), fail)), (kb_isa(Value, PropType) -> Valuec=Value; (convertValue(Value, PropType,Valuec) -> true; (write('set_property: attempt to set incompatible value '), write(Value), write(' for property '), write(PropName),write(' in object: '), show_object(ObjectID), fail))), override_property(ObjectID, PropName, Valuec). % sets or overrides a property of an object no matter what its current value is override_property(ObjectID, PropName, Value) :- user:forall(user:recorded(ObjectID, obj_prop(PropName,_), Reference), erase(Reference)), user:recordz(ObjectID, obj_prop(PropName,Value)). % hard-coded conversion predicate convertValue(Value,string,Result) :- atom(Value), user:string_to_atom(Result,Value). % write('type conversion for '), write(Result), nl. convertValue(none,none,none). get_property(ObjectID, PropName, Value) :- nonvar(ObjectID), user:recorded(ObjectID, obj_prop(PropName,Value)). list_db :- user:flag(kb_objcount, Max, Max), user:between(0, Max, SomeID), user:recorded(SomeID, obj_type(_)), show_object(SomeID), fail. list_db :- write('---'), nl, nl. show_object(ID) :- user:recorded(ID, obj_type(Type)), write(ID),write(' is of type '), write(Type), nl, user:forall(user:recorded(ID, obj_prop(Name, Value)), (write(ID),write('.'), write(Name),write(' = '), write(Value), nl)), nl. :- initialization(init_db). mug-workbench/debug.pl0000644000076700000240000002771310127046041015010 0ustar drstaff00000000000000% FASiL Fission % Author David Reitter % last change 19-Sept-2003 /* debugging code */ % DEBUGGING SETTINGS :- dynamic(debug_out/0). :- dynamic(debug_store_scores/0). :- dynamic(debug_time_scoring/0). :- dynamic(dyn_debug_failed_area/2). :- ( current_prolog_implementation(swi_prolog) -> index(dyn_debug_failed_area(1,1)); true). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % configuration stuff debug_level(0). maxLineNumber(10000). % increase if you get 'could not set ... line number: 10001' errors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % turn debugging mode on and off mug_debug(off) :- retractall(debug_out), retractall(debug_store_scores), retractall(debug_time_scoring). mug_debug(on) :- mug_debug(off), assertz(debug_out), assertz(debug_store_scores), assertz(debug_time_scoring), debug_init. debug_init :- catch(( b_setval(debug_line_counter, 0) ), _, (show_message(error,'Debugging module unavailable.', []), mug_debug(off))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % debugging message if Goal fails guard(Goal) :- (Goal -> true ; debug_output(0, ['\nguarding: ',fd(Goal), ' failed!!!\n\n\n\n\n']) , gtrace, Goal, fail). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % backtrack over Goal forall(Goal) :- Goal, fail. forall(_). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % how many times does Goal succeed (backtracking)? count(Goal, N) :- findall(x, Goal, L), length(L, N), !. count(_, 0). :- b_setval(debug_line_counter, 0). % default value default_b_getval(Name, Var, Default) :- catch((b_getval(Name, Var1), (Var1 == [] -> Default=Var, b_setval(Name, Var) ; Var=Var1 ) ), _, (Default=Var, b_setval(Name, Var)) ), !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % output stuff on screen if debugging enabled debug_output(_,_) :- not(debug_out), !. debug_output(Lev, X) :- debug_level(Lev2), Lev >= Lev2, !, debug_output(X). debug_output(_Lev, _X). debug_output(_) :- not(debug_out), !. debug_output(X) :- copy_term_without_bindings(X,XC),!, % not very costly! debug_output2(XC), !. debug_store(Text) :- flag(debug_line_counter, RecLine, RecLine+1), RecLine1 is RecLine+1, % default_b_getval(debug_line_counter, Line, 0), % default set with :- b_getval(debug_line_counter, Line), ( Line < RecLine -> % we're backtracking flag(debug_finalized_line, NewLine, NewLine), NewLineMax is max(NewLine,Line), % print(xxxnlm:max(NewLine,Line)-NewLineMax),nl, RecLineM1 is RecLine-1, % format(terminal, '~w~n', [(dyn_debug_failed_area(NewLineMax, RecLineM1))]), assertz((dyn_debug_failed_area(NewLineMax, RecLineM1))) ; true ), b_setval(debug_line_counter, RecLine1), recordz('debuglines', Text). debug_dont_mark_next_backtracking :- debug_output(''), flag(debug_ignore_next_backtracking, _, -1), flag(debug_line_counter, RecLine, RecLine), %RecLineM1 is RecLine-1, flag(debug_finalized_line, _, RecLine). /* debug_output(X) :- % write(debug_op),nl, debug_restore_persistent_log, copy_term_without_bindings(X,XC), debug_output2(XC). % we must ensure that X remains unchanged - and stays what it is right here */ debug_output2(Var) :- var(Var), debug_store(' (unbound) ' ). debug_output2([]) :- !. debug_output2([F|R]) :- !, debug_output2(F), debug_output2(R). % store an FD by creating a persistent link to it debug_output2(fd(FD)) :- !, gensym(log_fd, Sym), recordz(Sym, FD), debug_output2(fd_link(Sym)). % store a link to an FD debug_output2(fd_link(Sym)) :- !, % this is used also when debug_restore_persistent_log restores part of the log debug_store(fd_link(Sym)). debug_output2(ruler) :- !, debug_store('
'). % print something in bold debug_output2(bold(X)) :- !, debug_store(''), debug_store(X), debug_store(''). % print something in gray debug_output2(gray(X)) :- !, debug_store('
'), debug_output2(X), debug_store('
'). % print something in red debug_output2(red(X)) :- !, debug_store(''), debug_store(X), debug_store(''). % color everything red debug_output2(red) :- !, debug_store(''). % set color to black debug_output2(black) :- !, debug_store(''). debug_output2(X) :- debug_store(X). % this will keep the logs that would otherwise % be deleted in the next backtracking run % API -- usable by client debug_keep_log_during_next_backtracking :- !. % not in use debug_retrieve_log([]) :- not(debug_out), !. debug_retrieve_log(ListOfLines2) :- % the following causes problems (weird stuff like 0/[] is not a functoin) % debug_output(''), % cleanup findall(Term, ( recorded('debuglines', Term) ), ListofLines), retrieve_insert_failed_markers(ListofLines, 0, 0, 0, ListOfLines2). % retrieve log, but filter % only lines between From and To (line numbers) % and between FromTerm and the next unifying ToTerm % always add all lines that unify with AddlCollectTemplate % return total number of lines in log in NumL debug_retrieve_log(ListOfLines2, From, To, FromTerm, ToTerm, AddlCollectTemplate,MaxTemplMatches, NumL) :- % the following causes problems (weird stuff like 0/[] is not a functoin) % debug_output(''), % cleanup flag(dbgcount_int, _, 0), (var(FromTerm) -> flag(dbgretr_on, _, 1) ;flag(dbgretr_on, _, 0) ), flag(dbgcount2_int, _, 0), findall(Term, ( recorded('debuglines', Term), flag(dbgcount_int, CC, CC+1), CC >= From, CC =< To, ( ( (Term = AddlCollectTemplate -> flag(dbgcount2_int, DBG2, DBG2+1), (DBG2 true ; flag(dbgretr_on, _, 0), fail ) ; true), (var(FromTerm) -> flag(dbgretr_on, 1, 1) % must be on ; (Term = FromTerm -> flag(dbgretr_on, _, 1) ; ( Term = ToTerm -> flag(dbgretr_on, _, 0), fail ; flag(dbgretr_on, 1, 1) % succeed only if we're collecting stuff! ) ) ) ) -> true ; % last chance to succeed: matches collection template Term = AddlCollectTemplate ) ), ListofLines), flag(dbgcount_int, NumL, 0), retrieve_insert_failed_markers(ListofLines, 0, 0, From, ListOfLines2). retrieve_insert_failed_markers([], _, _, _, []). retrieve_insert_failed_markers([F|R], Count, Level, 0, CC) :- !, count(dyn_debug_failed_area(Count,_), On), CountX is Count-1, count(dyn_debug_failed_area(_,CountX), Off), Level1 is Level+On-Off, %(atom(F1) -> atom_concat(Level1, F1, F) ; F1=F), ((Level1>0, Level=0) -> CC=['
',F|RR] ; ((Level1=0, Level>0) -> CC=['
',F|RR] ; CC=[F|RR] ) ), Count1 is Count+1, !, retrieve_insert_failed_markers(R, Count1, Level1, 0, RR). retrieve_insert_failed_markers(List, Count, Level, Offset, CC) :- Offset>0, count(dyn_debug_failed_area(Count,_), On), CountX is Count-1, count(dyn_debug_failed_area(_,CountX), Off), Level1 is Level+On-Off, Offset1 is Offset-1, ((Level1>0, Level=0) -> CC=['
'|RR] ; ((Level1=0, Level>0) -> CC=['
'|RR] ; CC=RR ) ), Count1 is Count+1, !, retrieve_insert_failed_markers(List, Count1, Level1, Offset1, RR). /* retrieve_insert_failed_markers([F|R], Count, Status, CC) :- ((dyn_debug_failed_area(From,To), From =< Count, To >= Count) -> (Status=on -> CC=[F|RR] ; CC=['
',F|RR] ), Status1=on ; (Status=on -> CC=['
',F|RR] ; CC=[F|RR] ), Status1=off ), Count1 is Count+1, retrieve_insert_failed_markers(R, Count1, Status1, RR). */ debug_clear_log :- retractall(dyn_debug_failed_area(_,_)), forall( recorded('debuglines', _Term, Ref), erase(Ref) ), flag(debug_line_counter, _, 0), flag(debug_finalized_line, _, -1). debug_line_cvt(debug_concat(P, _E), CP) :- debug_line_cvt(P, CP). % succeeds once first with prefix, then again with full form debug_line_cvt(debug_concat(_P, E), CE) :- !, debug_line_cvt(E, CE). % don't do the next one as well debug_line_cvt(P, P). % default case % special copy_term copy_term_without_bindings(X,XC) :- copy_term(X,XC), term_variables(XC,Vars), foreach(V, Vars, ( del_attr(V, when), del_attr(V, freeze))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % nice colored output show_message(Type, Form) :- show_message(Type, '~w', [Form]). show_message(info,Format, Args) :- get_escape(green, On, Off), format('~s', [On]), format(Format, Args), format('~s~n', [Off]). show_message(warning,Format, Args) :- get_escape(orange, On, Off), format('~s', [On]), format(Format, Args), format('~s~n', [Off]). show_message(error,Format, Args) :- get_escape(red, On, Off), format('~s', [On]), format(Format, Args), format('~s~n', [Off]). get_escape(Num, SOn, SOff) :- flag(debug_format, html, html), !, color_code(Num, Color), sformat(SOn,'', [Color]), sformat(SOff,'', []). get_escape(Num, SOn, SOff) :- color_code(Num, Color), sformat(SOn,'~c[~dm', [27, Color]), sformat(SOff,'~c[~dm', [27, 0]). color_code(X,X) :- flag(debug_format, html, html), !. color_code(green, 32). color_code(red, 31). color_code(orange, 33). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%% Unit tests %%%%%% mug_debug_test(1) :- mug_debug(on), debug_clear_log, debug_output(hello), debug_output(world), debug_retrieve_log(L), print(L), L == [hello, world]. mug_debug_test(2) :- mug_debug(on), debug_clear_log, debug_output(hello), ((debug_output(stupid), fail); debug_output(world)), debug_retrieve_log(L), print(L), L == [hello, stupid, world]. mug_debug_test(3) :- mug_debug(on), debug_clear_log, debug_output(hello), ((debug_output(you), debug_output(stupid), debug_keep_log_during_next_backtracking, fail); debug_output(world)), debug_retrieve_log(L), print(L), L == [hello, '
', you, stupid, '
', world]. mug_debug_test(4) :- mug_debug(on), debug_clear_log, debug_output(hello), ((debug_output(you), debug_output(stupid), fail); debug_output(world)), ((debug_output('i wanna know'), debug_dont_mark_next_backtracking, fail); true), % the following to be discarded ((((debug_output(tell), debug_output(me), debug_keep_log_during_next_backtracking, fail); debug_output(now)), fail); true), ((debug_output(how), debug_output(are), debug_output(you), debug_keep_log_during_next_backtracking, fail); debug_output('?')), debug_retrieve_log(L), print(L), L == [hello, '
', you, stupid, '
', world, '
', how, are, you, '
', ?]. mug_debug_test(5) :- mug_debug(on), debug_clear_log, ((between(0,1000, X), debug_output(X), debug_keep_log_during_next_backtracking, fail); true), debug_retrieve_log(L2), print(L2). mug_debug_test(6) :- mug_debug(on), debug_clear_log, ((between(0,1000, X), debug_output(X), fail); true), debug_retrieve_log(L2), print(L2). mug_debug_test(66) :- mug_debug(on), debug_clear_log, ((between(0,5, X), debug_output(X), fail); true), debug_retrieve_log(L2), print(L2). mug_debug_test(7) :- mug_debug(on), debug_clear_log, debug_output(1), ((( debug_output(21), (debug_output(22), fail ; true) ), fail); true), debug_output(3), debug_output(4), debug_retrieve_log(L2), print(L2). mug_debug_test(8) :- mug_debug(on), debug_clear_log, findall(S, (sentence(S), debug_output(sentence(S)), debug_dont_mark_next_backtracking), L), debug_retrieve_log(L2), print(L2),nl,nl, print(L). sentence([Subject, Verb, Object]) :- pers(Subject), debug_output(subject:Subject), verb(Verb), debug_output(verb:Verb), pers(Object), debug_output(obj:Object), Subject \= Object. pers(dave). pers(john). pers(mary). verb(loves). verb(beats). mug-workbench/display.pl0000644000076700000240000003327710127046041015371 0ustar drstaff00000000000000%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Show Bound terms -- Variable binding term printer % Shows internal bindings in a term. % % $Id: display.pl,v 1.10 2004/06/27 17:46:15 dr Exp $ % % by David Reitter, reitter at mle.mit.media.edu % licensed under the GNU General Public License % % WHAT DOES THIS DO? % In term(D, D), the two arguments are co-bound. % normally, if D is instantiated, the value of D will be printed twice: % T=term(D,D), D=bound(a,b), write(T) % will print "term(bound(a,b),bound(a,b))". This does not reveal the binding, % and leads to large output, especially when working with unification-based % mechanisms where bindings occur often and contain large structures. % The predicate sbt/2 converts the above example as follows: % T=term(D,D), D=bound(a,b), sbt(T, T2), write(T2) % yields "term( =bound(a, b), )". % This shows not the extensional description of the term, but its intensional one. % % REQUIREMENTS: % Tested with SWI-Prolog. Other Prolog implementations should run, but you might % have to replace the call to flag/3 at the end of this file. % % NOTE: % Bindings are only shown for complex terms like lists or a(b,c) or a/b, but not % for single atoms. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Acc, AccHole is a DIFFERENCE LIST % Acc = [a,b,c|Hole] % each element of this diff list contains v(OrigTerm, NameText/Anchor/FirstOcc/NewTerm) % OrigTerm -- the exact Term as it was originally % Name -- the name we assigned to this term % FirstOcc -- unified with the first Occurrence of this Term, but in the target Structure. % initially, this is an unbound variable. When a second occurrence of the term % (i.e. a binding) is encountered, it is bound to a variable label:NewTerm. % In the end, sbt_instantiate_singleterms/1 will bind all remaining FirstOcc to % NewTerm, so that Terms that are not referenced are not labeled. % NewTerm -- this is the new term replacement as calculated recursively :- ensure_loaded(tools). % identmember sbt_ex :- Term = p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound]), % Term = [fine:C, ho:C], B=[a,b|_], A=this_atom, D=this_term(1,2), sbt(Term,New), write(New). prof :- Term = p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/[so,nicely,nested,and,[so,nicely,nested,and,[so,nicely,nested,and,[so,nicely,nested,and,[so,nicely,nested,and,[so,nicely,nested,and,[so,nicely,nested,list]]]]]]]/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound])/p(p,B,fine:B,fine:C,good(B,A/D),[some,things, like,C,or,A,or,D,are,bound]), profiler(_,true), times(100,sbt(Term,_)), show_profile(cumulative, 12). %dr_print_term(Term, Stream) :- % display_cache_get(ppt, Term, TempContent), !, % format(Stream, '~s', [TempContent]). :- use_module('drprint.pl'). dr_print_term(Term, Stream) :- dr_print_term:print_term(Term, [output(Stream), indent(auto)]). % debugging stuff % pretty-print FD as term, simply number the unbound variables pp(X) :- copy_term(X,XC), % remove all attributes term_variables(XC, FDV), forall(member(V, FDV), (attvar(V) -> put_attrs(V, []) ; true)), numbervars(XC,var, 0, _), (flag(sbt_variables, html, html) -> html_print_fd(XC) ; prolog_pretty_print:print_term(XC, [write_options([quoted(false)])]),nl ), !. % pretty-print FD, show variable bindings pfd(FD) :- % copy_term(FD, FDC), \+ \+ ( % remove all attributes term_variables(FD, FDV), forall(member(V, FDV), (attvar(V) -> put_attrs(V, []) ; true)), unwrapeval(FD, FDE), remove_open_ends(FDE,FDD), sbt(FDD, FDO), pp(FDO) ), !. % pretty-print FD, don't show variable bindings pfd_full(FD) :- % copy_term(FD, FDC), \+ \+ ( % remove all attributes term_variables(FD, FDV), forall(member(V, FDV), (attvar(V) -> put_attrs(V, []) ; true)), unwrapeval(FD, FDE), remove_open_ends(FDE,FDD), (flag(sbt_variables, html, html) -> html_print_fd(FDD) ; prolog_pretty_print:print_term(FDD, [write_options([quoted(false)])]),nl ) ), !. remove_oe_empty. % :- fail. remove_open_endsL([],[]). remove_open_endsL([F|R], [F|RC]) :- var(F),!, remove_open_endsL(R, RC). remove_open_endsL([F|R], [FC|RC]) :- remove_open_ends(F, FC), remove_open_endsL(R, RC). remove_open_ends(T, T) :- var(T), !. % R=[]. remove_open_ends([], []) :- !. remove_open_ends([F|R], [F1|R1]) :- !, remove_open_ends(F,F1), (var(R) -> ( remove_oe_empty -> gensym('oe', Sym), R1=[empty(Sym)] ; R1=[]) ; remove_open_ends(R,R1)). remove_open_ends(Att:Val, Att:Val1) :- !, (is_fd(Val) -> remove_open_ends(Val,Val1) ; (is_list(Val) -> remove_open_endsL(Val, Val1) ; (compound(Val) % complex terms -> Val =.. [Func|Args], remove_open_ends(Args,ArgsT), Val1 =.. [Func|ArgsT] ; Val=Val1 ) ) ). remove_open_ends(V=T, V=TR) :- !, remove_open_ends(T,TR) . remove_open_ends(V, T) :- compound(V), V =.. [Func|Args], !, remove_open_ends(Args,ArgsT), T =.. [Func|ArgsT]. remove_open_ends(T, T). sbt_ignorefunctor(':'). sbt(T,N) :- sbt(T,N,[session(_)]). sbt(T,N, Options) :- memberchk(session(Session), Options) , sbt_init_gensym(Session), flag(sbt_variables, X, X), ((memberchk(variable_names(Bindings), Options), Bindings\=[]) -> bagof(v(Var,VarPrefix/NewName/_/_), NewName^Var^VarPrefixS^VarPrefix^(member(NewName=Var, Bindings), (X=='latex' -> sformat(VarPrefixS, '\\fbox{~w}', [NewName]), string_to_atom(VarPrefixS, VarPrefix) ; X == 'html', sformat(VarPrefixS, '\\~w\\', [NewName]), string_to_atom(VarPrefixS, VarPrefix) ) ), Acc1 ), append(Acc1, Hole, Acc) ; Acc=Hole), sbt(T, Options, Acc-Hole,_,N), sbt_instantiate_singleterms(Hole). % handle empty string atoms nicely sbt(V, _Session, _Acc-AccH, AccH, '\'\'') :- nonvar(V), V=='', !. sbt(V, _Session, _Acc-AccH, AccH, V) :- ( atom(V);integer(V)), !. % general case, look for double term sbt(T, Options, Acc-AccH, AccH, VarPrefix) :- % check if double term identmember(v(T,VarPrefix/Anchor/FirstOccurrence/NewTerm), Acc), !, guard(memberchk(session(Session), Options)), flag(sbt_variables, X, X), (var(VarPrefix) -> ( (X=='latex' -> sbt_gensym(Session, '', NewName), Anchor = NewName, sformat(VarPrefixS, '\\fbox{~w}', [NewName]), string_to_atom(VarPrefixS, VarPrefix) ; (X == 'html' -> sbt_gensym(Session, 'v', NewName), Anchor = NewName, sformat(VarPrefixS, '\\~w\\', [Anchor,NewName]), string_to_atom(VarPrefixS, VarPrefix) ; sbt_gensym(Session, 'V', VarPrefix) % sformat(VarPrefixS, '~w', [NewName]), % string_to_atom(VarPrefixS, VarPrefix) ) ), ! ); true ), (X == 'html' -> sformat(AnchorS, '\\ \\~w', [Anchor,VarPrefix]), string_to_atom(AnchorS, AnchorSA) ; AnchorSA = VarPrefix ), % set label in first occurrence FirstOccurrence = (AnchorSA=NewTerm) . % in the new term, we just see a new variable % ('Firstoccurrence'). This will later be instantiated % correctly as V3:Term or as term, depending on % whether the thing was referenced again or not. sbt(T, _Options, _Acc-AccH, AccNH2, FirstOccurrence) :- var(T), !, % add to difflist flag(sbt_variables, X, X), (X=='html' -> SVar = '\\?\\' ; (X == 'latex' -> SVar = '\\fbox{?}' ; term_to_atom(T, SVar) ) ), % a simple SVar = T would work here (cyclic terms!) (AccH = [v(T,_VarPrefix/_Anchor/FirstOccurrence/SVar)|AccNH2]). % if list tail has been marked as empty, don't realize! sbt(empty(X), _Options, _Acc-AccH, AccNH2, FirstOccurrence) :- !, % add to difflist (AccH = [v(empty(X),_VarPrefix/_Anchor/FirstOccurrence/'')|AccNH2]). % handle arbitrary terms sbt(T, Options, Acc-AccH, AccNH2, FirstOccurrence) :- T =.. [First|Rest], % add to difflist (sbt_ignorefunctor(First) -> AccNH1=AccH, FirstOccurrence=Result ; AccH = [v(T,_VarPrefix/_Anchor/FirstOccurrence/Result)|AccNH1] ), sbtf(Rest, Options, Acc-AccNH1, AccNH2, Result1), Result =.. [First|Result1]. % for lists sbtf([], _Options, _Acc-AccH, AccH, []) :- !. sbtf([First|Rest], Options, Acc-AccH, AccNH2,[Res1|Res2]) :- !, sbt(First, Options, Acc-AccH, AccNH, Res1), sbtf(Rest, Options, Acc-AccNH, AccNH2, Res2). % post-processing: instantiate terms that occur only once -- do not show a label % sbt_instantiate_singleterms([]) :- !. % binding if binding possible sbt_instantiate_singleterms([v(_, _/_Anchor/SO/SO)|R]):- !, sbt_instantiate_singleterms(R). sbt_instantiate_singleterms([_|R]):- !, sbt_instantiate_singleterms(R). sbt_init_gensym(Session) :- gensym('sbt_session_', Session), flag(Session, _, 1). sbt_gensym(Session, Prefix, Value) :- flag(Session, Curr, Curr+1), atom_concat(Prefix, Curr, Value). :- dynamic(display_cache/2). display_cache_init :- retractall(display_cache(_,_)). display_cache_get(Pred, Term, Result) :- display_cache(Pred1/Term1, Result), not(not((Pred1==Pred, Term1==Term))), write('CACHE hit '), write(Pred), nl, !. display_cache_get(Pred, _, _) :- write('CACHE fail '), write(Pred), nl, fail. display_cache_put(Pred, Term, Result) :- asserta(display_cache(Pred/Term, Result)). :- display_cache_init. html_print_fd(FD) :- current_output(S), html_print_fd(S, FD). html_print_fd(S, FD) :- is_fd(FD), !, (sort_fd(FD, FDSorted) -> true; format(terminal, 'sorting_failed: ~q~n', [FD]), FD=FDSorted), % sorting fails sometimes. why??? write(S, ''), html_print_fd2(S, FDSorted), write(S, '
'). html_print_fd(S, FD) :- is_list(FD), !, write(S, '<'), html_print_list(S, FD), write(S, '>'). html_print_fd(S, FD) :- nonvar(FD), FD=html(X), !, write(S,X). html_print_fd(S, FD) :- nonvar(FD), compound(FD), !, FD =.. [Func|Args], (Func == '.' -> html_print_list(S, Args) ; ((current_op(_,_,Func), Args = [A,B]) -> html_print_fd(S, A), write(S, Func), html_print_fd(S, B) ; write(S, Func), write(S, '('), html_print_list(S, Args), write(S, ')') )). html_print_fd(S, FD) :- % (atom(FD); var(FD); integer(FD)), !, !, stream_filterA(filter_html, FS), applyStreamFiltersA(FS, FD, S). att_style(V, _, '') :- var(V), !. att_style(alt(_), _, ' style="background-color:orange;" ') :- !. att_style(Att, _, ' style="background-color:#BBBBFF;" ') :- output_mode(Att), !. att_style(type, _, ' style="background-color:yellow;" ') :- !. att_style(_, _, '') :- !. att_link(V, _, '', '') :- var(V), !. att_link(int__rule, Val, Left, '
') :- make_link_for_component(Val, Left), !. % defined in http.pl att_link(_, _, '', '') :- !. html_print_fd2(_S, F) :- var(F), !. html_print_fd2(_S, []) :- !. html_print_fd2(S, [F|R]) :- nonvar(F), F = Att:Val, !, att_style(Att,Val, StyleMod), att_link(Att, Val, LinkMod1, LinkMod2), gensym('', Sym), format(S, '', [ StyleMod, Att, Sym]), html_print_fd(S, Att), format(S, '~w', [Sym, Att, LinkMod1]), html_print_fd(S, Val), format(S, '~w', [LinkMod2]), html_print_fd2(S, R). html_print_fd2(S, [F|R]) :- !, write(S, ''), html_print_fd(S, F), write(S, ''), html_print_fd2(S, R). html_print_fd2(S, FD) :- !, write(S, FD). html_print_list(_S, V) :- var(V), !, write(V). html_print_list(_S, []). html_print_list(S, [F|R]) :- html_print_fd(S, F), (R==[] -> true ; write(S,','), html_print_list(S, R) ). sort_fd(FD, FDSorted) :- (predsort(fdsortpred, FD, FDSorted) -> true; repair_list(FD, FDR), predsort(fdsortpred, FDR, FDSorted) ). fdsortpred('>', A, _B) :- var(A) , !. fdsortpred('<', _A, B) :- var(B), !. fdsortpred('>', A:_, B:_) :- output_mode(A), \+ output_mode(B), !. fdsortpred('<', A:_, B:_) :- output_mode(B), \+ output_mode(A), !. fdsortpred('<', type:_, _) :- !. fdsortpred('>', _, type:_) :- !. fdsortpred(C1, alt(A):X, Y) :- !, fdsortpred(C, A:X,Y), (C = '=' -> C1 = '<' ; C1=C). fdsortpred(C1, X, alt(A):Y) :- !, fdsortpred(C, X,A:Y), (C = '=' -> C1 = '<' ; C1=C). fdsortpred(C, A:_, B:_) :- !, compare(C, A,B). fdsortpred(C, A, B) :- !, compare(C, A,B). repair_list(A,A) :- var(A), !. repair_list(A,A) :- \+(compound(A)) , !. repair_list([],[]) :- !. repair_list([A ],[AR ]) :- !, repair_list(A,AR). repair_list([A|B],[AR|B]) :- var(B), !, repair_list(A,AR). repair_list([A|B],[AR,BR]) :- \+ functor(B, '.', _), !, repair_list(A,AR), repair_list(B,BR). repair_list([A|B],[AR|BR]) :- !, repair_list(A,AR), repair_list(B,BR). repair_list(A,AR) :- A =.. CC, repair_list(CC,CCR), AR =.. CCR.mug-workbench/dm0000755000076700000240000000022410127046041013677 0ustar drstaff00000000000000#!/bin/bash set DISPLAY=localhost:0.0 export DISPLAY=localhost:0.0 export EDITOR=emacs /usr/local/bin/swipl -O -L30M -G40M -T25M -s dm_dev_swi.pl mug-workbench/._dm.pl0000400000076700000000000000012210155200356014503 0ustar drwheel00000000000000Mac OS X  2 RTEXTmug-workbench/dm.pl0000644000076700000240000002526110155200356014320 0ustar drstaff00000000000000% MLE ASI Dialogue Manager % This software is intellectual property of Media Lab Europe Ltd, Dublin. % The source code is classified confidential. % % Copyright 2004 Media Lab Europe Ltd. % % Author: David Reitter, dreitter@inf.ed.ac.uk % % Version History in CVS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* dialogue management prolog services to do socket interface test more inputs (unit tests) for complete cycle how do we determine whether field has been filled before? set value in 'Arg:dm:filled' how do we determine what field is actually being filled by some input? not trivial to find elegant solution knowledge base should specify what actually is needed -- for the send_email task, not task:email:to, but task:email:to:emailaddress now we need to find out that in order to find an email address, we need to find a contact. the general issue is: - task needs an email address to be executed - user may choose a contact (or an email address) --> user may choose any kind of object type that provides an email address how does the dialogue manager decide to ask for something to fill the 'to' field? the scope interface is suboptimal. maybe the dialogue model (KB) should specify a minimal requirement (fields that must be filled task:email:to:address) and a common requirement (fields that should be asked for = task:email:to). The minimal field is checked in order to find out if field is filled, the field that is to be asked for is fed into realizer as the scope argument other tasks: search email search expression -- minimal: string, default is to ask for a string. a better representation would be object-oriented task object would have a method that returns a list of unfilled slots, and one that says: complete modify ASR generation grammar semantics to match what's needed in DM organize one or two multimodal inputs (say "peter" + click on peter smith) (click on "cc" field, "send it to erin as well") then combine system. */ /* $Log: dm.pl,v $ Revision 1.7 2004/06/27 17:46:15 dr merge with dmdev branch Revision 1.6.2.8 2004/06/25 02:15:29 dr stuff moved to tools Revision 1.6.2.7 2004/04/24 19:27:29 dr costly unification dm work emailadr corrected in KB Revision 1.6.2.6 2004/04/23 19:06:08 dr costly unification Revision 1.6.2.5 2004/04/23 10:12:05 dr dm updates, socket stuff from SWI possible now Revision 1.6.2.4 2004/04/22 15:53:44 dr dm updates, ping in sockets Revision 1.6.2.3 2004/04/16 13:02:17 dr dm fixes Revision 1.6.2.2 2004/04/07 21:02:50 dr work Revision 1.6.2.1 2004/04/07 16:59:10 dr fixes Revision 1.6 2004/03/10 20:02:36 dr interface changes and more */ :- ensure_loaded('debug.pl'). % SWI :- ensure_loaded('display.pl'). % pretty printing stuff :- ensure_loaded('ff-tools-opt.pl'). :- ensure_loaded('unif.pl'). :- ensure_loaded('debug.pl'). :- ensure_loaded('fusion-examples.pl'). :- use_module('database.pl'). :- use_module('kb_engine.pl'). % dialogue_manager(Command, InputTerms, 'not_implemented_yet'). % dialogue management, second try % user dialogue act % giveinformation % giveconfirmation % initiate_task /* dialogue manager engine we begin in state 'start'. the routine is: are there any system_output transitions from the state? yes, try to execute one of them (the first one available). no: are there any user_input transitions from the state? yes, wait for user input and try to execute one of them. no: repair. executing a transition: applying a transition means calling the transition clause and switching the state. system_output transitions: apply transition to given state, then run realizer on SemOutput. user_input transitions: wait for user input, then apply transition. */ % ocuple of unit tests :- dynamic(current_state/3). :- dynamic(proposed_state/3). :- dynamic(last_command/2). dmt(0) :- dialogue_manager(0, reset, _), unify_a_shallow_copy(F, [ type:initiate_action, action:[ type:task, task:[type: send_email] ] ]), dialogue_manager(0, F, Commands), print(Commands), nl,nl, dialogue_manager(0, make_persistent, _), G = [type:contact,firstname:erin,gend:female|_2800], % unify_a_shallow_copy(G, [ to: [type:contact, firstname:david, emailaddress:'dr@davids-welt.de'] ] ), dialogue_manager(0, G, Commands2), print(Commands2),nl,nl, dialogue_manager(0, make_persistent, _), unify_a_shallow_copy(H, [ cc: [type:contact, firstname:erin, emailaddress:'erin@mle.ie'] ] ), dialogue_manager(0, H, Commands3), print(Commands3), dialogue_manager(0, make_persistent, _). dialogue_manager(UserID, reset, _) :- !, retractall(current_state(UserID, _, _)). dialogue_manager(UserID, make_persistent, SystemCommands) :- format('User ID: ~w~n', [UserID]), (proposed_state(UserID, State, ContextSem) -> print(true); State=start) , print(assert),nl , asserta(current_state(UserID, State, ContextSem)) , (last_command(UserID, SystemCommands); SystemCommands = []), ! . dialogue_manager(UserID, Input, SystemCommands) :- (current_state(UserID, State, ContextSem) -> true; State=start) , ! % this collects all the commands , dialogue_manager(State, ContextSem, Input, TargetState, NewContextSem, SystemCommands) % save the state (persistently) , retractall(proposed_state(UserID, _, _) ) , asserta(proposed_state(UserID, TargetState, NewContextSem)) , retractall(last_command(UserID, _ ) ) , asserta(last_command(UserID, SystemCommands)) . dialogue_manager( CurrentState, ContextSem, UserInput, TargetState, NewContextSem, ConcCommands) :- format('dm trying state ~w...', [CurrentState]),nl, (dialogue_manager2( CurrentState, ContextSem, UserInput, NextState, NextContextSem, First) -> format('ok\n',[]), dialogue_manager( NextState, NextContextSem, _, TargetState, NewContextSem, Rest) ; % no further state to go to, so terminate and wait for user input Rest = [], TargetState = CurrentState, % next time we'll pick up right where we left it! NewContextSem = ContextSem, format('not available, exiting in state ~w\n', [TargetState]) ), (var(First) -> ConcCommands = Rest; ConcCommands = [First|Rest]). % SYSTEM OUTPUT dialogue_manager2( CurrentState, ContextSem, _UserInput, TargetState, NewContextSem, OutputSem) :- % if there is an output transition for this state transition(CurrentState, system_output, OutputSem, TargetState, ContextSem, NewContextSem), !. % user input is discarded if any % the upper component will call realizer now, output what is to be output and then get back to us % with the new state. % GOOD INPUT, and input available dialogue_manager2( CurrentState, ContextSem, UserInput, TargetState, NewContextSem, _) :- % if there is an input transition for this state nonvar(UserInput), transition(CurrentState, user_input, UserInput, TargetState, ContextSem, NewContextSem), !. /* All transitions specify one applicable state and one target state. If a transition applies, the system will switch to target state. Each input transition checks the input semantics (and fails if it is not applicable), reads data from the input semantics FD, performs necessary updates on the task context semantics (the only persistent data structure). Each output transition checks the context semantics and constructs a term for realizer. */ transition(start, user_input, InputSem, run_task, ContextSem, ContextSem) :- unify_a_shallow_copy(InputSem, [ type:initiate_action, action:[type: task, task:Task ]]), unify_a_shallow_copy(ContextSem, [type:run_task, action:[task:Task]]). transition(run_task, system_output, OutputSem, fill_field, ContextSem, NewContextSem) :- % read task info from context sem unify_a_shallow_copy(ContextSem, [ action:CurrentActionSem ]), unify_a_shallow_copy(ContextSem, [ action:[task:CurrentTaskSem ]]), % determine next field % check knowledge base for task unify_a_shallow_copy(CurrentTaskSem, [type:TaskType]), fasil_kb_engine:get_propdefault(TaskType, args, Argslist), % find a non-optional argument that is not yet filled member(man(Argpath), Argslist), convert_path(Argpath, Argpath1), \+ method(CurrentTaskSem , slot_is_filled(Argpath1)), nl, print(CurrentActionSem),nl, % use that argument path as scope format('next field to fill: ~w ~n', [Argpath]), path_flatten(task/Argpath, TArgpath), unify_a_shallow_copy(OutputSem, [ type:askinfo, action:[type: fillfield, scope:[TArgpath], task:CurrentTaskSem ] ] ), OutputSem = NewContextSem. % output semantics and context semantisc are the same at the moment % a task is copmlete and needs to be confirmed now transition(run_task, system_output, OutputSem, confirm_task, ContextSem, NewContextSem) :- % read task info from context sem unify_a_shallow_copy(ContextSem, [ action:CurrentActionSem ]), unify_a_shallow_copy(ContextSem, [ action:[task:CurrentTaskSem ]]), % determine next field % check knowledge base for task unify_a_shallow_copy(CurrentTaskSem, [type:TaskType]), % get argslist property kb_engine:get_propdefault(TaskType, args, Argslist), % there is no non-optional argument that has not been filled \+ (member(man(Argpath), Argslist), convert_path(Argpath, Argpath1), method(CurrentActionSem , slot_is_filled(Argpath1)) ), % use that argument path as scope unify_a_shallow_copy(NewContextSem, [type:askconfirmation, action:[type:task, task: CurrentTaskSem] ]), OutputSem = NewContextSem. % output semantics and context semantisc are the same at the moment % the user fills a field, % for example: "to mick!" or "send it to mick!" % user semantics can be anywhere on the scope path % as users may choose a different field to fill (then input gives field attribute) transition(fill_field, user_input, InputSem, run_task, ContextSem, ContextSem) :- unify_a_shallow_copy(ContextSem, [ action:[scope:[Scope] ]]), % what field to fill? nonvar(Scope), convert_path(Scope, Scope1), % choose the unification with the lowest weight findall(Cost-Path, ( partial_path(Path, Scope1), fd_bind_value(ContextSem, action:Path, OldSem), unif_cost(OldSem, InputSem, Weight) ), List), keysort(List, [_-Path|_]), fd_bind_value(ContextSem, action:Path, OldSem), unif(OldSem, InputSem). % is input consistent with earlier context? transition(confirm_task, user_input, InputSem, start, ContextSem, NewContextSem) :- unify_a_shallow_copy(InputSem, [ type:confirm]), % fine, let's execute the task method(ContextSem, execute), NewContextSem = _. % then, back to start state % kb methods unify_a_shallow_copy(A,B) :- ouverte(B, B0), unif(A, B0). mug-workbench/dm_api_yap.pl0000644000076700000240000000036410127046041016015 0ustar drstaff00000000000000% dm_api_yap :- yap_flag(language,sicstus). :- yap_flag(informational_messages,on). :- ensure_loaded('compat_yap.pl'). :- ensure_loaded('dm.pl'). % socket-based API :- ensure_loaded('sockets_api.pl'). :- server(dm, 'localhost'). %:- halt. mug-workbench/dm_dev_swi.pl0000644000076700000240000000012110127046041016022 0ustar drstaff00000000000000% dm_dev_swi :- ensure_loaded('compat_swi.pl'). :- ensure_loaded('dm.pl'). mug-workbench/dmy0000755000076700000240000000006310127046041014071 0ustar drstaff00000000000000yap -s 1000 -h 3000 -t 1000 -l dm_api_yap.pl mug-workbench/doc/0000755000076700000240000000000010155201127014117 5ustar drstaff00000000000000mug-workbench/doc/reitter04uifly.pdf0000644000076700000240000020763410127046041017522 0ustar drstaff00000000000000%PDF-1.3 3 0 obj << /Length 3625 /Filter /FlateDecode >> stream xڵZYs6~>->v_rَr6 b*~8}ڒJw o o~}Yh[l?ْ~7"Aoo}2nď{>4NQKe>&ELkHè)&=ܫJ}eb]l*J}Lx߫]zM-f bpGyF/յ;zb~SQ_ ~kLnuЍjYxZ+Ӳ#syoT~疗lL1c\mml~k&_3& "y ,-ףcݎnQuӤ~W\} K/ In/ʌGvai{mkqOE?tfF3=I ew(+f~\àk==WoA^ܞt(2R2C:>*I# u]w8 LRYRl-Co_4MY|Y^2RH!(_%at:IJC]=H@)E*`8̽ӠGM#jWPNM4+A thn6iχ 3hy0T|Ɩ3ncàNGSa,L1%ȊWi ^OҨjuPz=1w)mvʽtWiK-G 0H-gi/BwDPB~ 9jPmPmAm㼞lF,xjV"1: mW$l\;Nҹ"Eqʛ܀G4]yh(h8D\#LHty@IDd_qcr5Xd~p渰G=fL%Ur[v@b `{03_u(Lƭ-{VQQh|i×#I*)#=e.)[He'p׫%i'5=ςj&Sԟ;ݙ?f3K{^O 8A(龬8{ 1jLiOn?=y'5ڍU $4KWL|&rkѕy=i޻b*B-p̟V4#i%a[j*ZEm5Q<4Is-} CC#x) ]=t'?)&s~nj)$yuFz8w"pge'r"qIAWzQյYcOmoOn&S'5<wI&=r/=DjpGGbjUu;. UWF-!Pn,-Tut]R9~x!Xiߨ1<&xҺƵ 擛mKy8BnfP1cut=(=T8BL~o0&fZ!#eqyᥥ$Vn"kI|Q] !NA#; ш#5Wdσog30Qnse-,&l<Q覹[-@*f yx4 /;aKc#UG2|rv=$^9b*"{ygK8R٨1,,K0vқ22$1|Эo7!;1vh:aj oכA4uc]4qj5&/VDKXx@(NJ/;R2wwX$Jh‚|$V8(DG^:9v;UT<{ ެCT!¬p4aG21B Q~.u"ך D% P\.Td8[mV2X?A"IM5.GEl":( rI;v܏n<8;/N .'u>mza%}OV6۾`%BXǻyߒL=Q.Fwy FYzsh4Z.$(@$:[9ٺ2w]MvTohQ;v٣8߁nih Hh} h6#|@4d` 92(Nb2[k"ȨҷU'b-"v4č&>2O%:Zl?E_NpOdPr >~'=0dM>y7y,Sic[zxY(Bs"{*pd0. 3lKRN@QKm$N #KV )y_z6Qf=*X n0 C`Iq'LjQeJs Θ X O?.#%Z#$18>gR+Igr& y9c#U!Jw޼<|W~H=ij"Ax.Cݓ׎/Pf5RK(.oJ%g@|eue/`/MxdjMI.Ɠ %"}o(eY6K2+pUׁ"\3tQ91w8v"w=ْ,FSk6%c )tmi֯^bfS,fʒlէ4x.̡sy\P5^$lOjZq| q[8ɉz*V>iRW0fttzI y9#*V/O(J׉jS7e-6~%]] <#Igo\< R se.FUU(b # ЙN7 `=]*Eb<@e y6%3pB`#{O$28Q`^pPCkQK2+Dy>PmVKivKYȃ(#Ud=t \܁{B:1AxXd]]npP6ٌ2 H:~Jsɥ fӈEXfp€jǫgpd\ 4+rE)ANr\hJxv*A8ԁ`fɗǯBhm Z/Wp8,3ke2@9f 0_8UҒc7 Xr#2~dBO"̮(0?QI(8b%:\y3C '`<`JjS )̱9%5_GŵЪ!hHneB"F5nEf R*! 0{`k4Νjag57k eԫú_RwIQM?6rpG!)C?ٯ>߭ ".sendstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 1 0 obj << /Font << /F56 5 0 R /F58 7 0 R /F25 10 0 R /F59 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 18 0 obj << /Length 3998 /Filter /FlateDecode >> stream xێ_!Մs/n \+1H|}m(R `up̹3r,?zVgl#/iqQ2X>9D9'G UiΖF?>EDQ4?xCG"?*8}o[F⇆PánשWs3-j멡UhŬ~UY[Txߥ|Zw.ʢ-`„:Oc-hw$îX}[t"/W[@Nv.?ݺ޼pu]WQRE۲L, T;D3FE`3s3I;?}&ʤR҂fiY}e:b7ѼHA|C_A@6qcI(EM,(&/˧dZV.AV4>[ TdY w0QkۭxoL0&RQiX*\"oGߨP{,](m2OŬ!m>:멘eOn>e3jHv~ p?l t\gb曽o/|<3llqFŀ+2.E|$Sp]Zv_W&QFXͬx;4A!Ylfo7!TNe_Ѷy.WE>,c,cb8>5˽ %%LmS{i(-~ϦȄMdYB ?ȳv4UH#"}"UIABхPH %ߋ?,L0_gL}捂יT!LũrnLU _Ys'>F$Nu z(zFx eaT|l xv%'YXQK(SIRuP!4RB-EC8>vI }Sl5bb3Y =oyu@hL/s칎VTe,MĚ0\asVr|}y{zW!K@N I߻}ֻK}b _ٮ%LHnێGʤ|nfXA4nP {1T͸\ &4Tv_|! UT@QfR ]Vn&~uUGnCe BWe l>Dt9 8+!_Bnۭ (nWa24iHy] I 'LDOxՁ]~zޡy`ϯ_@x@,XtԚ ~Mk2n\-p/ Hab&]l6@xdl Ȟك6eOrQUV6ʆ>[FF^ͳaD'-YzK5ʔ2.oe=٥?6 %MWl`+|465"9r[0fxW3/5 jLxa/n};tzFpJw=a^/I4_뚙"~W,D}ZJh5W>V-%mK1"VcXcyi_x RSqwhվk+y\[2\Ӳ]ČVy -yVFVGf~(D6Yc+؜ ͩ> Upy$RiJr)El0J38{rUJEXP^_1+ٔ,+1LAᒘ^Օhe,#`:7`PP`V]$cxox!v!o+$|c7=B}Bh(jx;ܶÛ ꠡX/B%&2X-rZ}HJLxbG< #;M|}x!->0:_>f맥4°navt hj)#l2d% k7Ahҵ::; gWw:,[W!CI EX|SlMKl1͚#"' b08R0TVܾxb[E4azZ啛mْ5xU5-C*_NY7 lg\"LEhP7̄ @x axvZl \qkqr]q CvVgf?*~yp~O an1vBqk-"K4Tau?*m3>*Lu/Klسgh?hJs,H| bT(%h3d-uNM#`2, ǐhy{,M:!PcviBf un0J-!nߡMm& ;囜7>gcC?$jZj2{ )HAJc׳7׍OAm@[gBȤEJrˍyA0*D_L:<Щ At d8\8)m;A 󾺯σW Ns "`H|(N2dc:TZiG]V9Vϩ+1@O0mtDȥF(%E{$y5ΰ eALS0 cSg MRJnUHWNːV' @נ1{ 6bېSy* Kv NrlMXNY7UE#R'6*pRs\5hWG>`d meBQJT6㦳$W+5ïY"E rg¼ ';Elb BX\A++KrcTbFq>zxAdP2rW+*""+]`,[qA,ob@Vl&!-tʊ. ? YM8p >u3Klljb'$q'0O˼7׊R6O%_ -H($qD,'C£guD asjN cچCo c"p_RW&Ld)[|`J7X֐* vB. &&*]*[kb>(P,'mٟz#x)7]D[(gN#R#25PLݯ*zڳbGeH:e(DOVȘIi+o6]HrWvwjA`P U2Vq/==''){m$ Ӥ D'KP%|3,z_HכFCDr8/>-{,|1g1f jqZEW:endstream endobj 17 0 obj << /Type /Page /Contents 18 0 R /Resources 16 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 14 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./pda.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 27 0 R /Matrix [1 0 0 1 0 0] /BBox [0 0 232 306] /Resources << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im1 28 0 R >> >> /Length 29 0 R /Filter /FlateDecode >> stream x+TT(TH-JN-()MQ( )NU5TpB endstream endobj 27 0 obj << /CreationDate (D:20040316115829Z00'00') /ModDate (D:20040316115829Z00'00') /Producer (Mac OS X 10.3.2 Quartz PDFContext) >> endobj 28 0 obj << /Length 30 0 R /Type /XObject /Subtype /Image /Width 232 /Height 306 /ColorSpace 31 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x-t=?XXZXXZXXZXX@̙#h?ȲV}v;3Dr?DJĭD"n%Nn5ڗ,8o\LJĭD"n%VJĭD"n%VJĭ߿2?>P[@.-)L-p||לG!777l?~˗/[A///oooglc?, gr;cj$ׯ١0e3)E8F"[8[ 5_יwm.%߾}C~%...LnC{,qc5HA `S*`r+fQj[bPb3B'6~ AQh"lVP|[TO.>/C֪&L-- ]d9VT4r,-.v 5KSjn0F(ֺ p(+_I UWO.-q;qz/2xŷP'@FxTVo9q 40B@iEd88,M6JǷvMYCeSE_=q,`ܒ=x-\|oy!z2`ivAn@h38y89Q\*K r ą&(gznd@i#Pխc \&_IP ſ( oT7iG8A~ 2>_=|F?3-GГ8[n3Â.`<~}}]@!skBxx`O:0n )0"*o^.t÷cPMK>=y:.n3n˔4uQ9GoNx3ZၢtVE$ϽwoNzܛtn" n"Lqoܚq㖯 JC ^{7P?݊8޼'Ϡ3v}Pܲ}z)'P/z oC{Dq5?Z!TDis /z >{W˭=hFw>ؚ9XnC ^q5sw+)T૔)T hͭŸq׊jyS@ػEo? cϥc2ڔ|۽ygAg;kpx]5p6G H/6#@{:B_VpcsTÖ jy}9P8Z+c4ķHqo5v3v~E 9ۆziw?vOϑjq0v HOĭD܊[q+V"nŭDJĭ[q+JJ4NVJʹ=dgi"Zpp:=, 8/91}[Y#E-M$p}LCs8ȤsZ CGp>Kv-t Z,=Vָ*\-qX~BHJx a]V&-78ðwg4c]'P' h@vt'&R[d&㰨-9i Z@ÒFP !f\g=[ PG&|`~ WҦaQ-݁f72mq»#YqJ~Uooc6ArdFY`TsX6 n׮ĵ˖6,YdnBh+B*vp=M¿H܃o[/_z\d,YZɃ%~Yf pFtŒ)ԅxnë}pŠNܧ5쌌_\sXqca]#7&DܮSV'ĭܸHd)}+8A܊[q+9=n`HJ[nԁ,o?,n%GǭEZfrp{Iq+nϟQe%ŭmskǘ%ŭmsks Vvr a5K[q;Jbj{Iq+n;Α%ŭmpQ:HGn/)n๚%ŭy0q+n%VrJ$h nŭ*fv SO,JBL@uܢ=uaJlĐbrGBGzׯ_ } 7aJ9M߆o-/nEsy0ㆲ)e] x.nGqS777ZD/ce> "JC 6*}E|M,8=" DNA۰BeTv/_,d$~*, Y;EϺ"J扅WǿZU>GhJYA|ha̗"4Q꼉e-hVU{ ,YYɬ^s{)YB¸ޯ1V3[*q]Eճ(FWl\訰E|&;{ HWVHOҊ(~˷6/kp[Rznh՟N-3,+B3Cn̊r6$S۰$΂R!3Ȇl( sҊm-Zq <2n7[lBnBʪJMib܆'S=s U2ƅ6+̹cAQ+o%\753*0 ΗN܆ծ+D~jlヌdq!ͪtܢ%-lA,3'41AQ D YM,[nj{TQ:eBLV BM}SV"Jy)&~W-DZP̔r%se 0f>Ң7d Tlqn*C:BrM b2v-/fu!Y\HwBUoQ,,d'TzhXZYzO=KiNφ ҶIi?-ՠ{kr BJ)8a/#'ؘY釆1|kܲAGvmchW^縺X _j3{תwt_̼aR:Jrڐ{Ocv S<&\UBu "'-|ўHm6k mF+@\+3CϮm-4|~Jje7ȵ;zCY6jdžx@~=a^6)m嫁|+Hk_5cO)3c汮yh`8rO6t-ޜ6c7֮.+p4 AFq˙z^|î׺l?[-2[?I݅mAFq VQmEAwid+=kkmbA&T}͇Zdn]d YyZȥb3lgZJv-Ǯ؀l߹^\ֻ{&G c- ?0o~zZW ;?_vdI~Up饎MYDA[ x 8@i~܊K6e W=Esy_-G<;V؉p$ơYɡ2[YBG=ƍu }[ .{6 İbzN흼~J8&յ&xDwagMi]k!ơaåQO?NCa uZ:_NC|^MFe ZjQ >I_$iܚ(v4B2ӱAz{w)hCEr";/:t{vݥ'֮稧`bI]~dp\]l$<ۓ` pP3q+Kb'b r kֿ06ne԰`xO2ȗ[Dva 1_b =gU¨aԲdM'n`.qqQ; ;PF?9v¨# 'Z0$w.Q:  ϟ+>1E9v>ΨaƊ2_mnـc2  ,zL3ztZC jP-ɉ ϺGOַ ӱ3Q6S|Y[ O} nU`x -zL3ztZC ~p'dA p|M6jh,Wȭ'3n7 =<e'Z{L3z ZC ŐU9FM7Ⱥ14$; ao,W8aac{͎9[&dY r APOW 4MGE lmg^V_%IZ]-ZmۜZniGdT԰F =fq֤vVjt6MmN-\}PȨaƬL ~p9hi=\ 0Vk MiFgAk6x_e!z8q8hpS2L@|0jfQC#ܘ/te 4^ 3qeC  !jۄl(-愂 y>ԾCg԰efM2Ag"h4R-<:&9Fq+C &P(>JRg+ Ń_'Uq{a9oWƊMvt/nmmCz8xy~)&&q+n{mn=OA}_~"[q|M!5fL(~ĭ JvoyY/g[q'ƣŃaժ4rqqF}˃U߾}e6mc@niyPgTVS~SqF )PC[_>Ҟ0%@q+nCxh0ؖ{aD[m#4Uk ṳ̆k`g: yg-~Kni vҷ1NA,їa:E:k,[2T1$8?WFVܶe~}Z3QǸ["Hc!nm8tC8H#2v|k)4,H]N0ו= F>$h6NPmنso5NsY5`:+n[LĨ?N^ M([qʷoߌ"OTSM]pFWsJ[5DJ$V"q+[DJĭD"n%q+HĭD܊[HĭD"n%V"[DJ$V"nŭDJ$V"q+[DJĭD"n%q+V"n%q+[HĭD"n%V"[5DJ$V"q+[DJĭD"n%q+HĭD܊[HĭD"n%V"[DJ$V"nŭDJ$V"q+[XDJĭD?[endstream endobj 29 0 obj 54 endobj 30 0 obj 8332 endobj 31 0 obj [/ICCBased 32 0 R] endobj 32 0 obj << /Length 33 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xڭTY$z =Ҥ "FE$tHBbq,""VE낈 \@PTJ&9~{|wΙw7s@3͎%@^dO[O#7T1sv^^mY[ `HS#z!CI<6H\#CH!mv@'B+p*wqH> 3QLR7|F _Fvcqq,_ iЧ9h"\2gC:9 ND}Qœɱ~o+L17\0I4z|h!ZsXz'q=O}=7" $Q{W^77iim}W[{{ǻή>t#| 4 g ̱F 8: x 8NA!B!F䐆8 7![p&AA pyġ D31Q8!7-- AOo~SIћo'|2! <0%@4qD8xlFD2p""2BrG\4D88pb! ]ׇO=_½7QK}y7 %mZ^R>@! =Z [L2PM#0kX.+! k vCpA|aLfbNXv`%m@&RE:"͉=+B} ]U$r;5,9B!LWL_\.ˎ8T4mh%o|-Snh_n9/s?] 4 JHʞrZ9ȋ\fz#HMZ[^xҠh|˨&N3ֿͿ|3`Po놋FGgv@+h "σ+8 .<Ș fa X6B$8b 9jB?QG&#I[IE"(EmE&"g?yP;{%$nIΑ<)/uTDRfmrr7WTHjQLIP4RlScJeS̓Y5mik徆++l[5$8.fZ-f,[1II|;=M|ͽu;7,ۤsŭ۷EeztΞlZiuΏ*p*4(V;C1#mc[3ΚyOƖs[z3\g=uqver>)[}V^P,4X78<L6[;{,d  wCs|w +_<u9f5v߁_X/ +š;8&L\CQx!n^:HaNsİ% c.\2sMf8.FZ H}4˂Xtp j!D-{Q=Cc FbQ?(` {'x]m/&ZWJYiVje6֋CkVŁЉ?fL'ar~`留@2Qp18|u?> >> /Length 36 0 R /Filter /FlateDecode >> stream x+TT(TH-JN-()MQ( )9NU5Tpu endstream endobj 34 0 obj << /CreationDate (D:20040316121244Z00'00') /ModDate (D:20040316121244Z00'00') /Producer (Mac OS X 10.3.2 Quartz PDFContext) >> endobj 35 0 obj << /Length 37 0 R /Type /XObject /Subtype /Image /Width 132 /Height 157 /ColorSpace 38 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x]!t:000`aai@y}[Z>syw,vs dCd",$BsxX<==G6<-߿v,|qqq}}b>|x}}/?_|٬m///M=ׯcqww2ϟ:X~*ӏ?LO G¢,}_w2tg`e\k, >TxAĪ~C+8̏!PڢjPx,+(hV(cB`=MC3[ֱaUsFUc W(b +Rf7}ވg9/AЬ6_/E, h"X{Ӝn3 k(Q6w:u`RՇv?~5jjc6{^H Zh$2~ (`-Y[IWU__ h04X^s-hi=ۚ8Sás7amځpPX0D^ WS!Q|[ܚEAbX9ۚ3ZqK#c;Cu*(P~` XN^0B):_Z9&2O‚s R.HF@1tvIU[Ι mu NRV Aîb0oh1@"T5_0t+\w]$WR .b/$BXHXV֯Ȳ`9enͰ8^+,!777؂a[6⣰n@+b(-櫮Ey,Ijԁ5ԉ>8b6vpmEu{cX UL|ԞIrPXXς,>da#+G lc /j`"PF/_LXn=dlI^. X0#|Я6B|cjbLaf1_y0.腠A{ͻlc @qy8A#m1_+ jxa[.+^ł&5>BZM.ۘ"`;ioQ{,5 A1 ~PP\uӼ6X0(C#̗?2Xjx^_'˰$_;Quymc1,W.`ފ`Q,zlȮx#4yXp=7:JѺ^hae\]`2_E"PL` G%̦L#ukpھX*"iT h[J&"1n lquڥwq8-_E\b5و[E7<ζ5%K G'KxL32⨙_#XUrTvLXi۷AfgQo,"m\+c],ѝ$ X'QՇXE-WP2_LF=O48 opaa~:kQW17? xjG1P鳍AК/8Iwł/e/8g DW<5yֻxas/`'!N"?, gU@ f|Y<%4zJ@Ge|,D`9 Yx,j⏽'!N|#8 *PW17? /:aН$i Nٜ謊1ޢbo~^hp~[dC$!NÂuo8`+G ߀[AJ&!{"o,V0"vIdⴊJ ™Xq)>cM9R߲`Gcm1 bFq"J#oq}g& ,*~ŀrTb[ⴣ|Lɖb V8p̰jQhkpwje$OLditEL,g+2(2 XtOditA(a9I d Kɖb "H3, +ۃ|q-"seX2#F]천;e7a4z೫Lqb옡^?]Ӥ5\19> stream xڭTY$z =Ҥ "FE$tHBbq,""VE낈 \@PTJ&9~{|wΙw7s@3͎%@^dO[O#7T1sv^^mY[ `HS#z!CI<6H\#CH!mv@'B+p*wqH> 3QLR7|F _Fvcqq,_ iЧ9h"\2gC:9 ND}Qœɱ~o+L17\0I4z|h!ZsXz'q=O}=7" $Q{W^77iim}W[{{ǻή>t#| 4 g ̱F 8: x 8NA!B!F䐆8 7![p&AA pyġ D31Q8!7-- AOo~SIћo'|2! <0%@4qD8xlFD2p""2BrG\4D88pb! ]ׇO=_½7QK}y7 %mZ^R>@! =Z [L2PM#0kX.+! k vCpA|aLfbNXv`%m@&RE:"͉=+B} ]U$r;5,9B!LWL_\.ˎ8T4mh%o|-Snh_n9/s?] 4 JHʞrZ9ȋ\fz#HMZ[^xҠh|˨&N3ֿͿ|3`Po놋FGgv@+h "σ+8 .<Ș fa X6B$8b 9jB?QG&#I[IE"(EmE&"g?yP;{%$nIΑ<)/uTDRfmrr7WTHjQLIP4RlScJeS̓Y5mik徆++l[5$8.fZ-f,[1II|;=M|ͽu;7,ۤsŭ۷EeztΞlZiuΏ*p*4(V;C1#mc[3ΚyOƖs[z3\g=uqver>)[}V^P,4X78<L6[;{,d  wCs|w +_<u9f5v߁_X/ +š;8&L\CQx!n^:HaNsİ% c.\2sMf8.FZ H}4˂Xtp j!D-{Q=Cc FbQ?(` {'x]m/&ZWJYiVje6֋CkVŁЉ?fL'ar~`留@2Qp18|u?> /XObject << /Im1 14 0 R /Im2 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 5479 /Filter /FlateDecode >> stream x?2<~ qf>)$vq-!DciTq2Ϧ2bP;X򆫰rWJ~50,E$3M<( -ټrw~x.hNtg+-UT-r" evsID! @tQHb ks~Ps٨s% B]_WȭN |UEs]޾mS]X>V]^ ʂ!,80'|b_ڠ,bATyv,ˬ&舢-Sd pJޖ7 햁c恴cuve@תJZEղձ 8Hوbf!%1yQ u_Kp|V+n\ϡ,AOm;(ذE"Q{-9T̈́6!dR tg ˗T|%^XY `4VO4"V=-㩙Ju 5=ODˠ:!yN@$?ɯ%Lhe>Bjo=~jos\3KedEqIȵaP;r%h) idRDj)h(NR^gtJ2)KN4`:k>tH'tbCMEf.٧%p_|0C´g~/?:oߎ*;?;uU.tnb ` x{~)roj| >;IZ˙٥"+TQTJUJR>b{r5\ 0 ք~@Ay"GK?/aGnƁȏ|SaH>^o>6˅/->1s_DkNg/\ b7+l~4u{f  T@ >*^U{u`N@, mѬLx_-`k:5ZRx\T? PKQaCÕHRYXtD?N Uۀc% ]w@-9hH܆FJ#л?t%p!3R (/SlLDr9UOu×0p&A80oAZ֍K|\N n8B(/@~S=@`"m.2ppք|"b*bYtj.c9rz[e[]􈋣ĩ$ __v{Z=r7st gN)k`U @dF(JH0 ,"[ΟC qXcۡXBe#%̥ %؎q]2Z#Er#̹'pEBRxb/} o ! P)@!(fQaK1Ƥ5 Ix=)/"[SRLA{\[s | Eѥ2:;Far< F<+NbuV)FzѱGUw?gDeBb9(Uvr7D598>Vab]@&qI|Il6w P{w LexșhWHT^nikBG:cw9Dzà^LLt6&v-CH h7rYޝ{[&+!rlG(5s}1M2_p1@v< `$5r)4ihBP;gi1/=."$/cu+@i䠵{ЅP*9֜&5 EƔZ0~% :) x96ç#&Yo4W)7C)zSC?nk;̸pؚ!rc;2ʜ8L|ODnP7t=S˅ӘD.GQB6[aGtZI)5=lSkxs &>r2MdSɾ?!‡8jrEdF')Ñt #%6}bt//o|+ 84=8hm,F t ^ 'NܣcúHNҁ&8sXm.qۤTzfEZ"fˁ<@ȌLMiPw7DѺ;z7t H h]f?YARv=ZnP<@+kX7 va()7܇M;z̐ƨfAAЦTx`أkB&Ji6CH/% 7 ,e>b:p~dM?rk-?"\h͂K>k--zdoPñpn1 T b0IDh--Awm&8 u\Qӭ69J Ƈ]' $ FvIfb|iyNGzGgJ1% !ǫWn{LlQp:N33VWo>l|R1vTڒnz{IGx:F./ZPVo>AC rYٕY؅Y(B\\I>=HBy#'~f$jA_*~.'KR =Dqbɳ+VAnU3FE;*nqSDs5.vM^V?&@>~Ϗ 2+ L^ P>iכOU!\ K;|k"l|3U`9cHq[5x+ddTJ,X#v:i&n8b\,XJvғǝ/b2*q8X s}^|' N6Ф^nM'_^mD~xJÀG ZZǰWftgt2"r ?1=0^^\% lo +>%4)uFS.]a8t.cTh" }sIN7H/a}%B ^,3 $T{E<-)~GoZ>IЎWFE|; k4_0 Z8'faAP䰟 rJ.=\_uQDxY䔶F]O:Q([(*>l0 u T!q*כbxz~>DŽib/z% eaEI|A"c@cf*(&UkVXDsU&7D]̿w.Cm/ o.L{-3|jM Z=gF潤D^f;vF0L| wH یC s'aLM6ݿ'IO,4ϩ ]NꖈtY3vOJQ:2ˬA<`b ƌ#7  %l@HREz ;X-<}t4Yd?1r9Lfb(~ROϻ`kX܈λ%6"sXc+_5}5>1&zuF]X>JX|j/ U!ID{LGendstream endobj 42 0 obj << /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 41 0 obj << /Font << /F58 7 0 R /F46 21 0 R /F72 23 0 R /F56 5 0 R /F11 26 0 R /F8 46 0 R /F1 49 0 R /F10 52 0 R /F13 55 0 R /F7 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 61 0 obj << /Length 4842 /Filter /FlateDecode >> stream xڵ[Yw~ϯPsD`MV,[qXJGT bm@P89 g,wQxE_pQ .6Pz$X:(X~D8w7<<ȇ߽Y,U{j+E=rc?~M&Dxtԏ׽6]ڕxqퟹue%Ns UgBZ7e>MgPmf~ۚ~hg,':syt mɭ57}kM;K2GڑĜn)U@ݰv(awp @FrVfk#g6Vcnfn>S؏rW8f2ѧSgioꢲNP75z Zڑ9ۚ ͚(? ,p;!?hݸ(('( mt*8?p p*"Ps"r (nme5 0xZ~m?oή*z TL D%iKϋDCQ8^lomJcΤW3\6S)TAR8#yqI|^҉05 idA~ah0{ctFZm,R"ԞtZS=wM_JFyy$:Usp|8l9HYljtylbm)z=lD)`L#Tl߷fǁJgAT:೵-E4Bef` ď# .?Oc4_B?y;s$atR')9#ΦZz"i؍=*!I_G`kH(sD ίl/M~_]3 !2Q;b@HEd++1YWNVEiZow3r넻\ ުL-[T*@%@"mF3GYt,b+F~5`4'8X eNt6&~DKYg(gP# JTF_FQ (ڡJ-s\鎿dF b;٢j6A|ba3Q 4+'AdV= @tłeهHg \(kK$|b u9?ϸ Zb [g}kKtQT18bD1RPr@;vmYF3g`T&|RæpNF3^ Q"R-e4{<4A-E)B6tWY=`gEg%f7SwlB➰hP4 _` 't9pT24 C(ƩذaDb.v LzF^sh F1H'*iD@\/6  3o2d6'L1p`zq+:NP  $e1˼ΖHZ0JOȀ_ 4 螤A蘕_pQv ZEHSHFs:^iZ Q cw+n(K*)[ia3դyg ${a צy(Ԃ;8- ^s+[WA_䓚;W"=rA.4dp{.x(*EQìE"㲐M+# Frtp(x 8'r!r3B<"hyG fƚ\5b~mX۾i_bM!v2IjpB` c#, RnW3&ď%&7FۃHp(}.@"tzP!A뎨4XO AIe cv{mM'^خdi y]`T;;RޓmnaI cEcN g UE H_SY6EE]OIB>dc~gé`<kX*4hae];,'.+89]Q7`fe0%m͍Q `2Yd7()83b8֦| 8;%?Mӕ Y.B-3X2҅y3 Kcignh!wf]~ d_|qHGBtOSsE؏Ev@7a+6` 8~Iʾ{0aR.o&7E/oR_]Lmѱr2yĸ%rL\~a:y`;5"G$?:1~E:|tcj{yGfT ܂8 BB7^& Ŷ.4TcLN-dCU2S/N˚n!6iwK;ǸS[w"'7%ط~n8HٚĻMBM qH`4^6[.}Gvg`V>(ڧKV+O[%30vr6v@R4KK xCyDco(lLGa!# +U.qGBޟ00D]'l} x"LXvRޛPiՎ8鉿`D!^?c9wH.9`9a1*lk׀+?vW"{UR4YAS2(H67W跕qCJjTv x4.ũx4RAP;dr05U|gѬ /XQy0seed+dazX;o "`"L R}Ϧ㢤RP>r^(>y!p/2[{* dR̛$gL\ 7nEbG:q&t}=,d;T̊$qNѴF[`i[^;d=r/9>Fڧ 1ěwԖ z͏Gnm.&ad <|vaȉ.)/o)cx޴Lary~,C.itO3sY3?ӳ.ij8Q "?}۟l,F1"ΨxԖn$8]0?I,MQ =&y%]P۟/܆;!$M~3q? S.'*F D ?)Vi.]Xph] yyۗaeg ~g 7!@W#F9N5-se5#* 6a Mi _I c? Rq¢ _:srJIu,p{N5|ʟ &Ɉ%o@F*P@S,$ɼcb2Ja#* K3X%M!ŊBB3l3 ̠pxqbҮ~#)'wg8>7N]  ɟX\=pBXW`w}oAnXÞikdxa{ y.(:(KN`ԓlڏ(b;6g ַ"A+!H^Gp ߗ4]G[e s&!}PY dH<72Bq?wsuit0qPjV`+w.ƣ YDS婈&="Mj<,Ryk$(:a]ib UyW }'h} ~:C|&%~GǛA>ӳlPEŎ(s>3w.ۅ[1O$SܒQ%8c+"W|g.T:>>MᬇÍO_KEœDѹ(c"kp[Ŋ G\*Iq'pߘP{ν=;_~RdPʸI̗LPRҒCQC0BKIdcK!D|W !5c{ gSh[Y9e6{Ds7y(x3a[t[٦w7XDH"2]znF?#)(zM»,*,dgg^Vgp[}6*n+BΡGC*@HtUWM$B#}'Dʨ`y7ђ1iNt5f sa>g:YCP駦%񡩐 20f{WM(endstream endobj 60 0 obj << /Type /Page /Contents 61 0 R /Resources 59 0 R /MediaBox [0 0 612 792] /Parent 13 0 R >> endobj 59 0 obj << /Font << /F58 7 0 R /F11 26 0 R /F72 23 0 R /F10 52 0 R /F8 46 0 R /F56 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 57 0 obj << /Length1 786 /Length2 1189 /Length3 532 /Length 1767 /Filter /FlateDecode >> stream xR}KirYg|}Xs磡avd{ d{`i)r1 ;;wY@g ` xb kO": IaWpX8sp[AQ4d0  E%=l+0_&~Q(iQ|H@pF^!j59S %zܣe09Fe$8(V@+8Eβ1.Ea+ńxကDA8$۶,ux4S\X+Ŀ.._c), H تV "|hW**^ %Hu~-4L*8RH@l)FW<֎B(4%B40DD4+oɤ87Qyoc[ ArGLIS%0./&izfyW7v7DJZ$2ى&Q];ΜJd.F*c2 QrO)jz&i>]mܠߚ(?摹H'@9~jsuU5}ĺlaNilE 9G_Ե^+x4MPAN,*Y&j8DeqcF ds b݇7`eStqNo]G8g6Y'Uxx<"J!ZTNm=b+ITO ֝Wu!-kݞ|0U/djXjGDxV`ʩ'?N~n0>+rNꖀ]f7uuwVj2ճF5*Vcyn> NNpv0{X5%}z01kXȨ`kRb-j%:EוfmVncYm@ܠXml@/ Xȇm b]/~6Ovɼ}ʌȶ595\jX^=CILV x8R,;[d:/#y&,$MdzT/AoWz;yzARb,۱PQV,AN%͡%'OXl>zMTGהуvA̗C;lƊMH/U %r9nv,OԷH{oS?X+瘳|{s"la}5}7\RIvڡ!Ggw̍AwG93kn׀u#*:sEjC#>PkuG aߵdZq|bB_ǕIqygcD. B@CUF5J];Ikٲ69W-Դ< 6pNxS4mժ:SGRcÂofu3E:VCr[}/5'Qqs{ﵷmT2'TWT '$i^:y6i׭q2Con&m,n-(GhYUwv3&9ժ#=UeSN$C+H4_aendstream endobj 58 0 obj << /Type /Font /Subtype /Type1 /Encoding 62 0 R /FirstChar 40 /LastChar 41 /Widths 63 0 R /BaseFont /KFWKVL+CMR7 /FontDescriptor 56 0 R >> endobj 56 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /KFWKVL+CMR7 /ItalicAngle 0 /StemV 79 /XHeight 431 /FontBBox [-27 -250 1122 750] /Flags 4 /CharSet (/parenleft/parenright) /FontFile 57 0 R >> endobj 63 0 obj [446 446 ] endobj 62 0 obj << /Type /Encoding /Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef] >> endobj 54 0 obj << /Length1 787 /Length2 721 /Length3 532 /Length 1287 /Filter /FlateDecode >> stream xRkPWUu P T E !D! H*(%&{d7n6HL-Ԣu Zjl-j 3E'BV[݄:Ngӽι;Rd$A> P9Q' J(,Y% b D( JY4/t$@fG hQPzV> ٵ R`:,ː$dYLϡ\HS 1010X3YD'!5]!F`@MR ELqo -ƉF ^Fd !Eq7yS>d3t!M¤6"P(wVݘ Zc5A |AvȋɈ@/" Y'ZFI 'H PB,!#% 8<>A$2IT!AwF܍OGx+-#E@"o@ J- r(&u&$ aԳI}5,9:E0qwǴs >±|*)8>0\;p+v];OJݽYƿn-3ذÊw^jnD8v{WaCq[~/9Ru[̯c_8qЯ}>\vγqZrcDeʾt[AVQwELmʻORo{*8uK[m|]I*߯MAÁ)M1{lO<3OlWqޣpLSQ!w0tALj+ hm{)نR:6l~Ȏr(I_{>9cEm1sƸn(|UHmUlW~7FOOgMɓ΁{[zy֚৤޸1cjt,g^vhg ]g=ۍCh*ģ}Gt :$tEe f@Dfk}k:<xށN˯B>EOXTPPy36_zor(,kK5s,ĦlLִ-KZ/4ÏB@o(EFZqendstream endobj 55 0 obj << /Type /Font /Subtype /Type1 /Encoding 64 0 R /FirstChar 50 /LastChar 106 /Widths 65 0 R /BaseFont /PWICTD+CMSY7 /FontDescriptor 53 0 R >> endobj 53 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /PWICTD+CMSY7 /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [-15 -951 1252 782] /Flags 4 /CharSet (/element/bar) /FontFile 54 0 R >> endobj 65 0 obj [770 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 339 ] endobj 64 0 obj << /Type /Encoding /Differences [ 0 /.notdef 50/element 51/.notdef 106/bar 107/.notdef] >> endobj 51 0 obj << /Length1 971 /Length2 3704 /Length3 532 /Length 4389 /Filter /FlateDecode >> stream xUgXk E)I!HEzS#  %Д*]Pz RIUD4#"HGiR}x]{={3#tDB aI"u yx4,Kp"T 0 D&j CְG&8{4 - @ZfZbWMPw/ -@$ !'Vvu kCT@xx d))(h,EPDa$'oȍp?*- p#'* { WoB 9<#oo$'F~ˑ B Bo 2"~{H9uu HHAA9(aIKb (,{@_M>(eO?>W qN_tZ@1'wjAЪT%ɥi%aڷ(o̡蒳I+ze #g_ (t hv ݚ 6&Lf8gZ frΕH{q!)0Doՠ2_[9lӶs}t:~0"tT@1M2RmI,^yYW&䬌2(wڸWĀlV"1)ޢ ݆mo-8Mj@T,!j&۳i3ñ>W=A7T@wpsKylQ)PUo{'Sϖx}˧#!\5J;̙W Mz6߉b#ESdL덝eD$‚ړ(/Rf[Th)0ll4N7-wvJX-X͝Hsh'6S 똟J8N;TfKȽ8|IDQJkB%?庥U+7|m`D)”̳`vn;[anY'=N툆ʲϧd΅ mѼSxP%T nHMp0xzڙ-"C(W̶~Vȝ7znV=gZ[FkȎ ~]gm9jshyGAz@ܓjK̴<:fM(-:\5Dg̘vGS`O#vm4"x$^]_Pb :<9M[*#%IӋ!ǣT8j?EKfi(Y] Is.:$) 2 :w4@Bص5m{'Uf6:;b; ju/.yUF7G]X{4W߁:ۦ*5~#SdoH6VmҚ@9IaȂY Ow.2ZhkA"ssg~l`?#6gV=.a>E;g@I_홻ʘקr @ Z'kdJ~q14;,,3Dr} X?#uMB#3L:qvebEfZCQMXMyΫʝ7>CMa9;|=k;ga-ؤԼ5X=fivͬ5|BE:ierRB.i$CקG.V*>ts^W4i^G_8;WLîTazy=;eUF@OtZi[k^^]`oJç->S/%. mNx IXR*cYH}*Wi .t @aۦJyF(e S|V֣j&ꖩY-.''ь: 7k]-k.nLUkSL^۴|g͖g<6Cl0DNv(}ܯΝtMF$fCr_o[c}Am5ݗuoPK}2a.GAS-m*lj#JYr4Rm}0d]Ow^|9\3>VKAKzCO ;/> 8/!$,Wʟ [k%]FS֑)YS~6"_Fo|tOXlSՖ-mXs;Q'-n'􊎪:[c/hkTZt,}q7{BIHzT@/XVs]|g4¿z'E0ދV12B0U> endobj 50 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /VGWUTG+CMMI7 /ItalicAngle -14 /StemV 81 /XHeight 431 /FontBBox [0 -250 1171 750] /Flags 4 /CharSet (/omega/comma/less/greater/E/M/a/d/e/i/l/m/r/z) /FontFile 51 0 R >> endobj 67 0 obj [720 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 339 893 0 893 0 0 0 0 0 0 839 0 0 0 0 0 0 0 1089 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 620 0 0 595 542 0 0 0 404 0 0 361 1014 0 0 0 0 530 0 0 0 0 0 0 0 546 ] endobj 66 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/omega 34/.notdef 59/comma/less 61/.notdef 62/greater 63/.notdef 69/E 70/.notdef 77/M 78/.notdef 97/a 98/.notdef 100/d/e 102/.notdef 105/i 106/.notdef 108/l/m 110/.notdef 114/r 115/.notdef 122/z 123/.notdef] >> endobj 48 0 obj << /Length1 779 /Length2 1108 /Length3 532 /Length 1689 /Filter /FlateDecode >> stream xRkXg XHX p @.)u!3!L@ ZD%JA"-T] F[UܴTaҟ|~yWg^;S)tLFru #űHDĀtßKrT-GDJ@ ^7b1RH$EjA C<=Ht:Q"i(F qzUҷtD DuX `DHD3P5d~֧! *V%RF\hF\ *j6&FM UpLJ!#!5"Ytb0 LB++0erD}}B%n*bH= IAAxf; ~>D7XLP 4bf*{D6H 6o<_ p3 Jk*6:L\%s8𭮜_sȕ'GyԐ߽<=%l_}Xɜ*qB3/8LW,4fؔ07^ZhiXgoQaRky䳩ԵY>h;}l}ENGur_,zfs_S˴']!mI#wh_B ZB_+ikH)EO_呓ov[okF[=yxi/z?1=n\I_!V&,s)w7dAߣ{0o]]&u}U5Xt]9⸿K:@Ogy =m#u#Kv_\Mi;厛A zI,ʩ$PGO9vŏ}-vƾF*|7SMեZ^-αf6Aa/Eaݫu]R돖̽{$pМv3 ;ROh+"LKWz_ؚϿ883)pWEQ//\`x{z{?:b߮GQ-Zh{pB՚nCnheMc考Pkp]1>;#Ūs{ V+K4/d+kȔUT&94{;[r2ryʷF黩tk։ v3!"˦5t~6s -ڽuegD׿ZH =@I׫W%if㍃Q2;GdAm}bo57_|I}Wn1f2l*e&`}Yƞ<֘/aD7X7}gz-._rJ,O}aPo UzEwxni}ՄMXFbf)Mֵ< T?W]z>/ZMz܆R3aq6z&jʎzbp_~ /b+q $F'`Aendstream endobj 49 0 obj << /Type /Font /Subtype /Type1 /Encoding 68 0 R /FirstChar 88 /LastChar 88 /Widths 69 0 R /BaseFont /UUZYPS+CMEX10 /FontDescriptor 47 0 R >> endobj 47 0 obj << /Ascent 40 /CapHeight 0 /Descent -600 /FontName /UUZYPS+CMEX10 /ItalicAngle 0 /StemV 47 /XHeight 431 /FontBBox [-24 -2960 1454 772] /Flags 4 /CharSet (/summationdisplay) /FontFile 48 0 R >> endobj 69 0 obj [1444 ] endobj 68 0 obj << /Type /Encoding /Differences [ 0 /.notdef 88/summationdisplay 89/.notdef] >> endobj 45 0 obj << /Length1 829 /Length2 1423 /Length3 532 /Length 2019 /Filter /FlateDecode >> stream xR}8f4oM30v1$Nj13 J,DFDJ$Rڎ>ԪrTC -jVb\uݿ׊Eዬ'Fg`ǻb܄K#|wrP 6@?'cA US$G@0t(F58,E80$d0v %C .616S08\sK cQSb*"|^Ba/= B7l}-Nx^)fEü? H@,p!!kj4qaq]Ń9d~8R8 ŋqܴ&@Z=3 _T5_5`</%UWgy9[` 8 z{Њs!)ak>"B4D1SKyPh5DgCa8 1:)!"+["?O$R3p"w$M=_4}Є?a0:Bӟsj6<ɣY KuC^qm^ʓlu^i -Ʋ:9RCljI쾆][Qc=TJv(Kq}S^\}4}kn]R"ӵ.~64?hLn{otPӰ̎ҐT΅OMA(5h) =BF=25 BK{CVF4~p RrB+~r'l63K'GTu۪ ܂ؠfyCxqcrf%Sxw͊Vl 8У~nߥtod9[K>ܛ+MO [B5r).XO`++5˴<jܴaCUKBdc_puCS2sG#Zj8)Rk!trvui8(r(Kn [Mmqkh1ggN۠~Y捺^iX__ؽ2sڏ,۠^[Xkt}B9ojL%K[5{:qB(JƛR} nذriEø6>mŕQ|]GXaIrQ;EuyHo < q]Wsa(|%hcY1Qx_σ#Z_qqqj/eEIȖğO tBOC'9y.gF!oR~]1|frǎr?d^_pboAŜG0[ql )jf\5ܫ=]U?Dr6=$0pmG"-*'xg_JnAhk|mN029ɭܭ͖ :@2{KsL,4*S ~c{O=N?~rb5ioÄYUyEnٛ3H[eRxs}ĄlaI2iWziW2esv?+=.k젝EWlnHxٿ(a^> OpxK(BY( endstream endobj 46 0 obj << /Type /Font /Subtype /Type1 /Encoding 70 0 R /FirstChar 40 /LastChar 61 /Widths 71 0 R /BaseFont /YAIWKN+CMR10 /FontDescriptor 44 0 R >> endobj 44 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /YAIWKN+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/parenleft/parenright/plus/equal) /FontFile 45 0 R >> endobj 71 0 obj [389 389 0 778 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 ] endobj 70 0 obj << /Type /Encoding /Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 43/plus 44/.notdef 61/equal 62/.notdef] >> endobj 25 0 obj << /Length1 1088 /Length2 5311 /Length3 532 /Length 6050 /Filter /FlateDecode >> stream xsgXSk-U0HTTH{.-4i@MzUi )"( w)қ^>罿sƘcwseh": 40X, T W X: ed$:^(8$% HxjXw?PK$TA#pHGû 5a( UP(_@c'獀` : _1NXԿhC)osp,#^gqM/N8 Dv#p@},Sj9}gTC!U0(P,!D"H D?Q-=C]u! #?7 @s/q‘gD`~%:G?@cQ piAR)PT?HHEG8Ӎs"[FDYn:WbcwAyKa)Z}gKP w YIUV-hELۃ*nUb I`d^c3<(vmNN~Ųl:sT Ig*y  X)vqY\,Uhc;}J@ 7dЩj[kXv`gV;Zb3l5Mٿ6,ek:S M|jؼ5.ErWTL.muː#2YɬSO)Ю ${b8[Ⱥ-ot_t}ʟ 7 6Ju++-Bm\L.44stn vuo'y"8K-f[];AEqABg h;,ؼ _cwh5zcK'? eÛ n*XT)>o ϩ AUxڏbOa1zHu`V(eD0E ;=D /ܕJMMA^NZҼ$޻ObC3-FJ'Ƽj%nb O}xso}L z3Z2n1^ajBtX(+~Dqը d2{LYj쾩YՕ*:gkvC_ []BW =7*vb =|߻Q:7~V1xo ܭ_Y(0Tt/.ji |H&:TW%gf+=SvK'ie@S_> QäΰE)-^/x_[y|gFG`yɼ12W}pU=wewYÊ䅜c|3v5#"Zv=3elȰ:\ 8 X.Z$|l ;؊Ž// x6eoa#jx?-Ӝ9mNFܬs(1oۣʳ:ixp{JƓ]Ghn) ☤O eVꪫ.#xZ0јd%ZuS;<wE!6͝>DO-21wm+~{K1+ԲLf˄$QŚVy:IK2pW4 _S|sWLBlXV|wc{sWS %#9t%{hq4lrvNE4S3z cV[5m7; /pX|bdJ/3*J4>)7(y$ʙ+AܼF)wp {?;rC3Guq rp2ݭXT.``t= RvxJN꩎5KZ'Zܧg..gW\.d^Zi VqA(W3h#KJ[e>elAHhZX+4 }vF:_%Z]*ܾRhDsir[ĸছ}ʲFe? 3^$.=!__?/asio$%Ay=qؽ4A]>u9Q[LtzTFdc "P }}QovgakT?Z,Zc͵o'cxN1fb:lzvKݻ!;dӸv[ B3ķq(-$C2y@MQt1%G2ֈG/kX . Jɻ;&ϛkN*,kxr%~nD\w~LThɈ_<it"7!PƲ= (W½VQstye(Mʳ#RFPvԆ3!7gi+_ I: S+q.:Pa[":VtFUͯ2OVLk]D+k淍libmcƇ轟^F-C\HW;^İ#$3]{7ŊgZCJ|,|;NUqS\TCh9Z%\kt:Myʕ@y$p:]_p}{~r/|e–剗tߢ[[˙D1pVa ЧKd&$o/ 2ݬOa|d;T/΀gWEZu[IR{c8 :/ǭߤmۊpAMئ Л.]͇mlkO{f@MЖ$l9CJpq WҜ82mv6'1K@1ʬB؛4!5vtAgNq o;Vly@pyr Jl7 \}qx 0 vG!ޫP^1;dz\-G`lg0UkLIo~MY8SPa$dA[S:uagxa/\UQr;й*x ų $cDMmzp|06gٻn'9<47yFKyۻWZ:l:dV7ҝ;. *D+ w?hzQm{ꕑ=z5JԬ%Fmi-{,J szj5f]K/ZII#LϵAZ9 BPOK_K0iI2fň3N&Ud* "X -t6g&q_ަ/.[#>`ӛ.oR6d1%+\deZDEx ?O:RbjIaHrk&QSyپj`s)-,㠊DӠD,8!p-fgkdD~cRN:#G'lR9-Ns nfY!as/Wo }/|uBw/YiTM(˭gJEڂ ~MWR7v#7Nd+fs"}Pעa``4HI blD A=V#ƍH9dձĿF cZ>UmsJ%J!gT(|%f.ţVf^A,SyZ{c ]ҝ"9 8EP|-J%Xto6U4,îj%ZgP1)wQD5̀U&^/{nmTH' \̻5 BKt3)uzĢY_*6V G[09 z}ڶd`fUp1Q1;axC1IV,U!9X@e:1BH8xVgcH[ ғ?hIJT췟yPIB*t49to>:913-:@KLI~H!R>dS^xqc85&$RMae lISɚl.KDun܎.)0rmIλ bU5@vM M.}F;[$]Cv&ҟReV-,{g-#1ڄT^7*H> endobj 24 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /HLJPKD+CMMI10 /ItalicAngle -14 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/alpha/beta/lambda/phi/omega/comma/less/greater/E/F/M/P/R/a/d/e/m/s/t/u/x) /FontFile 25 0 R >> endobj 73 0 obj [640 566 0 0 0 0 0 0 0 0 583 0 0 0 0 0 0 0 0 596 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 778 0 778 0 0 0 0 0 0 738 643 0 0 0 0 0 0 970 0 0 642 0 759 0 0 0 0 0 0 0 0 0 0 0 0 0 0 529 0 0 520 466 0 0 0 0 0 0 0 878 0 0 0 0 0 469 361 572 0 0 572 ] endobj 72 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/alpha/beta 13/.notdef 21/lambda 22/.notdef 30/phi 31/.notdef 33/omega 34/.notdef 59/comma/less 61/.notdef 62/greater 63/.notdef 69/E/F 71/.notdef 77/M 78/.notdef 80/P 81/.notdef 82/R 83/.notdef 97/a 98/.notdef 100/d/e 102/.notdef 109/m 110/.notdef 115/s/t/u 118/.notdef 120/x 121/.notdef] >> endobj 74 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl 22/.notdef 30/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro 129/.notdef 130/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE 141/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe 157/.notdef 159/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 23 0 obj << /Type /Font /Subtype /Type1 /Encoding 74 0 R /BaseFont /Times-Italic >> endobj 20 0 obj << /Length1 1023 /Length2 1702 /Length3 532 /Length 2342 /Filter /FlateDecode >> stream xy<Ǔ%Fϐ%YfHcdOOl^\YB5-[^K$YB**XRebڸ=?9ss>pCX"4H56ofhDH5&/O B63@mI (6f7LЧP鐛;P߱ `=A:D3< I! jD2+ D5 !p 2L}AJ4o{DJ *wT6ޮhy)6_2B0vwuăWT[(5&Ҍ"{:+uߙ^Ҥ̷K(vp0FD؇nbԏb -VQpeu/ =~>5'hh%aĎli#&ӓ<`U5R%߽w)*j JʸLmM^4\u>դuh wVYTܢ#kMD_99}kC-m3vOQ "E/ga*0+^ p\V핔쌕=V.w$zg4[:|RKx(I,aFqZu%zS1}#Ц?z@qCH8~Žs{ ̗ ;Q?,j/7_YPnvsD;L@%W4&?,x{,?oYWOV!Nq-S{;bZusq&eh5Ng{TUM^o%!dSo "xQILQȿL 쎃7;+~_2u+:KNcnӼm@9>?-ظc7pX`I|bJ3Kdhl?*}M2ʸH64Cmѧ`Z`V蕇rc6[E>%&R xn7<_Tں AJ)rE4i(w,u)wesN@L/`,qzRY_~0֭5ǒ|4Oƣ{oli׷J#wmxi2|@Njߋ˜AOUbwEp$?|`/?Q@tO/Iendstream endobj 21 0 obj << /Type /Font /Subtype /Type1 /Encoding 75 0 R /FirstChar 34 /LastChar 105 /Widths 76 0 R /BaseFont /QKOFET+CMEX10 /FontDescriptor 19 0 R >> endobj 19 0 obj << /Ascent 42 /CapHeight 0 /Descent -600 /FontName /QKOFET+CMEX10 /ItalicAngle 0 /StemV 47 /XHeight 431 /FontBBox [-24 -2960 1454 772] /Flags 4 /CharSet (/bracketleftBigg/bracketrightBigg/bracketlefttp/bracketrighttp/bracketleftbt/bracketrightbt/bracketleftex/bracketrightex/bracketleftBig/bracketrightBig) /FontFile 20 0 R >> endobj 76 0 obj [600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 685 685 685 685 685 685 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 485 485 ] endobj 75 0 obj << /Type /Encoding /Differences [ 0 /.notdef 34/bracketleftBigg/bracketrightBigg 36/.notdef 50/bracketlefttp/bracketrighttp/bracketleftbt/bracketrightbt/bracketleftex/bracketrightex 56/.notdef 104/bracketleftBig/bracketrightBig 106/.notdef] >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Encoding 74 0 R /BaseFont /Courier >> endobj 9 0 obj << /Length1 817 /Length2 961 /Length3 532 /Length 1541 /Filter /FlateDecode >> stream xR{8Ti.a]$RĔ94Դ]KIvo8̜ǙEnTk.ѺŪT*].6mXvU=g_w~~=c{xZډd>IFP(70Y,> 1 y?v _rb˳Bx\[& erQ?{Pd 줐ą\1JBLgUF(Yː%IڜѦuƗûSN('XbBeM֒FK *f,`i{Imi˜yY3Vm+m"*~kUq֔ =%;XkqnnNQM HUQ?/v)پ.*9mlZ8Qg{-̒ו1u.MjG2  cxFZ _Yު2$,b)k {w/"I,{Ҭ"Ռv32=ҪEр \%3qΊO9e&Vl%]Fm~4b^bպ/h_=FͭK[v~X(:43>:7L'$B^n٪0Ō|8Kzg^\lX<,pe޼/7O4J FR2)F0IFendstream endobj 10 0 obj << /Type /Font /Subtype /Type1 /Encoding 77 0 R /FirstChar 102 /LastChar 106 /Widths 78 0 R /BaseFont /LUUUSD+CMSY10 /FontDescriptor 8 0 R >> endobj 8 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /LUUUSD+CMSY10 /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/braceleft/braceright/bar) /FontFile 9 0 R >> endobj 78 0 obj [500 500 0 0 278 ] endobj 77 0 obj << /Type /Encoding /Differences [ 0 /.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef] >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /Encoding 74 0 R /BaseFont /Times-Roman >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /Encoding 74 0 R /BaseFont /Times-Bold >> endobj 13 0 obj << /Type /Pages /Count 4 /Kids [2 0 R 17 0 R 42 0 R 60 0 R] >> endobj 79 0 obj << /Type /Catalog /Pages 13 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.00b-pretest-20020211) >> endobj 80 0 obj << /Producer (pdfTeX-1.0-pdfcrypt) /CreationDate (D:20040501191300) >> endobj xref 0 81 0000000004 65535 f 0000003817 00000 n 0000003712 00000 n 0000000009 00000 n 0000000006 00000 f 0000067452 00000 n 0000000011 00000 f 0000067363 00000 n 0000066987 00000 n 0000065171 00000 n 0000066829 00000 n 0000000022 00000 f 0000065085 00000 n 0000067540 00000 n 0000008105 00000 n 0000020074 00000 n 0000026558 00000 n 0000007997 00000 n 0000003920 00000 n 0000064299 00000 n 0000061679 00000 n 0000064141 00000 n 0000000000 00000 f 0000061588 00000 n 0000058872 00000 n 0000052544 00000 n 0000058714 00000 n 0000008473 00000 n 0000008616 00000 n 0000017116 00000 n 0000017135 00000 n 0000017156 00000 n 0000017191 00000 n 0000020053 00000 n 0000020444 00000 n 0000020587 00000 n 0000023600 00000 n 0000023619 00000 n 0000023640 00000 n 0000023675 00000 n 0000026537 00000 n 0000032391 00000 n 0000032283 00000 n 0000026725 00000 n 0000052108 00000 n 0000049814 00000 n 0000051952 00000 n 0000049485 00000 n 0000047520 00000 n 0000049328 00000 n 0000046779 00000 n 0000042114 00000 n 0000046622 00000 n 0000041663 00000 n 0000040101 00000 n 0000041506 00000 n 0000039761 00000 n 0000037720 00000 n 0000039606 00000 n 0000037593 00000 n 0000037485 00000 n 0000032564 00000 n 0000040001 00000 n 0000039974 00000 n 0000042007 00000 n 0000041870 00000 n 0000047246 00000 n 0000047017 00000 n 0000049718 00000 n 0000049694 00000 n 0000052405 00000 n 0000052334 00000 n 0000059422 00000 n 0000059141 00000 n 0000059778 00000 n 0000064825 00000 n 0000064642 00000 n 0000067241 00000 n 0000067206 00000 n 0000067619 00000 n 0000067744 00000 n trailer << /Size 81 /Root 79 0 R /Info 80 0 R >> startxref 67831 %%EOF mug-workbench/doc/tutorial.pdf0000644000076700000240000356737110127046041016504 0ustar drstaff00000000000000%PDF-1.3 % 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream x]]ܶ}ǯ\eI[e:R~WkI+_rH4I4,g+l4O_56G;2iC٥\7?4θPY76\j5~=|v̓/͓.'ϮBvNlfu^;1|=֩w5gʲ9:;ۋMw8_t/jp;ǗeQz(  N ޯC{Tb|ʩ(587˺ti.a 8fY< ~k|.k9ӿw#ͼŦsѭIkyiOF-K,iI7x# FrnhydrkM341RJmҙ:8+U+m3hƝjuMyɈ3! )̴\t;q2fj!Q!Xo|UYk| gUT+يDo./*Zi.Pv[85MB<za[~zѽ%P gPSq j _Um#e :G!Ҷu!܈?^ 5 ƗB}*HɈk;=s}'x E֧ojNߦ,B4Gc^cI`,R# U  ocdgK~&}\ǂ@tH۔ =j{ }ŦԆG4@EMvJzj٧JDaL#PED  T%]>HYo=kDAfBl !|&PA! x,ӓX1\z&=CP$D~C& 9>yV] :blټO~[9f Բ?;'?Vf0F1ފ_nCWَ(&GB m2f;#jty,*\ 㜁oA1FAD3(,;kjb/8 Ҽs 6CX4O6A6oA/U |l#r-ZFsfʐ*R(BݫZkmS~/uM_z2 T3-cѻT%ZO8S"i%CI/͠% q[miP%q%>Я(#2"TS,Gr2^!cB&ϰ&;{>'9MLA^.X0]uGw}!B:BwL5k*ܠk齤;:Zws^AU>"2=PSEI#zK A4 0^v!= $ GI⋇ۊX F(6/¶;a;'webeaQ l[ТCpU |ME?Uw8i^8Y";>ط𬫷Y/i-@ϠYp'ܶ+ ՚ckERo m|=8V֯R;V1awB$/H1@D @"Qh!0A5c@v2t-\­>ڳۙ Y%(6TM# cKryˣMENͬ{q= h=jV3*kkZ;~%Eno6mmݢZ67ޖ`"|}H8YW҅4 e0PZdVEygBƦ!B^ .+PGD"A((gܪ=yEcxh3a4f`8\5wY.$ cPz#$aH+QO5B (K0rȐKym '8m,J$)2P @R#,isqL (k]!Be qHj7}4 ggA?!_NckM{ tTMAӦEx&#c9T颪ӕbm9# ߡB4}d2tuzF9".7P/AdmABm$3 6oUEdR]X +چe鋔`ArDV$.!6eT UgZR碲q9Hm^p FGiɂr?9S],*[5Ph?C0cKA[ ^wgXfbɎwst'(uLqieJXx(8!|kTn U) C=pp4*&C2o`][=l9wtղ,Uq8t+0ex߮Z`ھ_ɚ-XPW9G. }("R~fX2e"B(&#os{%wEU4LJMgrٰQA7'3ӑF15 SuIC(jP ׈p v (J`.|jL8H`MH6wmmcx $x!Lگd ėc}$Pm ԷՁx`.iR0谒^3UR0#=/ƟF׶)n®cu:ES0L1G,PERt)lH !YCzRF9j'|K\ 7f}[3~%H #ӳy#R f]Ҵ:9yqfЕ/_VktZ:%W%;d[Al }z=Ѿ zV =t{:TIP#N35ꮧ3PU( 8Ǡ-5&Ada:k2˒ DIj+cuUȏD򺧰c;D˸K]"c'- k1q(vha]S@!x+bB3ba^K;nmF^sKz#0ܒyۊOK}|a@#%WtP Y,R [Qn oP?N L3gFajdSPM}M+QO|vj2c Ӏ񰓻}dAD _ KbS%fҞ ҙYLE?S.iD%ޖ&M`f 3"Bg8 *̡_Eqnms)?:.gk~K42T6Rg޻O' S(䁑$ ]D!ZKXE'{JK8\D endstream endobj 1 0 obj 5092 endobj 4 0 obj << /Type /Page /Parent 5 0 R /Resources 6 0 R /Contents 2 0 R /MediaBox [ 0 0 595 842 ] >> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F3.0 7 0 R /F2.0 8 0 R /F4.0 9 0 R /F1.0 10 0 R >> /XObject << /Im1 11 0 R /Fm1 12 0 R >> >> endobj 12 0 obj << /Length 13 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 881 3506 ] /Resources 14 0 R /Filter /FlateDecode >> stream x}K4mE!G[#pqZa; X+P|?|{Oy~?>z0??˧~/w:m\˙ybu$/jSZ+*/&gyU7_gu^Xm~ʩV6(۳ؿ]L{*{tS㴳 M{D= Du77WsUP7?j E/ڨtE/5Y> +tQNyQ lVO򺝿z~VЬiu;__ۛV㛫]uޭ)Oon}ctIQv$k篿~&P9ͥb%_1 Nz:w}|,q~]E9g[ӼB6~[xP~5,k ~V{~ 0xB^?< 0y֫5>Ow|~fBz7@S{Avc+\mg}=Xӛ+x:N'#Q5 Y(&3^\,AV-{ *|&- Ey^R̍r0.7[[ߏ[ut`ܵZ}k Qu |袷̧$oǁ "b $mw4iV%(au@3d1[[/$D@%SC [<2e1=`m{H#Z9eЇFԢx ~x+&%̖ شջO"UeMw"t ^P |l!K#qj8N{:B}0k:'aw=I,tK}Movȶd;f츛uӰ:l줛3L*ѩmNnx]M/]:CVeuF&=fRf"\vsd,,r*lr[#V6ᠴK.-rdm{Q BBZ02w:fS&hl5Dŷ>daXDX35*C,(P}bvG4^%Mk{#A9o𣄻~ЌoU%*&f9F:ιCE9Ci[a(63kk1JSh.r ox&k&Y(w ?:,Ag̠'VaJE}} `~0Gx4a9vlL;V‘Mno 9**%<,wpVɨh1\8V"\h  }Q%Q?LQB4 &ta#r%T\nC;֕UO3qʰS^ ћm%|H5uu.!XlB|ԃ++GSA"PS'ʽZ\iͶ ] L{h\oj֌S a-TL- pAUF0Lp0|[8*jNԖ CC<]*Q!Daך !S4AbaRP.jbdhH*d\#zPq0*LPؑaOSM4 )I7 r Z+gY[gqi%N rra ?\g86퉋))O;n9bp!G4jBuw0cR U8>_b]zACB.MCיz˒~bdRe;xFm\T >FnSڛP.grXU&LB7ڹغBv7dO^^ Ǫf`p]5#@;'P?mBQzN A ׎2V_b 3ep 2k9fdBq蘉KB.oE n2KS'hlig B]cf%U4q crMY~چV8!G56EFFMMQ!\X`pgK&CZ< $e=;b{٢96_ 45nL$G~#Y-_GS=p8.=!f*9n{J^aaUV٩Z*p\r[3M3V$z}V8ޖՅⅉNjpV@;Y)#aEL.Q>⤦uz:qѶ߸{x;r ;:c ikZܥr=gcg{m6VSSOQۘ!»AUOD?jaGy/:-Ǘo^Y56-漣mNqێ*-+nNM"mGö1SxlN/+K@і6jCx O]b mj1RXC؅UcwidmێM6Mg9 sM ZS!!\ĭw5hj܆EmRX /䴥TAatx~&YxZÚBźX7w79Lqw'Q[*Y^Aa;E 0KG+K,BOH:A%GXe 3Ь޼= FREWw%?d]ݽw{f<茲CaCj3"G$l?jp!i2IYىQ]]Ε/.gf=0tvﻹR[ncNH4a5 E]f7yۖZ ې QgnvP+UZy| 4F#W;[AG93Gf>r&<$;V!+FsU3&-(s[tY;sA>\o]3xmU2ļ1y+bzpE-``pU؈X"ΦsSbD2cI-#6P@k*i ] + zgQ(e㩭]Jx`*wmyEaviҠ3GODZVߢ׻K%, <*NrR[XhPY ;Kpam;Zz;dR^F>Pzٯgf(?14+q9+qن%HQB 9y2i8+7{pWܨZ8hKXG"[Y!GGd:*~ Nu+lSՎn6azv~ضs_jjߕj<w[ Yhn==J?\ϼGv8]YVx[&vbF6~sV0rttuuJWZ,T-BYfT!9n==|׆trΩvq9jBnU󵲃d6ZAt(l )vhL:*DjEBfZ ?K8_S2p%[lYh˄EzIm2NU&};*`;4Nqj벫h]V}]HWZե@00TRpYB@U+W@ ~b(3Htqjqf]eT\%8ʞ tO]gPɔ(ZX-6ia2`PUzSX.>ZVOm{ M?@$tn؇;2VNbţzNTV[x#XwzKUQ$}.TԊCGi?f>8!jX6dQ& 'FI3[VZ*$AHrIfˏKFH3ɜ8B}54RBiStV+)ycrMf.+?%"¥e5)Kyʟ> SCR#`$\LE/7f3~P9LA2tآY9:J*\\m\6sl¢8ٯ1%qq6&k{X.CV7wm=Ui9۩Zd6i(\59NZS-=Sl®^wC)Yzeѥ0K]7([q 7%+p jSgK1[{cΌmyo4%Un#7pݧRcf"ڴ6R 28jޡ$\yg$d+5e|ycY.â\t%\InXTn6pV[;6/w "VڊP; n)X-ڎ[x+zj:CAmpY)-븕rdţp G#X1IGPPu_rn:6|fuQW~MvF|:[OpšĥŦ JdE:Dzڅ\κԗ券ƪK.6HǁMIޠeaigG3M4-jγy;Ut IZE8Ÿc勣9|ɼ]2s9G\qյ&Z)vcsh2Sq ~R(vԭXp+b2oe]̺@P$Cd+[Ou ^x qXuE=G{mu1ӱі rtjRnJĄJ\}]a#A\P>C-mVY3.qm/'ܠ#GG.) Klwovov%mv.OͻAJJJJtBCw_zB̒=_i~sss7!E%v,δ8Yy@ö PEfzH%͓AQ?^n}pu+|C FHutt">(JKSg4?9Vuc6JgS]gS G%!B;u~ug?{o t'݄Tt?&UnA3yΑ=~;s7rӊz2I|ò%+(mF3!F;CMZMdRMyɦXHr5wh4HQU3(V~B"À5duR%-F=QjpCv'otBщꠎJIm=z&.T]khVKu&P\nGj-ض_jF~II_RR\XGf$PQAd9Z Q*4EJG(xx<'f6ӏz Zo7m{h:₥~d3uYQ):`{:;$YL;#ZLZj!6MAV^%JY,TH:)hu_3KPof_&UVޱ-6rGxצB6g߮ޕfsi+BhķP lec\'ع]yH4HwVY P[eł~%FoO28;7:܂~ioq[u *QKg nvI7[݁zOesijF R1؀t_.\;[E $_\: Q8o B (l'`*>dL*/wi,_8RoDݛNaOv7_XL`QzkA5sD@i9_,AhK)2 S̰3*GΏ>g+F@ȋ% +?+Mj83.p;%̤/v T2K:X7(D K2*p%!vSh`%M>tYDbejZz]Bܴ*: CUznp8P%\ug eNNZ;AkƉ&^_\7z7:og]T-[r4*VQU(Kܘp<+!2ʅu )$NZcCIL֠3G QCG¶=EyXW%N] jfTHΎ+ [O6 .Cc3.zXCU߫\@%% p*~%wO?Zp3,uq=ږ" @vzLq-?Y ޿8#U1+ǫ!͓-20VénXfhvϭ*ahnd[2сLv.3%G#I6%T&B_hGpӱP;9@Ŏq;Iߚw49xp49 6(NӲRi&# c Rx']6Tl*&gOHWo>ZUCEO CDclZgz]Ŀae@h p 0\"5ve]M2M23gUt44;o: @^;A+`9MƵ[--7sC-dTP0>]Q*wf~]NWɢS.ֲܣ2H"y aɑš) mSCvtOÓ:O|k endstream endobj 13 0 obj 8846 endobj 14 0 obj << /ProcSet [ /PDF ] /ColorSpace << /Cs2 15 0 R >> >> endobj 11 0 obj << /Length 16 0 R /Type /XObject /Subtype /Image /Width 228 /Height 129 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x]8֭Ȁ' #Jvб3Seof`M̧ɜ9q0pN'HR6/Zsxyyx>7jԨQF5jԨQF5jԨQFAF5jԨQFO_^O}7~';;B__?H>| C-U{wӯÇ90 Ջe~x ;@2)S&VmK]oޢ1|5}.u[!ћw Àa=QaT ' .4?܁UO}ܾϗe.g7Q5NV4E?_:s:^uuXr%\]N(VQ{/X󴲞߻˗/-jMp_lׯ]@/P)1L=:ڗ. UVyԕ?e+Jk@:/@ם=t{{-hT%\(;91ԝN3J? _ª pS WVi6 "wvVNƝAo`9㸂GU udK/KC_V6Z~V`ġx BԘP%Z2KX* vX; GvްqD[> 7L@:fY^:Â8hXeC8?_ $:?lÓ2)ڰ ŀ}@J0j0 t+o;ڈt}z[ Irv8f=UgjR|-\3qH+`[VఀU1{/_Sw;\/ n' U=xnV-Vm( [oFG/VN+^xMhX}0fL^xvZ/Sey+ [!ރUʜS4O l䤖U;HGtN4> V`=nb-9%K]c57oĪ~X @VWDXP7jt3WĪxgԛVr Еeɂc׆Α<5.,VjF͠YsT5wx )EXWc]΂30 'Jʴ&ഽ_B:_F1Uj_-.['WrLli1VRޕE XwEcB{ V e4hXpDj/9*P:Ȩ? H#?jlƛ+VaPM})V+v"JUQ``AU~6Vy yҚaWPūA2w?O5>BBN{@sV]F$UՐJ'b%/D3Ubko/{oI(jڳi*Qe^X+hg)}U H)Z'9d|'L^!HsjI }Ѯz{{x D2ۭLۙ֘FS;kQM(վa5aZdf#%멕c*zUeJ*ͦzxXk7+ǰ#s[}QcleխXU[q]<&#Uu% ( 8K*/' q3 n}\԰ա˄$S,≀t'y[UbJ3 eP 찜&c{6֯>K*WazX&oN ?jU#*ɽ0*|ݑoG]׈ZV ե@F0Hl-ViY7E 0$ވ1 :^ xVDfM@mUβWT9)VQ&U<0紻m⮓a"]>3UOX]FTE*{ H?(e*$TgrhXd Pv_GKy5oWd`Jpb@:QXbd++c5\{&XCO*J` V 8;~ԗ# n̅N;߽{7gQƕڌ1T $b_묶琰"/ذ)O\1S gfݴjrːREΙgIvU7PEWRs#:'^QeOD 5IgF%`Z1e(^H*Aܒ"t;HgVְ 'fľ]SVMֹMb"UvJyuQ9 uЈiǮbjmf`EbDnXW]%ei;ɯ+Pr+B7B^L3pv@sR[Ia ݰX.ܼ愗*`?'_r4.k*~$7E"STUmY-H| /S9Ȭ%b㚃Pd nX}tYܵi%*Wk.V'GpBX'b1Vs8 tBq5jX~:;2 XrRy#+tr~)gA+%ٵ7~/Xos;qw+ Gkp.z&JHO]*ņG_9drT=sʩ}o֒9j=tKO,w!ŪPхNUobJ\=Vsp_L;UQ.cVs? V%ee EjvﺲW,qk*P7#MM7.Qr'KIX+OJj,PR dU >PVz{Q,`o^V bulWZ) L;Har Xu >%.A@*V+D@CҵW+m@,nibFyVo''wК. a|;sy-CXfR цgc2O̖^k#Iu_h]#q-<^Jʀ)wK״ \^#׷JQW8C3gG\Fcнkx(!3J _ݗ]QV(\Qq֨~޺8' VjYe8%ꛃIꦈRl鉇ml]ryl!IsU?3Aawe4d22pW?B ]ln`hrx}F^9di-O~ ^NGۡ|܃c-=qQ>239ֳS7UY9i2˦ȝS暪 fV]eDW$BdL]rhx²ץ>s~S+J{BE`dɈ,+ Y&f9J~Cxo$ތzUIBku. M_r%zk&8&~8ܪБ#u,Tqm4DrI(vW5Ie i[i9[w 9E,GJSyjCٖӎv}mjMꚃsttaʯv]вF_J FQF5jԨQF5jԨQF5Iۭ?E1ȇJfGO$ 'V̋N'"V4.Ȑx$X] {ٳg)|L?Nw<όU|Ǐj Byg[̕ǧ_j Wأ](%{\\4zD ~P_sp#kalbL,A:SSoQؚ 5ƿ 4Xxzՠ jrBsa=ibL߾}Kfw'P|p)l K-?,W/=냩~n@L9v\Xmք9^b'C9E$ ʇ :xl@0k7!\qI9Jg 9{jPp|̗|)ϔ(F RWUYأȫKW~uD/*%O9R&>XxL(`! gD~b?9VwsJÈHpڤG]r偂K@KY4& hB\/K}[?ϙkA[;{'Ŏ_?/\Vj ۯ'ذU;uTq[kTlE6cKvVD֕`09IHKD|iKRpGT]4Nc&NJ G,x59Q5@,zzeiY[3=5׎vS{|]Hs#D}(ӂʴK"yV'X[@獪 {MU~Cފ.LO-o(jPM͛76JC8.: Ӈ8osNk,o讥6J#rYB"p`({\!`Y6|X{+ø7K\:a=ot>@W{ bErP43pr5ƣ48!C8h V)B`P(Z`3eV:[:aplL*- WaI2wq$k(d!V٬ù tp֛^:+SY^w =9b&Xcd^Ju[5`]Ds&yc?D3cRUJ58I[G8}Q ;ZR!fGź r"]Ұڰ)V[- RJ_zj =W/d^K&PQY#!Z8XF5jԨQF5jԨQF] endstream endobj 16 0 obj 7489 endobj 18 0 obj << /Length 17 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 17 0 obj 706 endobj 3 0 obj [ /ICCBased 18 0 R ] endobj 20 0 obj << /Length 19 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 19 0 obj 706 endobj 15 0 obj [ /ICCBased 20 0 R ] endobj 22 0 obj << /Length 21 0 R /Filter /FlateDecode >> stream x]]ݶ}_G }Ki*dk*/ZEqˉe~/yI@yu9ʃ̐@ӧQ}[bC%YxնC=vU?zU}dۏU3/45J ?V_.-UR}Qz?ׯNϝ,ӡuUR='sɕd䶑77{6?v/ۺˣn[?//͏~H|50`|ֲe=2_mfkCgc-:EYErCGK6-̏~Gk_MWw~t};#rXmKk_Ýy`7o0Ηi{eěg#׸薑#{Ds~|Q=&919#Ieϳn2޴b0O - S64ά1f,8߸!_f=B__-޶f~n=Fv-P6,:g֑I(ףL뒁ǜhfתO6'6`.KKFG Ѹ7FH c>_$92{erXO #_99psh'@>maAyi:&e՞aaV; Y&fgg՞aaV; ~Y&xfkgծaaV{ ~Y&xfkWӄ˦y΄˦yӼtgi^3! lc sYVB:z;,a~o]WYTA7t7@EOAg[kH^Md=Tsːk|Mi|_Y״?C5ri?C5g+7g mӄ VwiBBh\ֹB4!%˸Жb!B[G`ڞMB[m݇PPhLC[Pˠ[4!!ծ[[ nVܭ ) F=~kBJp7H­ m,p ²~wfsOcACd Re<RH9-kO/D JRzhou|0&'A)RȽ}=(H t]Cba Հ*46. JDuFCڧ hۡ Bs)hF}CA pѾs)hb&NLH*N#H=QA,A>eD$綘 OL,03vH.OFqBb̒!+!ZLrBjz"%Ƅ+鱇L~Qd5(}nf"k x`\ԃWʺ|}n* 垑9ͨܠlU|kb@hɑJ ꩂ'>2AACBЖ )KYw"U*B㲛G7Z1)[6#ZƑX֌DstHL%'kTǖXghQ#Q#$pO2t3b%[%qL|jCVL.DbiB4Vimb&J4!tmBiVJ'PMm5TSV)QuhI"ϔ,ZQ3A̱l4%`$|n$HL{KLo&wښKNU7o HzwYF9o(?vRn#V 6Q6F@٨DK#msz'zxI(m@OH#Փ*m <_d7 &#FYK,#&hHgpC0EXrhrqߝ/^{b>ᐑ0HnlZ̚|o.}k.+ak"xpL@wțwF1kq-;eeqby><:&2d ﲦN$g<^y|՝ݭGKyB?xl鷷6"Tz4Іԁ|g_ssJ/uDiΡrxz]40ۼG6{ОbAǞg_ Lw.4l0ۍ=KCAKJF>z;\>zG򾝞a%5$CqPḤ;^Tٿ ȶ1KQ_3Ss2}݁Vx"xb}~HSQG||G4C<_:b cvjQż(2F+G=uQ27X񤿡ۃ_d> \tWlydjn,_gtvsbvD#D&OPems\B1\aUTRļVPKAXjv +٩Pu4XGz3`wd{eW󈤾kW|2ҞzEK~g퐞qc}r9Zs#8Y/z|aB~I&$ N,u, pA'g:ĖpA0o|44/ݙ81&(N5d]B51LvՎmHV"k>k0>1azCWw:zgndDF"QUX'@nƟ3ZoHj+ZmbI1}*Uj] _踗ARJ6=`k.Ƚ 4Τ Q="Zu#bO!E¸M:M?\KL>GɑqTFnYڽ*7@C>3 Ot#x !QxJBgHZDᩜbg)k4/E55NRLkB2sܷsH1C3g=/|d.{f]eʽxEZC)`R(=*r徊܃K(92"gʽil뎅*-swk&s# 3'ZgP##lqrQ# -e2ȼ'mCPLv!⌨gHa hŢV@*E!!JobZH EČ{~sw[¯_ 8:mW3D˕sA7;xqS]`Qȟ-0_j< P  uxLq`9㫂"`#2r`T7^Y.e=;&ݼN# ^{;&J{LR4a 9TH*wV.rB#CrgEN̡BBsfzB-)ԒB͞B\~qgBjSLH͠:X T 3!U"Dȉw&JL !ݐpgBDdZ\:=}"+ͧs(kYyfK0hԦ kS=c&!S gOyĮgD#a&gzޡ~D4KY|Ou)7Pn݂ Bh `%[ P/eS  @Od#q]y9CK5ثDv;bѮJ'/> JP $NQ[6Czfx|lw=DnFv~N'u2(%[VWBC3˝YΔMqԭ ΅5!Vٕ5!VY3Mf8if5!Vqo'ܚ/lTGK3GFaf&DgbsU;/@Hx̪,Qt!%ؑj9O=Dyu# jİA(ٻUpA7DN? up| E`_Y$Q/TL. ƨ`d{"C+0׬kB=DQwarϴv-SZN1-'9%}YYa1 ϭYJ1X);kЖbC[UN9i"s_K0s9鮢s:'> [h]$(YT ^4c蜌TI?LY4pJ5QVBO8UĥP#6zB7gtDsЧ-zοmxa'6@Z$1J: Wc=UlWlZGad_&JJf*9#ߓkD&o۳֩24]vW5vl'yiO}  hbԽB{(B{8;< HH4%=`ﭙmN؀*]ʝ]43sCɔ95sg,؀GRZN9?"Jwl;MQޒO`_cM8 VGf![ i ",˩΃sj 9gN $pS)QSIus&pHSI#xSǐsvi 0!`L ÁHa<8 &$ƃ2qUi~Ԑ4,<,<xRuo'W㌿$2\C:&"sNmo+ZHcN44aѯ[|.\ jr Z|}hHMa\LcSm[QmsQ Ȑv5CBZBx6'^ a&$mº$k!1!8 i&݊R<ߢScz̡1sQ4 Ш c梔[ШHU~@' P":W5& tC=$MIhM #'*"4rMJVi 8]PAUȁ-PiVJ TejTH.H4ɻU0,SVۂy;ECji/DG5i&?jR )TMr9:l7.Rj?۾FS~.CBŮ*rYB"](<w I1nLH 9Y 4!dnLH -H%ƄTְ2Z +; p,d+W;!7?[-sJ DG DFbnlk3 ω ɟ OU\U8 /"[C[5![@Pڠh?#r>a_~$,K_dJ$T]&[h7r|YȻ.(e/%JD(]yXY PrKR)R*EJAܤlrIG,;V  9GMZ ILԢ XZ>vx$-f ׶RJ,&J11gvGD[ U(&UOd˟=.ջ8ˬzSu#]u‰l HC[ }G%B|TVGQ\A,ĨFU3*:I ATʱD3,ƥIiD5"ikskF$IiDrh#s.Ä6$獞T'iyQun$60Ýoأmx.м 9:B#i 9'9'ȼOy>RTφZ43dv/bµM^OW?R5xm (Pm__Y*: x`:6"Zkh#*v!xtgfPGT_hjFaQ"lM\LB5ܰ{` e= uK'd$V ~z^gX|P4O0a^ [ JQ*R2$Y{/RA t 4[lֶ>䌷xɺWa]@YYys9 g]yAo_HUV1O.koџNs;XkspFϗ{PdlL6x'PE MV}̚DyDIq=2lI<Iybbρ91B]_elO6ޒA\Vd\Э\CWSjy.M1MR5VJXsiJ )YDc\""&$ =NF`5%0KGk_^/b' :WsjTBJ#%ۇ\xB +dyi{HĀ^fsc:pfK-H :g_ucFfj%lꡯP=N)5TM!;xZL6gnha=?Q6h@dHcu]<1fswV>R}.3nB1BUfAR|O;+kش*k*h973FUK3lP;K7Rb8Ev^@vWqwu?@ww y ֗;'hdIL9Ad}t4Ny~4%'2|*UvC2eL9vvm޾A5S2L1UMV1^F-%&mcθɤuG˺.m(a7kL(_̅rrOO Ӹbǿ̛BNג,̒<&NRlIdDfIdm٦Y%y\"3o>[S5yDI4MCNXcʜ4d7^ !; 1Y Kwy}-⮊sy*nndPeuN=EtcIwyzex/sGJcOU^IJѻYlY!v@'%#ko݊u#e }oiRp[s{!*.xO w FU$".:`k|r>=R|_aJyG@t1*xc zh]~cLԧ"BۢCnҎ-xh+f^ Kr-vFE*O Պ^E2!dS >փ4"Zf岠W ?4;Y_z%ٻ%uasC1ll~t.Vd( Wů!MKbptZaCdfѦbStѢ8ZGLqw}Ѣ8ZGAtEjnfAt [o!΄Dzњis^Q\~yvdю,ڑGjGQVr)+y8⼾4Kq^)+yU'tdY~ytθs#)2V\e~{ɦZ(83-C{$&ƭQ΁լZ}g\&z̍3;w:C:Q~хWm9.(DA! q( gaBL Bh[,poDq!%p*yjH!,{m U@6`LrK^w22/ݘA8wY n1 7&$bOAXJ R12!†)wf p_j]_j2 BPHS4e h v9mz +O? endstream endobj 21 0 obj 9430 endobj 23 0 obj << /Type /Page /Parent 5 0 R /Resources 24 0 R /Contents 22 0 R /MediaBox [ 0 0 595 842 ] >> endobj 24 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F3.0 7 0 R /F5.0 25 0 R /F1.0 10 0 R /F6.0 26 0 R /F2.0 8 0 R >> >> endobj 28 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream xŝ˒ɕ]Ɍ~ݨU&3IbML^lf(@"~IBӆJ~+oƮBW)uΫ׫nW{z}һwzzmW.}^Y*_]݆f${/NHKlc˿]'6LJǃ'>i}@>HneT:.tgļ-7KE鍚>൜2?Fa|SN w'w~R}r@Q]5i?-<9d8#|澞+Tc]Eۍ|z{S㺾U`s]/0鵊X'QfczI s+6*~Q 7B\2BrpwrnR,ܷMm]('\ɴfxk>" phM7Ri,T,hG5nTѓބx1 5T R`-l=S+YD?f|}G7:sL`3]Iô6=_<}ytbVg_>nj7{2cGWR;y-Eu湿d3_UT9MzOxoX @"tjM2c w1e*-6y5tBT7^Wzw>w[Tz~>`We."k)J;M3[{P58qL /Tp[fE9Ҩ6NNkjtX~L Imj+$yRgWȯ!SWWH>wrm?؋燚9eJ*:թzLA)O6Џ7g$\{2Ҋ㾏i8#YqDh@ =Hv+@-Nw BI_W:7U0Qj(csvTJ$@L= ^jzl[{DS ?&V`uFՐ3x&f~zsE]stp7v8>_gW^hr4aXFV u'=8TZL=}Ö{{;{$n)#H42#8*hX@q1_=58%SK`#BYo9؎5똗J>hXӣb@a]ԝNDy-N,%v\->/Il&hTDBN]E4a/< )* 7(M O Ǹ"[uu-6jw xo,!`&dڌt~벘gQvVn{xzI+2@gHQ{bZۄ3t#{o'w*u%/zX֛1R4ܯ~5Ay(0MaEi`(m(U!@ F}Wvb%ߋ*ji~ oSp vw_-}]o> r\U/xs"op5S X{"SLUxHVP&d|؜pX9a*+]>ýv1OVqoB5JtyDāZ|?FBv7hsI~y.~.7ۯ\}Y}|k 7;'֣[\;oq_x'*Dw DBȒ?_픰/ lZݭw~p$z87.x-0(+(*~MAp~+_ ˕?-FҨ ubGt&zYD bS'J|i55D8A"Q5 Ri!stq/9\u^f&q Q} H*$ `-á[AC#;ZJ bO"(oVD25ۏ#3?8qشz7dfn-NƻPzI}0Xċ0q϶n5FCXWЍ-P*L,d#LHoVTVAMDM?lv25z9M4BQ?h!M/>-һjt!iTi۽ԍ!lRbw_BgN4nmA$Yzssu/$ EO< ͹㢆B,_ )[ J[$Ρ-wb|Ǒ,]7L}/syu[bǵ=$^!^&À?4x4mF) GZ_4^կlFE@̞MT4,tE.w{ n+ =_ OTܯN@N~ TG5)aFgtU;(sL~m8:Y3'9i~*R<ՑzO.3J BRpmN= ɣxE@J> kG x3JEPU{ߤ oshE&7& gk/l #Z$ڒ!F5 Y/UJs,7P:'7MÒ^$A8faa(֖p u@Ŷؐ)}-{tc[,1svد][_Ӄ%,y)5mDzEb6Ƴ`ILՏqf?ӑcfvgm-J&4$cH%1~*>h6PN1MVl#x:8U Ln/jd$9k,$@CShU$HMeVƂ7?Zj_dрh-q=*@6s2 ?6i.(+qJ 'K/fPߋjms ➿ѮT@|E03eL dyr4ӔjKB`+W0hE[ "q0U̳70.vX%[j!D"+kh,>k#A{b@\4$Y&M&!`Ԑ ڣ;QX QFh> ڇؐqEr%OڤoP,?׊E;J"{:*jNT&X\ujD8:uώ{@P5hv n{5.%rpls嗿)VPO ?P?R+H1,U)[5mzQ1F鼦.!z}κX]T_]=ǽܜ e&21w^ F<3TūSZc 8(1l7[\MfULBcnjS<; a0{o2:&}lkъ3ǻ'M+IdOn!L60i|0RhpBm9k/`MjAcw~"ey|zKRQ2w +#iAī-= XCIFCf>̧ l YD f1IRP{9h 8 2uo5TX LZ,G֢mPd3w2 t,/YL;.Z\20"a VђeEV؋JI.2CBoc>!p5-y o6rۯ`:" )s1SE27&T9ȣH!\P MG{b9~EP`6z U~OY.ř\)`щRQarty;hdh3`XIz9+Y9k6~Qq5W#ʽ.Ov,gɕؚ${ƛB$CTd8@(_k#6-FlBGͨDeصTz&CGXE$~rzUGnP& 3 Lw[z/M:}Weq]3yyp|ID"$yHr88%(p}$rQ@|V"U:&@W02sFjl$F'cx@vtXe^2XFtBq#⸄%/Оo+F'+@ }/sH4[G~fZo<-25!CWM%nB2,9LP@r,moqGheWKP*65Bp-YŅJ'ԎQ 'qp,gPBn4A)hJ>2zoK%t|]yQ遑9Ζ ) f0HhW.uWH)lmp돢rbi2rHӱ(4l./ı NYIFN(RQLf_EN<)$+2M(+F hSy!W*Mx΅*35ߖқsf)l 嚯 $>if ͋ڜM8菛9 Z"hXلGNS&KYSE㷊% Dū`8Lao (. z#,9,fT7+cK]XKDan&?`<ѡfF3P2,^u8,3N@SߒZWڢ0"%"3!'nz"ziԂ>+2saRNDSX&,~N`6z3&SKv@<$= `2%0"J^ޜ9 @EXccxB&esōODDɡc]L&t9(DGjTfKge=|Jwm_s=syih@ Tۑ1: j!I!rh܄ҁ!!\9;͘f,dFd-35yHOdTv>?!GO.rAiF30#)y(٬ϗO;'߂/`n˫` zd-؂Gj`)X#|uho<+ &Q~mFñZQT}λi٭s`a$gD-[G~3 i iaQ9I7V-`,5cPǴ6H鳨}Aa_ʼnNg$2ͬMs~ os"}:t=OfW:3j siJ1PEpʽ 2Q״^j/.g^m MmgH z<Gףbqt= r"n/kRvQ|D+2ĝT$VXPZ_*.V-_^G({jn|e>ΠeodXREw^~CPEHvǒEJRw)A#KY%21r H/O|(hr4 Xn)W![[̬s|KL:gϗ@ `IH[Oɹ }$}_r$v(V7"I3 O2J?yTY\Nj^鮷x0ں-yW$:n:4s8181l}{HM e冇 ڒpAh˰24KELȨ+ڷAΩ ؽ.yMI},DJ@0 d PΈҮb 1pâ`tRKPIå9?n$]C>_t t>Cn]XoJ{nunZe1NwV# m0$1DY6b#1|u<96v+,Ext3%$_O,S(ؙ3(w #EBB|#7>M7+~gv#ZcM2" 0$LZ-q) SOnu>RTUb1='ᦺIN:S ț i&2g2XYCH{ݠH{.WkT6jFS^z7>!oAv[\8ZLgu!hɗ]Qub>WL qeI[/bvڹhB <IIVMjqKݡƇj$~ bl<(VPޣ`mIE &cٶ d48͏[4ҏ@Tٸ2:nۿv`K^>)K0(&=zF6Bɑ:myjdXANYASVM0jdrʌ=0$WGpw7L3*ИRL,̖_P_d)5֦b ;kNId!G^PF#c3DRNcő%Zmx4 PzθuR&Ɓ2 xœbPw2 gtiKܒ#CFG2z½Dy)!FZر7Id0 !QF fՋ`m5H_A& VGܡD䰘])SHp'3S7eqa#Y[ [<%~ xD0 1o#|iR_$ꍦ둈1f0m6#&X, |'| e얖=Y™5:ٞݮ@bpC6; _0H O)\$)X63m&qڐY1sՁ-RLs.'+Y*hsg}#}DokD\>Z%0j 85a΢ q+] J51OG? < m lm |4bV}CȳbHm>f8WloE :FXt7&nC@旡`k"a]QTjY >@f({i}.[9%qG:e+R[,GZOʔyxd'&9M 3oeQIeZѐPN~  f#4-ׂ(V@A1O:tw.0]G e]'.缹/u"7aXJ6)4p=b)qSCks|8j‹Qƒ^[JH +4TDi̲&]h% h%Kqkw$墪6Do 3MTt?V>&m"Jt܌>  FøX5SQsk:ID@UB@M|yw/:FC#X<10ˀwW\_fP3pDNsQuO є)*-$cTaʶʭfR4}o[dK _dK smZz)վ2dBp|*w-"2/g ,zckL!Z)WCXsQє k4@}֘bn=/Qjc;H W*cM. U"> 9RL]r)Mh+3bCljkU6Iy1&LGnxƝhW,(Wښ G<w3B8f5 O5e UcitFxoG8Ạ7רOzdqp$DB/~-`=L!fPڳkq ) [[RnOplsTǙ5u[3^/$_/J2 )e;*<H 6f' T(XZ׵@eE6(| +$Z:"1LE+!sY%K[Ð3|6t=>;Z#LcKmӔ#.% *.u q?hzRRDf-±6H CjLCm{*,Nmk/@Z>;4-a7 γ<1 [rLe(`@w>Ebwo$,43mu݃0gYv\ 2;0/v<|/L?h+C%F怠X=? ~MN{/Y+dW $] DBA(NSo$=džT8V,C&k }3և<֑~搈q x'p#}+(3d!=zb"d8W%m@[0p#շb1ڱ!D~PD:b=̓۞AH ( 3YZDsX'x7(l4kL‰=QmB|zU'lS5AL"9SO't ;ȧ-,:bIEnyiĞN$}0 Q-R$4jw8Te2yyt 4D;ՓR@hNMƆLuht 41B} 얷}+%+"*a -i]u([}*;ihk9JFgatĦ c4rXTu9IeJB1PԤ!6s>ay*?c6ҵPHfM7i*گrǠހoay4z Sё _ 051-Z S# 1Ieqka)Xê P0>6&rC.ilɗ.TڥHRRce9 P3#_FYvXR* Jekҭ.ٗ,ۿZ^=h=>F~;YXݟ?JZe D&wfWFB<U {q!+l, Y-rPP~wYTx\: iu3޸+)e K/DU[ [:٪z xWt/\ E{:byz`7Sg/ț0vn0w5A?~0&QU5TIyRȱrQi(BL`;&V9FD$-n|T-'8i)j4ؒtrBAgL}ɀԚ4j/' zCr\`ݫ:їG#Df"w̿﵊>y`0e.d|Hk&q]y=Q s4wlhVIYF#8=^oTcC0@$ Clѧ>va9+8%>AD6V|OtBGD?h3'2EǓ<FF8V'/ yIbqvE/=at) YWӘ,};Ŵ?{Gۉ:z;t],J0ƿ^sǭOkjx{$"DvS(FM8b:|Z&t5C,#_EhTnחd=}^7 C e )x2Jo)fb╡B]o&^6}_ޜ ? B![CFΫ0u>Rc3B11 ?%(kC!!y﹨l,Ѭe"z U+[GΖO((`$#W.a"Q2C5ң[zb;V_t@VDrC%A֨o1sB!H\j$QA!{r ;pɅ3E꨹"HH`DX)|6i2E0jN5a5Y/낹-hX|c91]7!w0[κNT``rr{fUΐ4Ro0Ģ8Iٰ[3 C,Q˖lqM-"Q#B@StHa0ȥ:ԩMvራw7,zB".6~:8vX\-HqXҫR4p#y{6[k"m"D>Q.  :K0 a5ȨEӬ {HTγmSyOz ](iTR0dDj~2:Ke"tԪϭߤZT]>lE.z(̈́P?dXe TpW M%FYÛ|$(ƣk/e\ny63džH$(99ԢnjR: PrD> endobj 30 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F7.0 31 0 R /F3.0 7 0 R /F1.0 10 0 R /F9.0 32 0 R /F4.0 9 0 R /F8.0 33 0 R >> >> endobj 35 0 obj << /Length 34 0 R /Filter /FlateDecode >> stream xŝKsǑ)zoR=7[^m谱]Ѕ &J(~Uݕz-HFLUWeu`!)qHnrn ? wߚvo/_E=ybxq5| /.oov̾'Ϯ7&~Wo|Y̞gf3gڋϬy敻`nv·s{f_gߪ#>%=FM.KMu 1:Sxsܑm7|@}ryߏp؍H} +6n7c7IFWHhX Vwq]v\M?:|Gfܷ5+umD}8}nGy H,oI+~$ux>}'W%nq~K|RR 1ZJ yw7bh+ߺMoqH`OS +z5z:ήad0^'n;㧯ǭ1~ӫ3x)ot^3O>b:ݠ8gwzh]F?ױxwھXE?b솵.vTzs6PFj~.NOLOFbӌ1U}%Ifبq2s2RëGUšYsԥ+;.V.8f{zfkdČ#OC8Jz0T2S#\B?OfސG +( 4Vf$$Z:X-~1zX)o*]H6$fTU;ݽyޚS4ŚY3q1jmT\ļ`E=K(v MoE]",}u,9er_XKh`8,pUʒfV{8|-Z=O #u.an1ѐ6. 1mmNGMv#NYlՕQͭpN}:my! ;nD݆=^ ,sGy?,Xu vYΥ. |'<Ub{5eSgn0v6IL[)Roʔ'iyS%^IͨtA}ۋLuV{Y~69ɽ5V;| Au^oB\sg0Tt9~{Wҁpm'f SMi7Gೈ-SWt W 5kfR\)FBN0ޢj TC+w]&<cTLBS̨Cd SRA^KU>P2І7F;'a4.!Bq1-p (b{N ᒅeGf(#:-3-ʆ%Lƀaܑ 9ښ%r W/ ue܍2heHd#<$)j7~ ƍQpм[:jd!>('?:PP@o@#[mg)TAfyu >UFDjh$2|=Yӕbx~84jqA9 9E`n,vG6I:q#Qlr/FJggP3Ǖ c8n柉в'9:?+ .ZO-iqo=Ec >VN .>5-uxj!F_/`%8cqF fb0ހ2<چx?''22!E*=4]H9 F ^Cdĩ>kq|L[b6 攫0́aIoS,?Cʫu3A0փK~5 ]܁$VT&Щ izq]/nEJcq(Yb;7Qltzr&h]\?s-;ڲrazԊ TsvI/d\i{KI%"oPD,@(ipc7 Yѕ4Ì Sŕ @l>\ \ѻ!Toyka(.G~/(u=QMzL#?pgyǛ1fRon.rLήgStLJ>SuWDgI6ʽVŗgؖ}ZM5<*AH&Qa*ALԘC#TJ=̊,DS!zhi iq,Z ^@2~ vby"@G` *keWu|$Pקgu]|GSIf>i$~vXrͦ v⠶=_zig 97zf(38\t˪p~B63lJ^#C_sqJ%?(=bi EБ$PN9p[1\!' ;:"J,~-4G!k k2e&UN B}m@Xz>_PvZ2/ jJoςyz {!`גM ʆ֒'Poe>yltgKZi^Lۛ)Go\.ːN2=,yH: }& .;o'Z jNIoCptQ^!GK gɀ )h+gR- RQQGbQR#.U\M4b3000(!^%.40De5ZbZ' zb$/5y|!rk"K(TF;-j,ݞMƀN`"Cs9g9 y?K۲7w OhugvM-$UT*P-dCR&Grc u]`ד qD lQTL6a)a`דAk5@P õYP c_8x t9.ZKT|d'xA$|a=ezj&u *v`_)Cj (%\dh`u39E}*VTWj@/k`.p3"g=SnSXNW?A$:iDBBO Em?B5*oKTEjC#jVZ$IwE'҄"6Ht#OMu(d6!l+Fv6 !Q0b2nEʌGz".X>3v+锗ZR8U;r>2rQ0t !ɕȕ{u 5/VKP"B67@8V߿eNUJ0QdžV6qeZWtPbKVtP:x Y?K٪@8[ve%"$λ}In䄰Hw4,3Ks}GFDte9Hy1Q+"BϽWDuFl9 *BӎX[%׹eF%B?8]{C#']9NIAc݆rS׈gngn'R ROnTB]4]%uQf  ZKɾ<;6!xfWߎV lbf-X;IESl JL[={ -2+H&{jte"E@>麀D!%} !Q* 8S1$S&g*;4e0%@Ru\%>Jhc :sho%~TR'J-M'>^L |0j59؝505;ePqSρ weU5|G@%Q6allpZʚHO&{qwn'Ϫkpsؒ^25ũǷ[筆OͭKxQTr\˭gp9 Z@zK ~"2F|(RF H*0X)O;l YEx~D/SXT=!)@n@ v#!PczKS8xn[s#2ȩgQp=K%_Ba̠B{5Z,U-jUZPYL[0\07qR#Gw7q-R[*o6fBHxЄ?f#j?7dOA6Ō:eX?&ۿGp3c$Viė1$Me(FQ"RIC!w2Y@9Q+ }h&2yBc$r\KT6yr-*S=. zD(S(LF_V{\xl^(c,l UW#t5vn=CEr87US*V,Hr^u1!k}YAdn}1nߤvj|u).ez)y*fGCߒ]98*Q~ګJT2CS~kN*ߕy/]{ iaht1BW\֔i0 δ!b긁>ׇx*26VѢi}f&_:2nmKޯud{hF0"%M )H'ӡɇm* endstream endobj 34 0 obj 5511 endobj 36 0 obj << /Type /Page /Parent 5 0 R /Resources 37 0 R /Contents 35 0 R /MediaBox [ 0 0 595 842 ] >> endobj 37 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F7.0 31 0 R /F3.0 7 0 R /F10.0 38 0 R /F1.0 10 0 R /F4.0 9 0 R >> /XObject << /Im2 39 0 R /Im3 40 0 R /Fm2 41 0 R >> >> endobj 41 0 obj << /Length 42 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1084 214 ] /Resources 43 0 R /Filter /FlateDecode >> stream x+TT(T0BC #CTp<(X$e s=sM\ ` ̠ LQL05ʛs@ @Pt! endstream endobj 42 0 obj 87 endobj 43 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im7 44 0 R /Im4 45 0 R /Im5 46 0 R /Im6 47 0 R >> >> endobj 39 0 obj << /Length 48 0 R /Type /XObject /Subtype /Image /Width 118 /Height 179 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x]ƖoN&83#$'Il06\$KOlV HHH؀MEC{ߦSũs>Uu8$+$)\%,^ɲ{&z3$ ڣu\4Ii8*w\h#řS.!)o:>mDİ{uUOw{bxaXn/c#=)5ѦܠNnCy/6b*p0BGW6 iEin i}&? \'H om&1Nv**qRՌMˑ`n{x1 ejkmMi[{O_a [fZ}/r6pã/.Be?,- ;y붷b*O FϳUfaO0ZWd8sW5=38nyqIͨ-Z)l0J Z }ߊ /Џ0Qk XazG9}1@ٖ[e2ul0eު.ΰr oyF}GeY9OfϹt6vM~c coڎ TIچ6#[3NID=JsQ` IvʭF׎%.*ObBje{~T* ]YKNϧoz7ߎΣ8u,s ÒqzFlGj:Q2eմmS;U`xŅQ 1?IjN>/LA!Ābc>ȆWoSԷ0\/P$o֖7NV/S& OT,'}<^]V723q%1݋ {2Tڜk'"4ȋ9{Li%,権<ϋiF-ʜPP䘎x_bo0Ǐ@H00 ק'0|ux?} k3N>=|~|G<ό?>x\߽p^ oO_>|>=bO~z"|D}|? K{[<0<0 o^[sؑ9䧟aˏS/ϯOK%>ѡᗯ_=N0xkdQgA90 ÷a~x=|q]z$Mob߀ =u}ܶ ܠh\{N^f/Kfp$i!z^G,0JIĖo9Z Ԗ$;Ң~Mǽ@ޟʻ`d"yf;Pv95WLDDG9%}yh1ضeՎUm陪]VSňH-t"87_?CQ OW;iе٢7-KƝqS0k:~}9JjvH ʺ -2Ąg6E-uY5S1L59&'O&n+OUuۦ9՗~%}٠"gݷ"-M늌ӵnh'y:JF)y[(=M驩UOŘ.f;ܝ&\EV^qhb|S$V׭:!!4^׶vJw:*{wd ِff&+{ @Z}%F&>^}ȒGZؑNj۶ )[ne8鶥J}Ue°Nγ#˛!GjVɎ]"0* & JX#pN`NFd8ro GKqMNbլ}s~)-q雥)y)9uWv53df²;ׇ^Ig=ErH6z̲Tߦ(v>SOg.aQJ|olg86Tڒx%3! g*da3/zX4:j KNEMyMjd nmO|Iak KY7Iדk0f/nl0NlMK)J߾aQ/mQ9Eh?Hhe+ďKte8eGF!<5L.kdLP~7וӞvӆu,+.x4_(\4VoI[;uF% MW> DTMiJv7P], c!=aұS|^0=UhD 0>"q*U_zIZu K;piHU{gT WD3tw ڸKHÝI]&]3 P?**lsOy3x.hG.j&6K9 =(aÝZ Dl2t6"6W:i:-Ac8gL\uKmGjGg+I(t%ᮙtS^%QMЦGWNz/zLe$$6u rQsqDn. WPR+K0OD O xM d7'KF6jaP}&08/~婳a5f &>rd2: @'ݼaQO~F+Rd q<ٕKd:.:=+ʌ`qH {°pv!kt V#RL?!˲[jϊ2#Z%PfI-&(+rTsZBz+e8K̐*xFR3؇3ݾ2LwaVW?-z~:&eT2`s@CV\r3e\"_elcC)UݾKTYhA 'C0wJPrI PnCEI3B/)&gi`|v^¯~{Gwͣhי\+>D]Vϰxc*,ZRi^OF]K^ϊ^OG/ALRX{:[zʰ`>-ZEj6ҏCeYݔf*uA~'4Ph|8x݇/&v_:]u؊%:)K/SyGkyYxlW}hm};9]YN_I݇@7~: _e} )\e} -7>&b/oi +6^Qn7%Δ\?_X^&< endstream endobj 48 0 obj 4516 endobj 47 0 obj << /Length 49 0 R /Type /XObject /Subtype /Image /Width 1084 /Height 54 /ColorSpace 50 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xO[gqfob/VZjf/Juwg5U4 ٦v I)IFuBdHJP N G&.'Y9c[l;Hx9/bϑYFo8sN#|#3:::<<|hȟ^ϯ~~{$wCx___-** r]E<ʞI?M̿)}`ss%ߵ.7W~Ky)=/(SSZsɣ2̵Pt9+^b1+nY@nW}(nԎ]^\}V? YoeY7 JĔ'؆2OV}b -uYf'ի;~{8 'b)5t=Ih!<^b[杈D yӖZm,{7FɌY@Κ%so}PMϽyK!FeF4 (f~KeoΊ?=bo؏2[)HɆ*ov9hY%7kͲMWYO<:r,=jxL(Xxǥ{p, ⚑q4 (f#}66zac"32MBFJ\^VbʴE}kʗQkgT64KU,!1jj{P5&na`EV^RVRdlx[[lH|زUP2帿6cL2d]=?ŭڱKvu+gA Km95Igu4 Oǫ/_Ww/p@NvSj4 |6KegaD i'f.*r2"w ͒gjVܻ?Zk$=YYzfސ7Lߦ+,b&so @^{t@kەݞ'W?*]+*f97w&+:dqz~wȀ]t˙4 |6Kw}<4#Ζai=阡YYzTD۸8Vw2*8[@>GmO % }qR\3ҳ nffSׂ5d8F]}1>֭s6 @g-+c=3ϲ!*ģI4 Rٽ, %;Z{-~7tcyn O57i!}{ݞK  Ry6Q?n~9~Eפ}N,,]Q:] ^LUK̈-BgXbuP;vI{ݮr%]X,(ai-&ilxk=ȉnJMff5h!_bWTePNF_YY2,A_{GVCbY4 |6QϬ۔{CRd AktϞhMcz@b2ۓ_kC坒,u%`X7N.ܐy9sffζ'Zc2wb5,m'34 6K꼒h7j.YFtCgTm3DS`4NkFzĭ,,U}Z Ǩ=~A՘8&ӧºuΆw̵teLgY}T9$Wx4阦YY*ך%cGk|ϹO3ܒλu ^ E endstream endobj 49 0 obj 3105 endobj 44 0 obj << /Length 51 0 R /Type /XObject /Subtype /Image /Width 1084 /Height 52 /ColorSpace 50 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xOSs7G&d-[ɜD#l#`Bl5"״Eh{9Ba߿s!Wt$_Ux=Ҙszbg>l`툍v ^^)g ک~ R0J|s 5-8Qc\I룲!lzVvǯlxJT@@*ulgt[J2nO/*Y Rx=:zkdN)=D@JEYϢKۄw'X!O^R>fT6Q3K8+&2^-?P {fM-9?O$h"sѰOӃ,M*]W8mgx\+Bf6In)0&+No.=n?\}p^-Gu4H\ ݂vF;NgՏ16u yr,5rv؟0 CH/[yz!/Uo5%};,g}*wj#^yBYF,9% ,s׹Y>SdxEhAAcN*7ۚjB;1[Yhy7O-2 5 d}f&(RSbGYƆG4Ne#2f"n'X1'j{إc.\ 9;mp*מXʓskMԃKrr G>n(6}ij"fO*>P5phLMM[P)PjP:qKm#[ iZ+n޿s=r4#VHm.pF Y|%pμ~Ľ SUD}ww斚EY(-QN0 r2'K'jf׆<} &s u?۷;[߸&{iNfY&;3i4X=ґ IW@}LCrä{a7Ka#kr =Bi[dqloxN$C RS xh=Y3(bKNZoXl[27Ui7-z:Wc.<9]3X#F\㰲K7[%/|#BԳ=/iw9 ͕>*,%fc:~aF&7~q:IJzo8=ر,%wz.*p.R/??,8dHPF?>r:r3|-\|%Yvb|NzIx,f)<ϞuV =eGgM}TY ͢gwmNC\],'g)B@*% vB{m/^u(=B@JY7 g#MloOݑkoJ@bL3ev:sL~̏,f)?TWU?_xR2f6K3Ww3R-%VC=&O,f9E̞5U1}Ed j,f9v5Dk?_>KyVXafixSWֳ+줲{T=L6,O,f)l%brEt=_V5Lǰ1Yj`u}6J觺\.hHa6&P#Ev6M2< U,fg+zxm;_s+c}T6@U#Y RT;Us=m8pSӟhԒ3A"&;' $>="r:r3|-\|%Yvb|NzIx,zr* QNs{4/jbt$SdxE|#f򍽒WL,7L)WB%P lf9j{fr g}Ä]^˃_Eʾa,EiGTYƆ4٩A"d4+; Es5O(tE1tAcVOoP2psf J_r퉥<ɪ{Ճ6-y&Ϯ,M*]W8mgx\+S> SSSzG Z;{I Yrd_ nU6NZ+n޿ԢVҰGNƐ$VHm.pF~~m4^X{' )폪yˈLVk1{9d2V5 %]>a%bL3ev:sL~̏,:Erߝ-o\rý4\rL*Ǜ}/f2DS9J Y 'r+~gs!O9vH':TYԿfHT͸6ĕfY~d̈6 -e,I&/lf)?TWU?_xR2f`ضmE׿Łs9Ru j+-0CSe)@fNѨr):E 9r{޺$'w~w0H2f-,\HM_wZXQ|T>EN)Uf͢,+׌tռY&oIwYgsJ—0r2'K'jf׆<} &s u^7 z~۳4l,5ņ+s*ZfycnX9uYʬ3{y̅K'f:8d/ +{9>}^%=k޿_s̑g[Y5+,. ;U'4 lF٘8=yqv&>%gX|v')鑿Pc@h&Y"&WDSʾaUt~ {|X=#=cSC$`k4[S]1&SI?T)lF{Ҷ.F`IT ?R,lEmKZ`uBs%yjt>4 YY}gX粭n*RcsӍܹ endstream endobj 51 0 obj 4215 endobj 45 0 obj << /Length 52 0 R /Type /XObject /Subtype /Image /Width 1084 /Height 54 /ColorSpace 50 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xO];s W.$ qݐ.JL@j,@ MƑE|uB`(?{|33 p:﹮\]kPyf4 h@f,ye[wh6/YNO#Oo续0YUHs\of 9)Ss@_hͯ9ˢ<Yo`,BA9ö}|]ܡSt_xXd?[q_P4Kq>*^~m7#%,k(QBz-+zfn# W`$Lrk 4ú],hr@9 -TۥKq ?iN63)4. Ƹ*;Ԙ[* gα{^1+^/KgJgeT. qy/o?~J_,|l.Nï[KZl y%*DU ),_ZB_~o?Tpvެ KWM JNEGEFa/; 1@3qKuU VJv ٝb[4|aWBq͒ [ϵV̠Yf?y5=5fgm95폁%vWVu0mqNYN=ר8sYoZiS H(+YY0 5^i{G_6l;]g9sZnB9{nA,},pzKq8dg$gزJB.̶cFLg(LUwTl3LS E5d2]XYfɳ\.|n?G6|YGJ[Ǫj0M΍B!4ya}4U_HߗJ$}Jx9Q\!6LWnI,^EDi{QvZ$C,=iQa߆Oc3(KPY8iD=Bj~@y'oqK|{4qg=d(znł⒱~yI]%ƃ5(<3srvC}%\ޣhIT^伎5hfOHS+^7$]O|9ߎ|\][g 3a~h\D[\49u00\"0㛛J4w1L;zYg4o 5ZIjtY!qarTu^c7#>1,<,4{gv5 #4!f6_Lu]<6|k c<46Yy,05-k/l*6dS&`o4!iZ%'>+9oL[А,,BT {n a1w%tnGit$^ /ςo M䟶?XљvI'*58[WΣ= ƃI5wt%y7w&ѾU!cx*G=/ Cٝ64 L='FCƛw5Lx{,)wz.~B%)4ݗ:+P ~D{y€ZlYHf;͆$̠oy&,)3҃g8 ͈CiNfyegm_0k 6='_(hKEԋ9D Q(5,̆<5)Z`Vn<<0$Ūm%D56r)t'r ׾s}ÒSF<7%2,OFR$-Ϧ x'_8ge'cV籘\i> $墑\YV-awb2U]p7`?774,"`V)hdh*.mjwƌDѫ&Fw͂~~dMϞIibqkE8o^i,øz, rz.E]-6 k2yf(k'dt?ږ4ˀB%!p*2KS ,C,ԡ,r:"2Nre!Hxf~}}RrTC&~0\(3:~pOFf}Wbj w`|X7Dѫ&l#ufR+񊫻BTurg 4A \&*46=iڹ4ez* ><"{q>5@ӧ7R%dXh,QW3B|?d,)\Lkδ'~Y\hJ\tX*(zfCGUb"?D - KˍeRJ!J4˽,xO4:%b/x:b+t҂]âĤlnu%M4aӄ5_/<ϳe?f{ ٵ0'2yVLÔ[-Ěɓ MͮHj k WMUht<*rr*R_BPlixvkH`2NLO|B,zu h,^_'~=<͒b0mƽj}Ծ}D ,[RqlJƜB{8d_v xE|?BDՐARu+b(H ~bJ*:;tFGX*Yf2q5fhkE ]o6yhVHAiT[AZ6e$%/$U$?zH|$_"Epfeva?[:f9s_{R|P:f[,U'7L{*L_i*C"urY5_ in-ҹا(lCC>6Yl^M(4пrF+坞f,$sdU=#,&1f Ve߄:nJ8\Y,U{wfwBaĦVwu9yI {, !E&4fhh1%^9!TqiqﵳZz2F}umt5K6:oK-L>evdF)WlqQV h_2lgs-oI'Ll!or}Ê1 }:LStȧP*G?̈9)oV Ef,$Ve8}($3Gvg>HA)[wF68hlLI{4ҞhbVk<$&8I=Î'K\n->10,s4h?Q DM+(9"ۑ g2ͮN9}L첊dGgt-ߘiX1k'^5!N%uzw)4WGL4,,OgsEe~"o7$͜چ4/^QLr*Qu'GL^TFo\w!QY+k>W%yǕ^;7lA$[WY$Wھ7/v8n1i7qqO˺[K|NS sXeY!FWܻ؆,;٘RʼnA5_frq7saq[O$"_c <4͂R,~Y,=tFҸzɕ LT|,V,z[i)™,U2J't>]錙YE4y&=kn>'RcU}Y\06-;'SeT?'o"̷8e5@N\ |ᨷt0]2^,lR=Y4zdUm.Mڥp2Yzᅬ_|sfvUDamϷއc;t{4+kw_[O,KHf*k&W^^uu {G7@+Q i½pvi޹hh ,d(pljA4pHAɒj2 RE4LYtaTw%`:% zډ~&Lh _lf/%R{\;~"􇹑7C;œtװxBuԨ;YIGfit0` 6#9~CHY\e>~,O5 A\x|GbbWt߮N5Ͳ5 ;̦Bs8:%gy65'X|>%c܆T5\x,A\Ge If1)rT~=|gfYFgV|BHaoBsk,ui} }21+eϥvwU|jդD9 $zRmҬdDɈň4b@fnGHQZ % SR 66lYE6$zVIkd 0iHj I9`_s594Exz'fBuBw{rcDHT{>Z,(O_K@ʇ1:΢rIF,ClֆgsvA;fQ! Ǻ5ܼ_yPgiy\ZkratzPr$薓J2W.?FV_|ICY_[ޯIY[R4 pӚ?痂Krl\n-BƄ#kHP^H%6w-=kqnNΧs},! ~fv}hjH0Y,|`2穗)57;{)ІϘ("r&UvYE? (P>N18`L,f! m<\Mb!/J4Sd>imj* IJ$D)4;fPoV6sHzxtVs&-P] $63+1#f`.lhPB3Qr|Wg7Yt 4o5䳍^[j) endstream endobj 52 0 obj 8461 endobj 46 0 obj << /Length 53 0 R /Type /XObject /Subtype /Image /Width 1084 /Height 54 /ColorSpace 50 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xO[ǽ,F,lgd(-]tGQH%@:J@4&0iL\)llL0 zٮ]6a9|>>;_JH~7 pfomvODøAcLl*<VvW.!"aڢ+P&9K>cTa^'YHiU)nS6y勵cT,Zz~e e򾳱'rGټiѸi6NSchkopp䨣d۴ɂTw:K%I{R~۞( Edޜǻ7_7pT:Vl?"/jid>?5pki[z*\,5ݣ@Yv5 d),g־*ꕬ3|3`zQEyIUO/Iv#WJ[٣2=I?RD24K79'b/l_ ~^ E^C{) pNhEJsŴ'Dac[FwlqYjG*o%!Tii%t蕌,z5v/ݐ Xܰn>Xy8yw La^ܞyG}/GvC>#a1yZqaoeWm%lܲdhj\^(gZq>WUk=s!'6p~7n;}ruH<{VI`Im-{DΒ<2Ӻ\2l*ETg_e| UA,mZ~5m}Wcje8UxsX$4I5~lҿ:#4=},bl"rK"1b g8gfb<_{\<'>E1/2gQag)Uxd$cmB\I W&MpY@*Eq[zIgY/᥶Nʪ/ga-SQ4Ц/^޼9WY[*#%qq[g9`)SYrps;K)O6e( g.Knm ʹj8;jܚ)8 wdC[>k5GJv 8N'nRt{W0z|V~PFk{w’O^NL~F~j ,\v4ْe?iRaqr7+yؑab6m90,eٴv-m"@[<-s3J9ܒd楉2+mE(4W-ROPm_t=3[|x{M~J)3=w˄Fǵoѳ69])_W MށT`;mk;1Տ\FvKYԝUҲ8z(a?I,MϐSVԹ_ ~$ StOe췺^=}*z`Q|7:=Qrk]ܻ <Etp[w_mBKo{Fu3k_D#ii=|8~qY gI:,[ɦ^76Ifw_鷯wf]% 2ï8ieK4?߬N%RonuH)p+E2"Rnι}K}43Jء/:2TQB.mmL:2U(ɕI/~$먢cǨJ\Q!/fXQf]XYhM'akAsqH'}-./5CZb}g0mөE۪Jhg)ij$Q!lQ$+>Q% s!n֏[nqzFa.HDx7l!\ވlOt;|3HEYd64zW!X7TJ/aۜ YXg #ۥ7 q *CnCQ**Mx]Ԁ8 9 G\r.so|`$2Vl[щ7JKmA|F8 Snq::Ofˌ@]n#% skJdVi0Zz㈐f! IjL 7[­]*Xݛ+nh9 AΒEo".GDaV/\:i'70@M6Ad{Ր2|}@[:e2Ҽ?DCZdSȾd-Y(h-=C7,J8K}D5QzwTŽ!rf&lkkr6߫6GnR#oR]cOî:KB.VU$?✔z ۥ/,AIlӠ,qkw'yhN AR&ٟ{&vL3ӄ8 ,ij]pYЃx֖Y PgYcOYDŽM|ut&4=NDMг?,LgT'c+|gbOq%rׂBxV{it-{XY[4ȴc^nf( |}k0, .)}ҽ9/88K¥mpe<IJٳ@jYگ|`wY/C VrE>q([G2Amj40jm> TE}#JgaLj{݄v";S j1l lQqЪRjF=pL3_ *v~lUX~⫝9g ˏPs̢c ] jMڣsq_Q2s._N.&"= EgM~ez#5t8 w+a2?"K||B,)|lXxy,ެYJO%#(: ^p*WՑ>kv(ڮruEWJkW1벝]Ndfɦ)NҽmWR ?z!l͔?˫c.&6ZKV,}ҶER,k)"RgT+lζgϞy e 2 ٗaR6ِAqB Έɝѣi&ZRщ"~7k精q&1# Y\Cox"$!"jӡGI6*LN gb0i$I(ZaK R=$ITNI_L++>ǚ@mG#͠}jQE/Ufd}x!$u1בZb:[&+TB't2%+l*2wH}_TGO;ֵ`G:H/j&o9G~1GqL"B0D#kyB8A2нg9 *}%3.Kzٮ)*r-u=M2lis)\ wGټi:F9qlyqr2޾Y(,Qwբ/ڶw:v֛33˗+"F?u#Wk( ]'i7iNuب,e%ؚ3J;d 1jtEJ+viMC6C9jP uuv\&3% <) ^ B#EK׹xsĕ{?g܋AY$IW=϶z-6ۧ2qٿnKގ+#kƒ.rnX ,/eCp{?I#$1ರ-ݧ}uE6M ˂WQjH ({xHvE,ܢNZNE`/ƪXD24Kw(F(4Ad f"MQoX%ZRa["JDmKGUN3ID_O~n=u,p *9gP?*Ԝ]5r*}V.1+h ztu@gD||?jRjTSӱiVヾEhyu( 4iwx e(oSa3wj:,WЫ~ع&ı٘}ļB\`?g/yRx%]@viZ:דXPQ5}Βg:K^1;3V,lc1Խ مZ">5幺i^beaS}[ґ=#5 MdyJOܺfo,z,sj4R1b J#G]yS;QD!M>7L3 t.)~nWo=ilDŽpeP8͝C!Qp8ҝ TX$>x&OPhS|fZ>.p%8}O_ qC-PeW\=w1ˆt{Ix$D>@ Kţ-VϢYB+ Zk=S(eHZq\ <ȥ~mQ% װkdκOv|Fp2bÌ|Q~zMgM42j݋YȯR|[3LuakJPt&8^fܻօ}r, o;jurjp,*$\a@=pΒaS:Isc|3 0%Gm; Q_ΒX#ZG.h;Kfg5mzQY#wCqxxv>8K#qv:WӑΧhԍ\kÏ<1JPgJ`rb턜◿e{Fuk&,ZR3l! zf'8O@kuyJ^#9EgH̥0PnP1l?LY_VהX ˯񂰲bN r[o-u|F-2o:rw&:`:[l>v.0uv}ys,D.2g)lۜ  =ד%y.TR~&Īp#,|_Y <&НcYme*-i7>'ёq5…wS0A(O<,h; {Ɔ>➡AdpHlSg\Yj 2Y*Ge6(c]ՊF_#ul\.#*K:V&'J+ ?o?ЮE-Ֆ I5Y/es쐌awg<$f}|HȣPB4ׁo~=3n~s^acSqDJLzB16_PRI*>YsOiq*ȵy y4?j,3<g~TrD=;qBmbΑ*U6;SK8ߥ|*_.z8|7J+dP6V"lGZMʼw̩|_PO5KdR> Ĝr1㕝bg$:#GFWB@JwEH>u>~-[2ЪJ=VKUSq Z$ue< '^`"nyr]&O,? E=Qzԓ?-+9nt0YACܹ7ui:^O~tiT, uXE)6bT0FH:VU!C%&^d9&ّ&8 ,Zz{"pؿv>]6`򾳱p$g:ֺk&Ypg8 ,9 98B\y͋/844<ӟ411? Yp *|Tݻwh4H,//r]ߕ8 z2~qqqqii)nmmO̓̿p녅FX4c(>}?991zg!IqPx*f?,gggp7aYi~m(D"XÇ0"szz g|~?I333>׿o~wҲg\1> ?;?ݿ?ퟯ۷'''777766,8'q endstream endobj 53 0 obj 8085 endobj 40 0 obj << /Length 54 0 R /Type /XObject /Subtype /Image /Width 339 /Height 110 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x+0E~bqHBP I$#3\2uٰ6×ʧm~@äd;VϷ ԩP Ӳ|7>h:7PX}lgXaVhi=|r( Wޛ+VJ4*B0]?*jXY ! QZk.FLwt2ĥskܱ$6 ]>>o~^+?TYdSU)GX6v7_7SJbL1,lӘcFurmoM}#>3yq}{Q|ϔ-$%ry Klǐsh+ۥ8se5+>t$〳Y=]١IuIc]U_dZSEmiqw<' _K[v]ÿbtYo1|CB|1Ƴ]Sf1; _uo9eIJ[98ᔵ]*b84vٟܰW@\cj6 ^IC} sM6t0% 4'yuuo]F3j4 l> &HwߴWc]jAZ:3=vůTA L_#1A6J3~dU6ß7;P)M85m 7A×xMiSH'Nj@vnt$d6,ܸ<2}z<Ԭ;2Ӽt iɩ~B{MxįȜϚC86p;|#~ l\ը]@/f%R4|6|-,?Gnov6u 0RUL9kb|zɦҞkY7| +zga$L/6uw0K=!/i0 3>D4=˟9ilj; =ZO㶜}ZHbփzđq×H\Xw=n0×ZX^;V>V{hal,B?`KG5Pt&ç=Qն( FolH1_}=;[m[.mkJblIQWe JeUxR_2]%?QE {R.HL>2%vT;_! _E.D^>w.e*mo3teEO=> C~L7,ɦ/5|44|džz 叶I.t8%'L_%h&nZR}G֢Fe-}̎伬+ot^:ug\0o.0D] 0A1-PDDúEՐnpdʝ8b.~]N,"a43Gov"IΪ:<4vS~^g3}n7$zE*ґ$n !T m{^OC(׮Cߖ#Ay.bX#x [DžnZ%Ѹ-u0|tҼ&7 wE3q;a5;oޥec۶3⒘ڿӷ,D5=D6m?\ m3J_~LvL]̋4+j"7QJu<0#y@z"Ujb'ZDU?]\WuM#H]iM;OegAmT.wLJj;2WsyWf!:f21 NOm^lt[_r9;T!HxT}sƦj!bQ5 5|qMNG|sfЍԩgebF=UT'-Cd)6K4ˋQ,s:Xߦ{LvŬZ4>HJ5M3_`Au:Oz誽8-n5xU<Ehm(elq[joH̊7>lC94dwl6"FC{{lznu4[Mt+̪cyi.Q9nyDZ݉USqrs7Y33rFۓmƍNMњ.&Cwd8RPvx'or;(1|KS8Hd9_3iu[g3l?VX^5_:I7-9fو5lqܩnjXvX'i䚏Q.'d.}ARq%>G̷n^'6mWڡM׼lR`V-\\j8W =wL)qCz1'՜׬j$7S&ԩ@́en/^iSNK+? endstream endobj 54 0 obj 5095 endobj 56 0 obj << /Length 55 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OHQǿ%Be&RNW`oʶkξn%B.A1XI:b]"(73ڃ73{@](mzy(;>7PA+Xf$vlqd}䜛] UƬxiO:bM1Wg>q[ 2M'"()Y'ld4䗉2'&Sg^}8&w֚, \V:kݤ;iR;;\u?V\\C9u(JI]BSs_ QP5Fz׋G%t{3qWD0vz \}\$um+٬C;X9:Y^gB,\ACioci]g(L;z9AnI ꭰ4Iݠx#{zwAj}΅Q=8m (o{1cd5Ugҷtlaȱi"\.5汔^8tph0k!~D Thd6챖:>f&mxA4L&%kiĔ?Cqոm&/By#Ց%i'W:XlErr'=_ܗ)i7Ҭ,F|Nٮͯ6rm^ UHW5;?Ͱh endstream endobj 55 0 obj 706 endobj 50 0 obj [ /ICCBased 56 0 R ] endobj 58 0 obj << /Length 57 0 R /Filter /FlateDecode >> stream x՝[o\uWƀӮoĉ ˙IjDɤ(y}vԮPl>,s}]k7kcW!u:ꗿy0j~7Cry_zZ՛7^_^m/ *M\z]ʊʫٕ+ŕϬN<·ƻu.?w˫.|G?>xo|>zj'ujEL?_R~M~?;ׇKQgϳ'9z徹>7^\WD'WZb_߄?Ik{1vvO OiLf6gQ-:Eft]L=ჟ}A&nnKm?x:,;tu;{' hh>ɑ6Zp.ݶUih>M|2)lhg ܁sx;VS:u[6S_f:x(ټ NTc#l`z&Niڟc5`L, Stg}ߟ&8ؙ+n0 }}Mw`lQXBG\6Sj7kW{SOls Q(,cl=z:>˨HAV{`V;aDasÐ}lkg!0ڄ_{}iR m:y`R(\%WLa⼥70ȳϱaaH9x;w(R ]؟oDbn{z:JPH,<8XiuzLD~@%$դA< q6hփػ}C17vk;r~EH!qc1`ӽ#Ul|6u "LbZU <_B",;,xX*%r YY(gX%%ՙ1̜,K;@5<5 P(O_2G䴌c[L W[Kl}ŕO;102aRd;eE3 \Q%d3С"svu1.CZ2u~$BM3e# LߎbSph EtE%gt3tpS#nIꡌ b]qM˷.xGaQO8 q=G!Ү<8,^h A5@MW{;0*ǀw4d)/MQISuy~O 'OVf)mw}F_=r4>'n b^]v_1ԞŏQg0xKaYD+*r *Vک[hDFI_ 31w >)A؀07eq^l3CY_ @ 2@[K:SZ@Ƶ{QɢR/TJi~,PCk=CD`h%!1%"3 dh>~eS˙zkMA#o #*dy_,Aa\FU>> invأ % C F1u>tQ9`HPݕ<9{M|Yw/04 9{o>^4.MJ ; ҁ 9Cڣ,. х$̖΄G$nm;Q'HæPbcI j>!}uzjE!Xp vSZX5!-rr52Țd*{CVhOy$ںdy4构"X mHC,ʵ8QQmOI2<یfWd-K0PI4"_>HRN>g7j?a)I">װ Qؼ(5RqA˨F$3\2pl[xX)١|A& *z&Qgqݯ/-8 o6ɗe0_Dq9/A\הߗz:yrod7P&F7hcG6vhĹ׌6gy;T}[oђӅQ>q./5?i2bll" b~cXDJnpZRVX;EI-bp9jEK(R>C1^SrrzC<[i4xۈ_dE4mozc)_ k;-vg?Q;HJe!.1kWj,jЩV&\lb)k{oWǃ &)-XS{4I`DihJVM /NUL:g+:L0x& Tk \o)5(^V9Py7Z(X,qF-Լ"OQ`)(J\$:ApC ^鲨Q F&䰂 9RǪGz PǗ ȇ`7\jԜ HAB-U\p {}_zv F089o0=Ͽ5`c2˨8ݴC> 52ț5uX JڅvR#&/z7r]_dÌұM [7UƎm2#Gl#4ϦM*, Y4RQZ2m`">e`[ Jl j_$IG:i]6o01G\7@Aq CKrrwQpa:oǟ{'ғg fh_~7Ś~ax'O[ S!xש+D9h@CH$f=ڠծ'޺z)LUB.a P-U'tDHPTN߼maVr{2)F9o2OvPfLjq72G5O5KK4Ԧ&"ƵbFIF6B$ K.pl3`iQ#  O2M^P,3r:뼹t'z^$8MRT -誀T)Ojþ0U.^T="&}ނ6GfYybSZCIg뫞xGt-_ĩUJ=ͻ% lmhDK8,6)WJqd/Ylmr R )Skqp ] &A!|'%XP7նnʢ ^.B(v;%`HD"5` 1#Ȳ5>87S hn="F߂ ٝ@Bř4C"*Hũ3rkxjQ5uk> q1fR()^l^\`3VhM$AL'3]y>^g;呥Fe> endstream endobj 57 0 obj 8095 endobj 59 0 obj << /Type /Page /Parent 5 0 R /Resources 60 0 R /Contents 58 0 R /MediaBox [ 0 0 595 842 ] >> endobj 60 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F7.0 31 0 R /F3.0 7 0 R /F10.0 38 0 R /F1.0 10 0 R >> /XObject << /Im8 61 0 R /Im9 62 0 R /Im10 63 0 R >> >> endobj 61 0 obj << /Length 64 0 R /Type /XObject /Subtype /Image /Width 351 /Height 164 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x_"Y~i@,ٝ'q5!fX(!CEpcX4zQD""qr&5QD)(KOfgޞ ==;Oso;}o^~|D eYvK QFJP;n]Zp8M|E .Z<>o8cq o43uYHM4Atjo4Z)tuv *D+k 1}BV61IgbpFݫ9Dȷm[[# 'ً¶jl_ŢgL fqS_S Ǘ̍"_bNsj\SJHvEJm{;Ү*ej LvJ@tWpLZb. d_ D2y?eDT8M[vFPԋEMӊe,j"hawhF2,*E9@dK^8\ͅ?8 x ƲVkf[YJ g?ǝ7_HOhV5)ֹ(|y t=67jE',{@b٭-F } rH M(7Li%+H<8l\]&znjLS{1@Sy`eS@qA"xG~T˿/ލ>^8 /NJx=0_1Zbh|AoFo"ۮ7pvXpAJGZ3ETJtEJ< H_ 8|.~Q > H1Ȇg}p$$<opۃl>>`<8dp+>7Z[.xq8' jLC'>+8Tu~Ȼ-=xלܹ`"x s C+Ǿ|}"G#w,pOڻ>^wp8 ӻswr02"z C- A2"z _⭶a,Q{t8HAL|a8P,}@ME?>I|.vn~R o>U}]񄿚A#v"os#kol/+/Ck{Vν(QA64j >+A`\ 8@w}!w~#/;ocC?V֠9r~[m=T=d#VR"w s⎔BtAF? QWg;bݒ /2۾7NVmXNBZ;RB2z !z C- A2$TJI R)u(]\\z M= d[X,@^Y[hP(NGzPN[9+\tK E ˹aOᓚz p6a'Ν/5)+EQA%HZmQg5,%%Vg%Ѝѓ*kʡH<pPiQ!fR׭9\ efS4s6/CR?g7%78FRP`;aWXKݑ($@Vn+ "ЈsQ ]kfY4LZ :n\8]?9"w0> ,4;hgF.6?/O?*H$d>q)NⰃxUR'Q%QPEy@th4W9%tA& )ߞ4يes֌Y1[S5D j\(_DAxU0;kK.& 8{7[D=+lx-d>L5:L,6ngq߲33 j5~ A2"z C- xvx-rtag kKl8v6lBpڽo]^͋ћЋ 2j(lX77ypWsɐ`QqHDU P7L|b2Ib缚QCqmx3&(IESItúaɃc5bb"T Q[Ho7Hltq R4pҒױp /VC/8xYu L͌Xx3]DMsGq؛!.Sguzd|E`ӺaC+v6-!^x-<w/F5vr mTL{a18@ M,vl LDNb:.`UL a9n CaScîu^R⋱N𯺢,w$/\ 8teS+t&@73y|f<6l>2"*ID&}f8 ?Xo"PV60O$Fj7VeX6]w[7_ԭeUneҁK31_v<؃k],,s'-Z,|9!L,Yޭ ]3Tճn7&)F$772A\aԑaۺaɻ#17s4>-jmk]-^ tR4 8uqa9 dXf!t|a<=.gk=EfhnRMN3%Mgu@gcOGeX9π mi:>} ˄("G(Fg~%[h3 >PoddPod[Oړo"s@= 8]r72'_/?ů2p͎|ϋ3O?Λ@8܎ r׍rNN=췭o ߆U΄\5#ߎs9doxV \[ќ*_$iϳn/vsg$Mu+OYΏ?Řp Nsˆ\ dcPsXZ(Eް:G9|맿/pmp *O?Y(Ţir?αn؀D"ݽa3sxGuG_ O+[XդD(杩ZX7x?2 ÷bpK3v<[xuY7eʍ^J l_^WwpA&~Z7<:G9`$ C{3@E!d2A$`z C- A2s~C[pPodp@E}N|nATMcq7k=KILŨUp?\;g~I8LnL.|=%k<۹/񶯮z 8@WCC_m\4}}] _}/碔-3vWP&sձxaT& Ex3NpVU E*kn;z 8(1ݳ'6XOࠊ1|Y88#Ko5ђZQ[XH5+A*kY79'él,˷Z 1|V1oJ 8J8:'C Qk֍ͪ&}2퐚V#qcմ0{9.a ҿ)62e=|o+Wo m%)ODt[h>YHЭ`}5pUcT,b}nSߵjƺO7Xï6blorƿ"߶mC'Dg@8^% ކMjKvzDLnp=0ٜEIOh⸹Iј n- }1g=2jRIw6kK |G4'cv1xI)N8 zSORy?+4#e]8Ht/ 9̌^$e_@-?0S Yr`ԳAܞ1_2WϺ4 aʪRmsahL`Pc7VkNq?XY-fS#v ާ ڍFjٸsbH-/D(p[@Id =]a7HFUVɒdӫڛSSx =pP9p o < ΨU`&˨ZIH(nQ#3w+u"y} ~fy^Ob8/څ3(Xk뼩A79,ǽYHN Eҝ!IF9pᠺ'2MA(~Gۼ5{-5|wĴs=cbb5P >AxptEp0A%Z6$ogB;nKQ)Zz|nA6^$]dZ8ܳ='9s6ΥW9pp>xW5ӧ ΦLPodBE!AF![APo!Bd: z2n=GnW;tOB %S$5V;^OOԪ!5SIBgbpHRjF ŵjj.h#ZQKtյ _Ko&xݚ\A!XH endstream endobj 64 0 obj 6699 endobj 62 0 obj << /Length 65 0 R /Type /XObject /Subtype /Image /Width 165 /Height 89 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream x[WԋR_P_*QVhzK}C6K/R\X("@Qp.8 pNDfeL Lp3۲00i9|uDZ-Ӵ,va;qy;ͺ;'~ꁝ蓠]W!/? j4 L02.)|,aa=`< ҟM H2TpUѨvbp rXhaO4~E; } 3LNjr41gc*,[ȑב4U4mutvQuezփUM4bLL__JqԱ'%w"XMw14c9^iUYd9 #TܻsM iɾ#_cޭ mFZh췖iGD,vKM`Ӵ#Kx;r'rȫNIIӻO'#L*W2ڭV])74,Cww+ZUd[W^n$ʆ5*_/%76z^Kh0պ ž E.rȩK#AbEnܻM7'D RUUS3?UMQK h_fh]N$sfv Sv;غeIZ^7+t\S&XkINoV='j|(d(kV3*\ì癉㝻@#՟Cq-LTWrȞ vKdhAmJt!h+HVUeCkS(aYA_Xɠw\֢I$hJw[jN~A34E{AfA?õkdY޾};Hw}~7vޭ*Js!.d DΏ6 b޺u#Gt]7 ikرcb@ɂ*n]J-P B ^ {:u ){K.曗/_FfggϞ={dR"&C2AOԯ:dp2ݨ]t:tLOOd:}N[鉜1'>?=z^B}i[o]zշ2樧DVɸ^s_&dl]PFZ{[Co}tGO 9U ;'>e@&H-[>@B;hڂ?7 -6mZ|06&7 hF^q 77g_0yC狂KeV=A[E/ZAtJ|ˬ1{ )k3&{wWOgi4Kϙ3n?ɋs_1^hgΜ1ٓRV$ W&).PCb)V7H~Ri<]bŞ~_wvsq {g{U;Wx䥔IINOmჷNKԫND;ܦ\iS!}z?mr;F&?|% {d䥔5Jzj{|_vN[@y_XR]`Ǜ[J7>ohtӝMO % Kik$lcO5;ؾeDg 8 󙼔*wrQd)\ĬwũU?y遇V;w];;n=#N^XÖݓ6~&'/5$VcZV&c̓!?kʍcz^UYdw`1 l endstream endobj 65 0 obj 3064 endobj 63 0 obj << /Length 66 0 R /Type /XObject /Subtype /Image /Width 100 /Height 129 /ColorSpace 3 0 R /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xTSٺYk\^Q$ޅ(`QQ)VlXb Ҍ H@@B # f.sgpFT9'Apg}k>>o}T1zo!l@T*)B%OzLP(U@*|@\K*J%$OJΗ"GAPJJ$"S>bYOoHT&ʔ"K%2 ѧR D*EJgJ+Oa_!H!}E.WC?G-wлA9\!|@:5ɥDK>yRޣTV"i׻7R90V}PRH,d>d }=*U@e]*TJ5r`Vcı3X5S)$RiS/^?߽{䀫Q_NSt]R)cXPo_9HXqB0PfqZ-= z(G6 HXobkfga311160#4NoD"YfJS׎_c)`GĘ6\ 2)@ l([ <ȴ0F&qZ8QOPonb`cenka/x7pUrsVA%IJKK &!&:OF6su4'WGrtX]fO3s 7MM 1$VffA;vuWws4B @z;wn+DtU'p p- uwrivgdpuY gT9s'ggm:bϮ]PՓ!.Ⱥ ]?D T+8xHHXC%cmsr0tq6q7ҳu ;d2$j'PxɈgocniaX{eiaq}`OX!~k2)hNpfիa%E~SZZcx< WD]=Z?(jY{9۽wLEu5_Xέ,/|pRY.WTTTVWUU +UBNeEIei~3+,;,b99N$V AXAP)G jԇ?7hH\UV u!JOOOWWwOU!,+0ye+!"K%Z3 "AI88UJNʰÃZJPV RSZeUBva%Ų,ʮ̣ rSeD^F?xyɪ8vSXÉN.v6<2(CmWS՘#P(#Y {>`K@upXjRU(1Efl_Z>:5 ?^['i2ȴ6K] $-j| /qIX=ϥY/+9*,*3rr9lzEFry)~Z"?9<1,!GƄW䆆mmgq&NVWozd0+r?㈄A MuBFjPk^[ u>E!(?(g3eG <ݽyl`rg +F^9Mg)|z Dtp ƄqB#!Z̝3-,'._{ǐՓײb?t[Bbk&QwRQȘ`V =z: ꒂ,Fm~ne^vUN0+"#z aB4T8j-Z~=w(wh7wPx$s4y Vl}zopcP;"`Ѥn39ieSeSxA<.w(7:,: TȽݼC۹m[Ԯ%;6o]eI+ O"~\o奫VBX}n)/ZV!e=՗B`VR䱴1c Cꕛ8Iqe 4>{,0 nx0Pt:u%;ײ-ܴ*c:j+o? Wng%hu(+VhJ@ȨojiW&?EIT=2)Vu2>^(!L0dxIv4X$H(+ W}(Hi҃[96efn_QmEEkf]rjaE8E ֜; x z^G#}D -wԑ>{Z?(EUb0TI cǎEc`VhŒ1 eǸG"԰Ô`e}`[%{7] Z]s9{۲- 7-*X듵fae \ɫxsVY۹z.;}2OWXZojj{#kDj fH{l4ۿPD)~\hK3Or*y1h 'btI39sha:nX8#KBLvܽKwo(ݹFdR֖;@sKzӽ',u@.a};3&9yurC#\$Ƭ*5GJ%uh ꐈgM[v>sYyݳMY855/P$r3P\ e#!} ufpu^9cEy9Jd}JxjS dPKoϞ@ct(,eh#/wt_foekJWc\Ydz)ys}'B| YXԙġߍmH{nW{N eJ@CV.Tatfp:9f/K Of,tf9D6 l}l@cЖ؞Ȫh)`Â"1~mS{sf%AkwG+BuZ],ZSW?bV)PF];1>.ۖ&cum @2g2"{ 9'`N΢ YKdB5E VbA6@[o=ׯ_z5 8g0pVM]ᑹ%sɤ\@;.dc6"'AXd)1ŇpR*5>v fMh%Jۄ[-N>x9)fW}'7ffF՝-ly|aꢊDnV\qJ*OG?ݻX)-rj*y@.V\!mmqAYg˕7{D)8=6dȍYI{ 2՟K;_qZHL폏u0 hqvb9+jvYnҷΟ._~~IOן/~F,F{Vy92ȆyƼ$ ~,dSQɻsN:W*lų%(9'ܿ*p֕5t(%_RY^xrU3WwߞLV\:ytˎ5SS;1&1jmt9IY3✣y)2eܛywB5??7+KJsS+;ƹw/@; sJMx!{”OD,*-_Qp\]Ŋ>_xpk/8V}_ɧr*IeUܚ|ZaNpR/p_zs?=h{z^?7m$]o⾟AEDjV"̑˪V@߾*J wxɨ- nO[LprjnF tUw]*!~_p 3+9yg+g+n]>QSovvi\Abm$:+~xW _{*nG>=}WV+}ǃVV*A ^}"Ⱦ#X\Τ)m<=t\Rqy!?35)v`؂^AVmYwng)xPTޢPV7/,u_Qr0؈VD?~xSZhAqi^fqNtr®9Y! rcA 5LnQZUIn3̾uO;~wGV/ /*(ع(N~,8"?tiV]EaeijI1;Ǥ ˓r@ts~zpѭ7~ڟ;>$zU/-z ExG6f5"}n 7,gE^%E8qtS;2J⫋UQ8΍H8ڹ2ΝԔ'Pq Vz}-Iӭ_~|Qk(|\n'Hd~-E-|:LVc2s3ąoKU^KV˹$(,(,䳲Nlzx&ʧxݯ?}A =f%#ՓvnXD2d})t..XMAVF%T rwNqiO.eDTNH?_v=^{Vb925>7{Ij[CSv-:(r⤈5'S)lH<.&tyjVƩfQ~ɳj)ffxafAF`=4w \wAYG>?۾پa6`Φ qrN .:\w$3x_~EK2ѧKkyQ5ccמ8SylUs/r/o_|r fg`$eS{c\r$ZՁîU #oj^uUx:0\\{SWk7R -GB~a>J&R!{붍 QVWG ]- +\=j>>_"qED}]bl}tD 6Eݰ{G~6[7kbNʞ |vsP(Ra_ɐ8.PhȱJL&fjZ~~>G<>Zv-[ލ|}hwc y|Hq?(z|BS'Iiۖ_=XdzJQ7zO?X5SSb~PUJ^S*ۚ|@[|f7=>HՈ+ C(W{N`N=:*eJz9)<=X!JiF't(6b?ueGԞyǂ=YQ=iϸ94272v`oAޅ'VfoeRN |ӧoh/ԑ Xa\CV@zzUК~BBw~j޳G.?uިlYy [gݫ{8/PпPCr$6A R;8*8FO$K$<4TD.Dz}zKfPo^9 qr?+l0+TM?§O iCL)C2hb/"RhH $ꗋ1Ű}=\}dwDom AjM 7HD`Q"D:H}@0b(V5h ]놭 *ƨ`m M$d lezO2e +^%!  y%5TeT@:_ yw5+ >BUz6k _iWx؄$hw'3Xk54aFHK ^C fyVCPXajoPbr`Rs&f-SxT?KF~h| @zs%:څ@ |zhf;  EV D_gs~NGO#u" rr/@L4>sng<{ -` MUHPI=R3Ojy9jyj9j5akFA] endstream endobj 66 0 obj 11607 endobj 68 0 obj << /Length 67 0 R /Filter /FlateDecode >> stream x͝rǕ=;)jC6EvTx1G$H$eOw+*O~،$*?}onB7)mΛn7ˍ\l?7 /[7o6~ xޘo6n懧ᆇ[޶^Y#yA{q;r|ius{g_U;?qo6œu 1:_nqG>v ^/ǟCw1_qff+yz5NO_ ʳ~SoNǕM]QGǕ'52u'aMstto>[57_ Np>튚VDmaw j;Ǖz'$$ r_+U_uM%f;IHyyJ bo%TtS\Ru\ IHO?%x!S8uzqK!UrǰR;{a*B{>)}-RW*MʹUUr~~bGz>IC>,5\VԗT3W#٩ZkOOHSj;Y/ #fNvi3-لpTapF/;/'TNFZ ЯincRk)>!;<{(L%zv[:~N:6مicwl(YuqԵOԥ ڬD]{E]jumkJ9=ARlzB?zRw?J "8֌ϝDY185:]FdK?km'# P4 d%@OWrդT<ѯh%{~[*mW}wHejw!"|TTUΤ,AXǤ9oT7L&J6O/dtsRfL ~m^016My6Xȅ>_/`1x4UZtqte҃"f]J|oAl$K5_'WhC]MqWj:]nW5J"68u|/_λ}~m<,l,}ӎZ$$x:xl7AB}{R1+::$ƚ(w4՚NBRU9k\ILaӝ"m}%u^g+a$8Y*gt>l7פgHuo5Œj;zYbjtNF~p-ͼhUc4 lJOy- xR`wHX7nĒϠ9L3!Ll؊%s/Kٴ{H%sLD?>ꠅy#>Y|wi 1$8NZ=~iukH7&^] X[ c|Hx6g4vW^]a+拰NqӍhmvr hLac_|s5Xﶻ7I`g&fEЫe2#dRAwZ?Jd@#/Jcq,2MGL [ϟYF;q.z9fкU,4ɛN@̳x4[%(1j񦓐HHHeBY)-e,xۙ*538 YTӌ)L^6T>Ul9?2?Pjw@B4InkBEQ͵.da~yz'Tn$&iA_m}'t J3sЇ 6ȝk_ eA0J$D)R-R$LX( aO}L5H|ګA4HhWxڭ'^؅,.%_a;V{^!{DH([pEJ[gL,ܛySEۯ&B1pHQGQ-c]ڧ )o$%(Hvso: ŁT*; qz-M$'3@Nl"S Y\$$Y*&/HUC*hS'!SgtoKld[{p2K )T)T.X)kؓ;KZJ0 $OX+d M4`)1ʹl ̃-}DIZ~m>OT[ ΑjZl/X(AA.z GncdL"\IsojB]\>r_A@2 j+VøK'VCRCkJЯ8?NKc,nژ[TmKy a 9omg r}M`d' RDq=,b5/"#jĎbyMgf 5,SF޴t"oYb5,8O2fs_\4:U:-PU'* _: ~)SA:d"w7&hԙJ { 9ło eɭZ QfaH8V5{_^_ 3Wځ^dXP-I'|CR(ID "]B״*0 !1XB_5"*9if' }"hJ~A5-ԍj,OX;zJP1`6uN1 $T;K5(i2k@Zy٤kUB.y"}&B@oTTk+O378g_g3RôfJԡa T'|IB߲d7H;l[ ~Yjmttf&pg^~]4& pL=jTm2p]ODIIG0ad(MJ16G1-|-s)]|BV<^UŅx l5^[,)%%X_ߖʞu}6eލEk&bNBoW%.@g=\Q+e]n4 8M('LAxz$%0A_P28\bJ RN)qh{MqCа*\3Dhv hH)VǺu}J^04qHЋ 9"jF4pH6)7FcP`E9(g,fnbsteJz>&?gx%<n)|T;uttb4iRACЯZ␤#)Gdl>IbpP3 9a%k %kCXgp j|ȻPÕ;uKYSjOu-C)w3᣽0ns#/̝v^.Wi8W s r1[I Zg:0}svYި!2R?j2/]yeN|w[QN_Z$O'hq}vWޗKW0'ݿ浟dX~;51{Kb#j9(VN9 nB@Ϟ'de`Eɪ5]kpHjK"Aܼ O%&KX6Mf۷`"ܣɒU Ÿ պk/G1:[kuk}i\T CҠ8i+H+Ͻhr mʖ%C$Y-񵀴Qj!i&K,EyxҖ FOOj29Sֽh˂tj}f*PA$MrjIұ&RFҽ[t~p9 |%̃\D h[BF7Sy[R-)'t%O%uR&MxGS!bتi4b5p {agS%cbgc~:w Kό!Mt!5!Xp''8UYiRGȢ6wJX# GMM4R$D^"C:~Iȸ .gzw.THdTI$NQI- >u$Vc *5Pd&R:Xʞj+x}"<ƳBj5Emv9/\^v F~+mu_bPcHpWhJS wQh1"J}Y%*c`׈cJo ,JtֿXcBf Y~ ?E8`$8P* dsc:$q2⴩vUI?f+v:FR?E?#abF ѕDADW0$/069Z3 |m*y0䳗 YB~dhEx @6>d'PseᾹj!s L.~R,|# $$8ڇDd};Wt86PrľXwG'" L#E^GP{큣,/ ,NA[c<#$\jKЋZpьϲr }\ֱۖuƚz4ΣWO^E%`(7'V@!C޿hl$0z$KuETՠLgMV*WH2 A~4ؒ~ iBBFN Hʈpk?!]m;V`+N@\ qPi=|= ꥒKIZ#]6JF#NCCR(vSlԆhf]Op\V*h82a it8nPeUYln_9Yė r^Q+&ϖ4Gic.$g8z`o.̳2q[fƈ ɳo˺@W8=2i,"g A+mQ,&BY m^Y Rh:֑b1l@׃šbY7S1SZG]{/3Q|e? v֩Tx%\Hb & H"$DXαi83t8xROoL9Cty R$"QU3@!"ER"1]6( $Ӏ l&mqAcCu.!M35љڴ'cz> 6u7"fc 6(J>F)3 jP;̭jԻB#U/? \9U`Eb9JDujiƷEOdؼ_!sas[$֍9Q1=6Gl,QmLO#2XČќ7МNuE8G5c0S`Ƽm3]@L^X*",V_>(3R&%tJO< ,2ncؚ_DJ Z,ijp5 CVd (:1t]bvP}~1yhL@"ᜃPIAtqm۠,w>YoIyb:,Q(絉ϰAGb[N7+?u)H-1l2ÁM\ʆpRסg;t f@JZvRe>9vAPk7G!%4NA=c|{:;Apن0j \\)~iVmFMpqӲ'!1OPk$l4TZ]e9I҃$8 0'Bu%IXC~Lm6cy~n@lӒKӚ>J4S7meFnڟ# \Zg\MZxo~X6;u̜KtC}e s^s)Y4˒Z %2X,U/Dl3Ą@Q̟Ӑ ˬ ~=^Ji!Qw򂂭# M+;6 5LT&%~|JT,BhvO,Qx2@F7~0?4:py8E  "eW VlM.j-jAAWأt#zӘ%z 6tXv>Ծdi1' eh>o\&M9 R7bj.F!2xL4OG6BId{R1 4,\>PwL[iL;HC|5r Du,ew>[6e\K§KYJ?y Ekup?;FQc/x/zÞmjcwg)u;7;ݛ5B=ٜut\o}6}>p~淰|[IS[iLl]Qn욮:[ [hw[l- :f+>)Xg+z>=6O-KZJ7JM]}Vw|V/-5֮~Z0_IE?Dlń=5=QU1_Eƽ2z^* YqL&;t-o4+1^K(չ ̻J8/L^%7tN;_WL ̛^)B[`h Uw~|:5݀XԢ܀<yskE(0S'KNG8-Y;hNA'` 6:B(慨AD{y3=3LZ,pK{;M@.9n {䗕߶,75b'/ ܸs(\eKիwW7gUČJ+R endstream endobj 67 0 obj 10560 endobj 69 0 obj << /Type /Page /Parent 5 0 R /Resources 70 0 R /Contents 68 0 R /MediaBox [ 0 0 595 842 ] >> endobj 70 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F3.0 7 0 R /F11.0 71 0 R /F4.0 9 0 R /F10.0 38 0 R /F12.0 72 0 R /F1.0 10 0 R /F6.0 26 0 R /F7.0 31 0 R /F8.0 33 0 R >> >> endobj 74 0 obj << /Length 73 0 R /Filter /FlateDecode >> stream x͝Moɑ+8hze>؀-0EQ(ȧM3FM2#x㍈N9#lf>t|f:rU7I~,nd81g>K1pL}TF(SwƝp^AZ76Zu{6UAd#vgPcj(ٹNU80.7&>.8Fg3kHNX`u]7ٚk|ajB,%9:`Ψ1u|fei!vn5J;{P$h&܎*# '^& 1_5 ׹=WG?u,1ΛO=ÝopWۿ,bBSkc1SxZэ0};v34\0M"J00Q6'P](ב7q6`msLG5AýBW I=A" '2-m+qB!!k-X"X=ʍŢ j!WOji;|6Gia cEmVk;wud]vEEv>c:HZ!L!pdW{qe__S-z3P% ћF R(&{i)1FL2&DlY:a&FH32CzH&zB7 1_l4)aiE}0}B]Qv@t@xL2FJ)GMyhYɢw1iIc`,>C2=Wz2֔ SHSwrF&L5!M1MQ_ P\l UJ$mͤ:c멾!5ns$=ټվrFjH(!`wHOy~YKQqBCZ'+Gll.,_ȶV2?54$xŵ3؁T9o∐F=M7-!vHi)ԉ:jGTqCK9ҞSи[#D226) H#\",J9m"(8uwpP+ %$`˧mjz /!owwTQ}o^!\BQp x@ N)R?[7 mrAZljpH2]}jAeq21'T#{N.5]TܼC1)A5'|@ܨX&+UFG, IuW>vH'l(h>B#e߄BEXFArl:Ą1TeCjR p⠖ YG đsI:a=]2$))JDecTŲOI+}^XT>7ٕWG| "oMHA엩|5ȳ[)0sj%)2]已.NIԲuK PP] }cB*f}ygѤ"VFj@%Hz+C(u 2דf*V[NRLuˋ * i$@"ťTҖ볉8&[ad9bqir}Q x^Z.p wTP*+ dŪns V Xd i>- n d> ${ t&`_ZC2@DD@ɟ*\uH#* jߊ>%Xi+PqT7X{X7,I8Gae:gPH[1VR^$iCܧN(ܧp-cT܍BDa;IDȝ(ڤ71dz;a#F*:}rֈw W 6PyVF!Ȟ離cfgmyRE%o_6?>=軒SBuK,JZ%4¨0&uC[[4O(B IG73WZ|LeTA|A)NE8j/љ}@P#@##k%Z|"8EVgοvf FKIa ?: m ,H D+“XNupKf󤎪]-(r=\ph5Z^T`i${ƒ}{FrAgd4z#Li&NM$vt똨6ECk$e#8 wM5}MquZmk^8Ew7&LK-}F χΨOaRJ6g a;Ur%7LŮrջzū]2,,^w] eFjg6;AbZPXJ xmUfj,7f]^c ߏX^ƾ-^%w ,+Wa.}VMEey1,/6n7s<JjagaYuacGFՑqGڏ'*i}'+xiTI# jQ͞e7Ł4 v42oڒ͢i.0ed0B44:<;ZIG[C애S+"1a\pN?"\u6Mb BM@͸|WPKݛDX?ZZt%HCf[ >t 9m ao MF] |D mAT ?Ʀ~OC·cXceE4D11J 䈞ʌcDQ$"/9*۴)ǛN"ά_c>I:彉>)X19`SmcZhYjhF=N:㤺˵wf@)vm]gŒoX_dF GG4}?j$7Jh U' I|] E9Oe'$j+ 3 z5pANA K<|v~M_#د!6y NPQkt : ;4Z7/F}M4}R[P}S6jZ*Υsi aA@fAWUaHf]t40[c=>(N4#i9r8AY៭=3&W5/Je&_H)&> #㕔x>`+3^L3ʯDé77)*QZ[gfaV $;{R_Q/Q0(8lSg/.(P0g SmX5<;PaEgaӧ 2V)dD'Ӛ6/=́,j\[< !0$T'4C&1x{,/mˏhSю&C.]˷w2z.5^7F 4AТ2t2]}~uSLy*okϽHn5=n}No2ћ⮐ !4XĶDZsggkLcy4!CALgIP-o=`1Kq>wNSfIsl.]Z>SbͻV=1yˣ:oSzJbm:l<U'n[um{!hel_Sqmx>@vNS~uE|Rlu'-sG?߶zg|Nю~*#}qLAlzbsJܪ8hÃD9,: 儖F4X$ݾoҒAf.P: 0!PsPY0 }>8Q;\gtf>1;}#|W?a;B-y nד{;+׽V-DkZ SM X}u Av,p!NoOq7FU!0#/'ԱP,'<Y@dyXl: ~hO{WN|tQOvQW袎ñ4`}. 7gBu{]Գffߑq< S(Xba4.׸C %l@ot:F{tsHjɈ/:&0:pA> endobj 77 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F7.0 31 0 R /F3.0 7 0 R /F11.0 71 0 R /F1.0 10 0 R /F12.0 72 0 R /F13.0 78 0 R >> /XObject << /Fm3 79 0 R >> >> endobj 79 0 obj << /Length 80 0 R /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 662 716 ] /Resources 81 0 R /Filter /FlateDecode >> stream xm̻ Eќ*^]0714?!AG9r(aUiJaD0e`@H41p# g@Å=2r>0 endstream endobj 80 0 obj 112 endobj 81 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im17 82 0 R /Im18 83 0 R /Im14 84 0 R /Im11 85 0 R /Im15 86 0 R /Im12 87 0 R /Im13 88 0 R /Im16 89 0 R >> >> endobj 82 0 obj << /Length 90 0 R /Type /XObject /Subtype /Image /Width 662 /Height 90 /ColorSpace 91 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xiLT> 7b !^Gj;uF8$(nAm@diiz[{4 Vgժ_SԔ`զŤw-hS<Љ䌙 |)e 0M4f,9}{3dpj= 8}s7UZ  j½聗ٗg<@pU鼳ʢ݄@@ps5\ǁ@o)yj&4ɐ hZ̼A&0M 8uoD";q/H?"<݈/M 8'N%wOС|>@p 8HnWGG D"xMaWX` 8"@p 8@p 8-6/<@pZ$w?@p 8-;? x@ "!PqpZ0l3@ߙp>@ߗp>@ߙp>P`g^N j$Q(ĒQ\>TbeQɨhȠQHD@TrDΜIH$ICCQD>dc^-YŸ"lx^^O*f2hxhX<6g)Pho~6h}|p B)run@fjH-&x9$љbd>An/jn2'Mz!_UkܭT+_ (.Յ?]9s>!r76ジ ;)...A/U>|v+茧?x![.nJOCBUϤV~9yw<~yv;>]χ ˊ߱Qn=Q0汌m$&[wxy F"w5 ^q!nYWa[>8BV?^1Hq.|p q8w25.]{Ap1a]AFчx *~o2vڦr40mo; NK6mLJO,rh )?3 oiƗΒTX5a& nؼw6 P^GZo!V3Fwk4~1j0CֈgKm 3=몭72 .h!zѽd׃0;_w2`#홻}wxDy/#/7e_Ip5Q b,mey=ZljXcRtm/HiGUz|q3s0fLG.@U怠jru#2)$#KȕA?J X;qŊGMFswZ߇;J{s5PsmZxj. dIŕ7Z@lIUP5AzF6NNvMTjN]IhHzB3?"|*>OsI-.fF Uo^S0MY2vU5fBcR31 ^I75iiפZ _یb9(hg|R yAv񬠬& MZfx쨆b7ƈ±'7m^vuMT}aռ Af=r}}$Oݩ* }= Z ɿ WmiIsKz1wƐJ"8>%QL<_W=qz5>/E@'Ե{bI]=tAu2ԔE_3\*{ 3=]O^n*h#-H%3 9IMk3<Joi?DĞ OFP{_,pP=_$8exF^W~ Xn=>ꏅ\tZA˸6T/e+{jʛ'=dYԕێ&hvP@p `6+Κ''$nz"`DժG}jȱI6,0VE#Ya(=Gm; q͗JV oཧ%sڷY'`€ިQ\M /7څz"_W? d ״}ӗ־}X}w#&IyeóI ݮ2^x]+.2a9l9ymSW\NE6Pm̦B%55E+C!D\ܭ\Uھ#97bA$NYfp:ϤB⻍&O|5360^%U;gcX6R.Sf]OY:xtZnʇ7P@"ԵvugnqSVw7eZAUM |pWڂ}KG >ZV;ľeDi@νZOtX NV_1퀬I=V U j"1Սh|ߑ:hNf}pWů?1OFOAP02zu1xdkC݌Mv#i>ݦIN>5%ѱBKR"tYHȨ'S>,_e{G2$,]GN{!=к(oj+;fl5BY EW‹Ϗ!ԂB̂  "~x Gіp)p6r.!cNnmsʆ8[Qt]%÷ ORd. YS5x'Hrl6zx´hEYƽHFY*XFU$|p [a64բ-mjmiV}lmiS d! Q%SlVYKZG5"F\M/Oo;۬߳)w9ֵlAqǯRxi*'Rdx4W&limOi6erRZX 8+ڼMt/oV.Em^~)ƿ[&4'&$]5U:ר)Ԝ$oPљu%_v[7vFFzz۷;_Ep_&&ğ!Ϻf=S9?X[V[=YcoM)iz>_#J'(fO!ЫUtCyzOqcW]X ]IzϿHqg3W1C^&Nrœ m^JeTcfJ +e6MW_*{K8.L-I룽M2/?j+Յ0O'8s>٤-ɋAjٙ,;E7gȳھʋB4*.\?5)n1+c1e}Q̞)Fy?cbn 7!UzBkwr-˽zM6~_EUΒY@!)&cl8#U-6kLcܶlJ\{/'~3:VKqgsjeahO26|9}puY Nק3y7dysѥ L3و*A7eS(+ѻtf&,"DBwh[Dmu8=By 9V-g4/D;+nek9BȴWcFc~籿Gƞq:w>?AaFu!^IUל {6×O\.sTߕӿņ32y@ݑzm Oe# ++9=qeQ~ $o6RpY.PJz/Mp8|n-e%I̪cljCQ]iýWdrFӖ؄=,n{~;&*ۑ$orULgVD7>]"|d0|D3rW`¬{rt%q<^AQ8Yz~ŏui#Fps/6TKmu4}Y\g>Z`Oζ|Eo;_܅U^"Kۋ1CCFj |~뢾:m#lhRY/7[*us |km>%.3oM9 N2ө,$=_nϤ,3MCk,+D0>my/#G*Pme~i :fм.D\Ee$Z?BY׼e;B%pQ7<c~c4Qb3NPoeԧ'ל4jvnAnQͿؤFLX:ڡXͳeq՟V|6<;u*2zƐq ߚZgVr;5%E** X"Ȗ;eeJ=+-x^ʩ>.J<5ӋN2LV=/ 9oO_V:KWZTTb_Jj\~eY1qNmT_ Ge2P&V5>5^GȽ.{D;88A="xT~d9{}̫٨8-i:{s;vThn$5OJ++ٳw^&|fDwaTV>+prl+()_mC&ɓЎjENe-Iv%1UBL6UwHX"Gz^5[XS!нsBN쨺EoO>sϪe^\ENp/-js8? _q\rqK0՝gdf÷ˆ]Xs$:Ow"WY|qpwp{쟠#~u.B/dH laUlƸvf؊wI&&]:@l6~ئˉm4jgh[YI/6U!5v-st~2 Q]Uw^ *gsԯ RYu+2/mO)㙬V+LYs3[: ݫ_zcGw-چ _:w.~l*;u[wsɒ܋ڄuY &7RYGlbܛ#=qɃ5~܁b/CNf62T~h(}:zpt*Yun%'&$64A)[G/UU `sW2mҩ 2cDHo` 8ݛDV6VK/GI$Ã|D#lT zg>XG/[ ;  JJ{S!X,PD! Rqp\E"nhL]LJ;&57բqHa l?-Q=kVWWrwZ;WumwLg)BPWS](TM~yRA܂`B1\H{P(YY{ѷhC6NWյ@ߑszʢ&8A {@p@p   Asbjp " ڸ a[[Sk_J yoo-Gٳu+W@fE&,A L1ס[kԸ^CavvuqXJuۿ{4g x-4#ڞ}1'1F zKj8G?W: Mm8,3mUGaȞ|RW"yu ح^g!8= 2 {aa +0l}gܙn '7׫bLM}i1AM5#l+@5&:7ZsNptxtj*?/>-q,_0 8ƪC>إegEZc{D^Sp~6'z፶y'~%e8+h n `!M_3h7Yf 8*%+׭YBW5å.DMLH= d?rMM5׺4wYȁYd @p " jj[˽+0`Y ꝋ?'d\RsA<tv|cW[aO!u+'T+b*;̐ 8 sk& -<]s7[8emza\XnjϚu+݉UlW.AbMFbςW}pUә.q /9eyA@p %8F,;|qtpy9XQ?6[W, ohboZ›<A NWQg@!p>8|A`pH$F%XA&j,)I.{7։|@O}DmIXe+Bp}(P +hdCt4tԖx#j,&?H3@(۫o`3~'yMZ@ "I RZAp3|p 8~J@p 8l3@ w&8>'$ [ܛ<HMfi!-[;iS3:kQI+9P )NpE\}@ Т![u;nװ:9F8偻nʫ> hqאg;|uݼ::> hQא&Q V| 8@@ 8@ 8@ 8@@p 8@ endstream endobj 90 0 obj 10296 endobj 83 0 obj << /Length 92 0 R /Type /XObject /Subtype /Image /Width 662 /Height 86 /ColorSpace 91 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xkLTW?=~ !$!! ^xէ؞/zIkWAG b"RD"00 0 3 fOKZ|xc^ku{z TX=D̉jy϶s2y 9t/er5mph .#Gnpqp/c𹍃 08 ap08 08*W,WN;BP9W[vF,;U `p^v͔DPĞ MHs \r]i'\08 >)yޔc_R;zx{hL1 6U^ډs Yt YK lr Vd}\ݷ_̼v;oTzq]G$32.9k']TɑQ"{PEMw?]c)fwWĹKRT2K_ː!}|lM9L8rpnp$ϊO>*)zPxd-+dD)ht \ߓGn=4mkb&8ɷ́;&|| MH=nTU8Q[}r)g˘;: TIݗ]Qqq"ʯzG{+'Vnޭoӏle˰|ݜb`tG'apڮ:GI6˶36[\}D1L1{!jmO+I{҇YJVQecTIV6NȘWAhE k~n" [N?'dIGb]3 jpcR&y Qۍy!M$F~k4,_ǜ(׶&]#35zjvs[[,3,@,ynzؕT`}â 6zݝ_P" j_ri?ܣ8oz}Tcj"V NNgb|DlYQyA|-e<Ϸ?T`cƿ=" `dn*2ޡOTNc[݆I;l|ė6XT",;?mL۩6ؼla4$y11Qbp:?=颫B<9+ W_n08 >mpcG!kGw9qe!ԏ]bŎ2r[5f5i.ocZuIڶ "-jXuUd:CE!qlOzoI߽,m.|9i֫e%^(v[SVm[)e"ѯZ^TTZS?/{08 >o/RncLOJBX|-r=qBŽeW'g?j0;`p|> n7TjnP70Uql?ʽrRn8I:-:E3df:c}j nWgu8;m&Jݧ6RG1ڜӿ٨UjG]]$mUiGܫRLiqJAMww[dˈWaTj*3:!XZZ308 'anpL+%kp %Ց&M08'd_Ռn8פ-Y )+|vKCC] bsv3.?_o $]~ _^ܗ|~F?np''06ڦ wZ4m>CYF08 08`p08 KNT=]zY\k$yg:U+ Eo-1N"g)WI~l0?qOT28Iښ^J uŁ쿢*N18u. ܞߊ Uu7@qVp nqkMg)VؚmT]`pա0ݧMXH%>Mĺl.` \\#ul$׸[@Z( Ԙ ^ODδp NaQlrޗ/&O&LÇ͸0L->:'L:ͣ&B0{ ד uY\p ҢKzrA|Y 8/^n_,v0A0gN]:4ch"ugզUC>_oS1%5zݼwndο;y9rnɿ{7O1ądp]/etQOZchKϸYbp>@'V_V^oVuVmhDR6t ݇ta2VR[x 6=uVrH<7݊X[>La~V1Y&cc&ӘUB~cwӵlf@TC^pW# A㊝uNGO tM\~goeo]/'G/_vWflmpK[ꚸu>d7x獑ӣo/MZlSYS/[i&|eAl.{VC` U1˗Qޤ4u?\FI(؛۫F\:4"!1!.>>!>&-=cw&GŮXo&/}>lԂ]bD9ɦra(6O[m[OؑW(g;Msۖ'a+ǭ\6܉_*&*|ْE%G!hNU^\h#AI˯\GQt`&>:,X(הEjϞ[,ZNx ,;'ܜEâ#;Yb|XSRԜ&[gʍ;M: siO4ftQ? K| ?s=tBmLj RiS‰$TȢPN/[y+Fqo0ۋNo<"hDZ{ -$x_7p㞓?rbk+$`!Yy:gϞ嵾z߹'\aNU]wV5,HXm{wy)3-Mח 6ֿv=];+? ן=:w%t ڜ¢%\n6xF}n69r=T:&,_e|ɋbհ Ӹ~ v&d M[npjFPAlBpjD9=]}JH ۧ:.a^&6<=zOOvΩ= GU08:}tX'GL8'M՟ƌ9/;X2)G|_b\w\6*K9q-۰himdzj ^yV ?i ;/O(EO?LqXg{m905~[䕸 n\w= $%<:+贃6+6'\s"T|r2 z<Lf qU{xWGjX0ٹ4]H ~ISMEki;ՋN|񠝴)? e#|9ڶJZ=Nћm Qv͓/\["pgg^ .L؛Ɍi >&o)}ױY nnWz}P >њR!E ^5z=PH }0/7zy9R%~kUWW{g2|+U aVDʡ+C 2SeݕO[[BQ4NK]f2Gl[,\\j$^IױFU At"nOf1uO 󲏕U^/07_cnW^o'~ܓ|C4KW*MQF(V+1)n[nZ9lE"4KdF8oJRNOO>;D_S*𥶶Kb*uvo’էjj+Ǐ_S-}ʫֱ/8V:=TKJ vs %KJ SԳLfz"v#,yŸKùh9Ǚg &7pR4###ڎpB&[ӿ5U<;5D%|; N>k枧oؐW\R6L鬭iE+**fO3N?-yXv%16𛗏o_!|ᓧʑIᙵ܆MPio k\)m@`YVf?.ye#EeUE;3U53apQsGMVn:qkTjoW&EHē7gQ\5o $f3]I)n:# +^t"(2ie{Cw̻GFwv^^!L_-ܼF׺<;uUW2A1G)_"6G3a6KUSWC=ASǫ/sIjݸ1*?IxzOUnۅqZgmRz=v[ՋXոְ.s钋Gۖ**ruckfT5ځ*KmZ;ON}Z&\G9?klxQRV?*%L}A:УU|JVڥcDg-*oVRijAVZnC1;u0#[TSPIi~z'kڇJ`tf̉ͨSz]OO% J5`~&qF۶ʊJflJɤЫR ǡNGj]pdpug'T lS":0v.]Cu N!!@"p}B68XdP%~&H00/7ɢfoMx[[eқ>00/wZ4mKIY?N endstream endobj 92 0 obj 7590 endobj 84 0 obj << /Length 93 0 R /Type /XObject /Subtype /Image /Width 662 /Height 90 /ColorSpace 91 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xyLK$$| !xc>WG^ШqK \ 2*" xTFAeYi]MPO<~S# 4VǭKђo}ӹ? |.iTߜ_'*@ʈF9~)f98Sj``W?$,T!_p"$]`4^ ǟ~-BH~|k{6(P;+0sI#9&:84cVptBA|̉ k-Ri.\()뻏xC[fI&Ճ* L+#aةArNwF @k gʋRAEF\jMt&\6ڟ,67q3'IIZ$NjZ~$v.\ҙOV $pj{{ȇO9!@K ^+AgYsP4hi!9#a.!9%K\_է66*m |dL#MEz0W~(F@TLHp(P~+ P`<3;%B>,1{~^s@/=],8W^ '-$ *{w ʐ.L>CQU (sJY4Cy-V^vCӓg ub*W@pP2j :EЫc\{'ّnE9w=t% X#$8(Piة<#mgqK|5GM^c`6$tۦĊҘ$U S 9VFdi0 (sLY4CyZdl*. AMAZ8n2Ocn ~>yO ow|b$XۤG 니eP@cds-F͘\NAp/:^%,?˔-^L~Iwuu4Qt`(/`y#,  HpHpb*zTLU5c$ Xz}ӗojP oQY⒴]"83^]kSyvӃFs<7H@  ( .pn5j*iuiA9|I\NuW10],^"'KM<<%ʢ75ƎR_zt_2&Keh_Z|aFo\~p b%?Te:N˦+cO`t>V.+~f$};55 &ǢM/n^ +xep^UD <2s{džY-4Z9$B21HpH9u/ y<QO KI9%yie<#7%`Gi))9E=Nf&F)X" "y\0H{+xa񪀁~Um7>\9՞f떟y?E;l<_Llwd  Y7BF%:e..N% %{#H%)4Ħ#x@C/Z'5y9'-9t } v"sQ|1$|s-ܪ&F5zl,jLa]:CeX=g(~rwT H |wp l3h$Za. e"#ؚϷ:.&s#gϧ_`%u$j_\_gcN߿'trjڅԤSGd~^RKl\.RS0INNN9Ǻp1`AV/.mu4#IyZ~_QGϥa7zh0 ?VNNέ;w?wnϿSP,z(]_i?ssKpTsCCIcC7c~Xח'WQѨWvUHHp3os$uG^.<9b>,R.z Һn!=) iEQVT+y|gbn~^nNn^~~6;y*bAJoz|?`98vfNzu8xYKv_ُ,z9+ngyN!Q;W 0f9N:'lius44jRP(F -3#{ٚq&&&ޜ3eR-gE1l?Jp%kC&/j*{#U(,>VBL{SI*:Z]5BV#; A(4 j:|U }`ȦXsy%2N&ѧfr祑_05~Ku%+p _ jU?=́SEݎO֣`" $8$8 >;݌a{A˛@M9fNJ"v ><ΖO˽I dd1K8,"ٚʩ8$IC eK{Z}m{%F^?^&rd%F٫> +!O8j:Xm0UQܲܓ=܌Ϸ׍ų o bIpգUQ挴##C+IK E#&HpHop9/WΠ(>fFC `9+CK^Ȟg5,pFt!eɎ[":mB= ~&4aБCic6fBӂ2 +Ɔ[ow@/x!E] gHPu9c 93) ĿV:o]oQ%#LcO!*{2NsD$vR$/-_\iRO!vMO}H\K߹ϙdGd(#ݖB+:1z: xfGvV^r܊xmy$'8|Ÿp&GѶۻ*X;4MBv<>pGΞ%z[ S^^4QTrv9ة!oZ gҤXA窧}!%U|7רxϓk$oPx)2Z:o<t^Jtә&.z'~P ppHߨFq7VXqJulE|ooq40;;my0uϷwR:9?#KV`6 !!!!M#k8 I2&qLU;B4ʜWPp2Kt\ {f@pfYm"ƢlHY^jJ.ps4sY6GkX/SR՞CȵqFluuG.fҲ&7(J+k L?S'og`l{ n^)]o-_qɾHdje?RCspa8TJ!Qy=xDz=8~|MY4;TlB 6!:nMYF "'`F1;v7_+kHN\ral.n`QrzwP F8aMy*g@@`D߸?CCR{%^> ٸy93:+lWP=1eKmݘk| 㔔>\BonPg #l9r&.~Ox:&Ww**0& !zuV:ښ ajMx1.,.^pԖ D`pԊ\g8N訸AxŪgO*? Oȟ9գ:R*^! qۺox #62s*ʊx܏8SP^sd&:؟l#x|&8 $ԟjkkښ靈YY1O=ffNo_U7oE*vB=*9 ɺӌ  aO0$" x ̭HLSpL|tKgkN>=[xa{{eZN'ƇyMUU=Q0ڐ4W75lmբKx|Ģ!4.ŝ`ߛ^#ܛ&8|lS`ƙ#[Lqal|CCCMNӺA\s1 _  >Gs |Әal\{,],lgE=@ϟRݙU= q s>7$e2?H[R#H8ÞIpHpkgsmպ=÷/X?:: xMЄx.rۄstr cV$8(1w( ? !q%* @wm=@CG WACCC (P@ $8$8$8$8$8(P-eHpHpHp(PG;L(#x@CCCe>ܱ0y.P@w,>b!a{y=IZ固A5k'#9\/u֔?+˽yfNN^ѣ/R*ۄF,~rT&k}Az}Oާ{栤Va{p8H (VӅ.b៶k *rC[%= >,0?ö $SOyw;rP?HV|Ƿ[ck_j$ ݗu*a7 )e?IՕ յc'guc7]VI0êwӴj*.p89ۡ"qmweWh~^UϕK6'^qѶ]wۜ P5vԮ#ccb1O}[.M߻xj3]Qe˻i+v({Z\tut [}CnMFGMF tJTjil$邯(P@YG&)wd4zunҪUJR5q$voD=+[F'3k9bUt?y?H ^jXP};%e2uXWV4 ƙ(+Sk,hR l[ׄoBsOp  ;\]Eb4Y,dӋvrFe@C"5M18cJ Qm ZA^it[z{-pBvr^]p_wDQ,O~Ue3peʕ+C}BPp@?丹Έ" YGdf~:V,woyYptҭֿM:`MY#$8$8$8$_%/dϳV%-x ӹަ}fe5B 9Dp<$-"8~tcEUܡѣXL8M8C/GP lkE'|72AБ`v {*H#FЕf9W6eQlir5ҍ%kDzFppڋyMW]U =ٲILɯc7ag5w#uK<(UUn3GO*i]F }$ė*5ܕ}lXBQ ʺ{؜ՖPC3Dg^. ǂcao#jv=Gk\g˄ abP!`H*{b\*3.aw'69NLGSy-X@^lˍMX.|)&qNMpYf(~ +Ub=o/>'LU&.#p;c&8qjvɟԑτ,~MVy>_A=gUR7|[ _8^UoOp2Aa9_;h ɿw.;yo)(,̿uMB(cSyWpzd݉|Ia9U kMHNMp!-C{SX/$ɪAC&y!;J獗)3kS4+d:wo˗.NE^%9":(U n1Lк,[~W>sx ['RFwdCXF*-ᡖ2\}:l#'ys!\}Yu&܊^AݑDY˾cլJ]z蹁r Fu |Tմ kUj-]*E$  M]$xomvJMTbH`{*_RU4⬚.pia'^,B5y S,EGǛ2[9J[I=s*vdžpb6kWQU D/q?Zn~ |ޕߑ^dTJbHlD[ _]o_ڳ ~qԄڃ9$8$/ c+\m%k{q 9CA?E=l^軌B tVM਩ aW&9 Qlx!3dupFEΨUOY ~O+q(ЃmoX͗n&>mmF=,w2Q7#|Wd%/,OC\VojvËl\Ǩcgwa5>u5J&Bo@TmLoT⪋ -[3/7okN 95uTQbD?* mz{|U ^'+=Lݷ|RחAֹ&EejZnn$]ϡZzކEpIUx<>n;O۾5 VفKmoJ NZ ڂ^Lz;oI na[v4K)*Yw mj3}Pv6ʆթQq)p8\wٺ5-:~$D:rS})gx!v>(e|CK_*3(;f8r) ]OOPƏ>u5z%t9E[I#hcGhK)>⬞96dP|:KQUCPb1BM0^vR'(vilL=lmi2s*An:Խσ0d-<  _{b|?-eUD̐R $N~W$GE781M7LAkݛkɑ˩:=gtnڣ#߅*]f/N`hb$c}Anق/§)xuj3ёD Ǘ-5rPJ7\ fװ9́MBu,N%ȴ-wʋzUW&VK cwQ <[f0 M|xXT\DS#65FH^ kq΁ S:^.!ZPE܏1פ;!.4,$8$$*sF<^ [8wGQf [uow7}1puy|:ZӕaϹn * 5-> kH W }JMA:G9kԁIVTcѓ+[SFTήZ\5It C:_#_Xo]VU+|<ݗz9(Z_WxoZO3iu(4HZssяޞ|uŽB'Zkhx 塡 {oУ;uY7pB%3%gϓM'in/MbíȲ:Ւ u]iZK'|-DV F56'^Pdž;?p ME}5cO)5=g T0hLX43]W;hnOgԒ5Ρ٨jYd?o4B1gu+y ʎӾӽZ Q]ǥ|2ChO 3:2_R [Bfu*&La|'&m5cGS;eY).Yȡh"@H|g9` vvOxp"9+Ё _RagGi'}j1WךT3g}^\,>P;^7EfafRi͢үm0N踑 6W5(slJlW%:޾<ʕ/)e&Ы(QJʯ RʭR]GtLrBvU Tǻke|ZZC>$nV~%Oyu;}Rk}/Ot/<5]izDUTorr5"xSūӫ9_o 8EZUZzwRNN?}kKHo ]i]B+:5 k<) -}Ҙv@ u^y6iKpL:F)i*_MxDe[O=ld{ΘV}CZI1;o9@1?樮nt>[o#StV ]i-Y0Uw4G r!&J eG9,N$VoK+}QZ߫@'$U/^em<)Sw~mD'zj+vU(Bpi 6#٤o nZsv5*=ŒK} ]u-j4P^=upH\`}YLeV'!KaVF _Toy NR)3]!O`>V.t57[?H~'z¾_ D,֔1tBVu 4I0%UU{┽^鯗R5Qnu..EY:/ua)s7Kӂ\9N$q+ gq9#KGkk[WO+ H/cׯ֮vW܉@Y:l o?e9Ҩγ nR "X,̉&B, ";;( `A!҇ _<萀/EB>_(50RI9%yieds%rr_y= l?\h;LpӫCNGX#`vkʹ\ju Cz$hFْ2 qH@Cb)g+' [!g|NSՂ34Snh/^7L\~ s* 3#jW]g#sLb*5dypHp(p\05oSR Wgԡ6,DM+uW6*NOnZ ~xZ*2(\K/BX`ziJ?\$<6stxHo } CCCu}Eԗ7j? $l\ݲَ"p@c#ꪜVŷoc0u{mi٬C5e?ua@8$HqxO י}ӼioUo[C٤K7<9dW<=++RDx!BC:Ͽ+,BC_(]+na{O w77gٖ 8?vw:(.$8$8$%2Jj' ; #x+3Tc /~E7&i#A rBn;|''N>&"\Jrr 7+v<#@<;豓ql8u7c?qXi=v BL7VwSs\2+5-B*+)vK/z79{>5==+#Qr:tf;@C\t?IpiGŵ Ȋ̜[oe$SA(o_۫؇ImtCaC>qOnoN"=v$R|6NIN:{|cy~R{xhc\ױASѸQ (~P@Xm|> stream xiLYS?p31/K4:qnFeaD@YPiБADADh6dnF酦7VSU]㫎>:TtN} S#n)!4)d?8:#hWbpm]5#4nxY oѣ74lČ^:nt`p08m~'{V֪#*q37si70ߵR3 |ns?OlnK/oHG@̈́Z#Z6)PË5VENPw.708I`0Iyu`f}bAuo.& N0 1}/^^ 0?`pTW ؇(}D -3CYF&&xQ̑3Šr4s(>x