digitalmars.D.announce - optparse.d -- good enough to be std.optparse?
- derick_eddington nospam.yashmoo.com (730/730) May 30 2005 I've made a command-line option helper similar to Python's optparse. It...
- derick_eddington nospam.yashmoo.com (3/18) May 30 2005 Arg, forgot to : these. The help print is nicely formatted...
- Kris (9/145) May 30 2005 Very useful. I'd like to add this to Mango, if that would be OK?
- derick_eddington nospam.yashmoo.com (2/17) May 30 2005
- kris (2/3) May 30 2005 Excellent ~ thx!
- James Dunne (4/7) May 31 2005 Regards,
- derick_eddington nospam.yashmoo.com (737/737) Jun 01 2005 I've updated optparse.d:
- Andrew Fedoniouk (13/155) May 31 2005 Cool, Derick!
- derick_eddington nospam.yashmoo.com (11/22) Jun 01 2005 If it could be setup statically at compile-time and have the same concis...
- Andrew Fedoniouk (7/45) Jun 01 2005 Yep. You are right. I was thinking about simple
I've made a command-line option helper similar to Python's optparse. It allows you to specify what D-type you want the option as, short name, long name, help, and more. It automatically creates a formatted help message and prints it on errors. It checks that clients' usage of the module is proper; and it checks that the command-line arguments meet what was specified. It has a compehensive unittest that demonstrates more. The source is attached. : /** : * Example usage: : */ : int main (char[][] args) : { : int verbosity; : char[] outfile; : char[][] files; : : // Constructor parameters are used in printing help. : // -h / --help is always added by default : // and uses program-name and usage. : // --version (no short name) is added by : // default if version is given. : // program-name : OptionParser op = new OptionParser(__FILE__[0..$-2], : // usage version : "[options] --files=f1,fN [outfile]", "0.2"); : : // int, short and long, help, metavar, : // no default, not mandatory : op.addOption!(int)("v", "verbose", : "Be more and more and more and more and more " : "and more and more verbose.", "LEVEL"); : // comma-separated string list, short and long, help, : // metavar, no default, mandatory : op.addOption!(char[][])("fs", "files", : "Files to process, and make this a really long help " : "string as well to test aligning.", "FILE,FILE,...", : null, true); : // float, long-only, help, metavar, default, not mandatory : op.addOption!(float)(null, "thing", "Do it with this.", : "FLOAT", -4.297e21f); : // no-value, short-only, with help, no metavar, : // no default, not mandatory : op.addOption!()("a", null, "Use alternate method."); : : // Parse command-line arguments, including args[0] : // program-name (it's skipped). : // args will be reset to the remaining non-option : // command-line arguments in the order they appeared. : Options options = op.parse(args); : : // Check if option was given on the command-line : // by using (char[] in Options). : // If the option has both short and long names, : // either can be used. : if ("verbose" in options) : // If option was given and it has a value, : // retrieve it by indexing Options with short : // or long name (or only one if only one) : // and do getValue!(T) : verbosity = options["verbose"].getValue!(int); : : if (verbosity > 0) : writefln("I'll say a little."); : if (verbosity > 1) : writefln("I'll say a lot more."); : : // args was reset by parse to the remaining : // non-option command-line arguments : if (args.length == 1) : // use the first non-option argument : outfile = args[0]; : else if (args.length > 1) : // OptionError.errorExit("message") can be used to : // print help and exit process; : // useful when checking non-option arguments : op.errorExit("more than one output file specified"); : : // mandatory options can be assumed to be : // there after successful parse : assert ("files" in options); : files = options["files"].getValue!(char[][]); : if (files.length == 0) : op.errorExit("need to specifiy at least one input file"); : : if (verbosity > 0) : { : if ("thing" in options) : writefln("my thing is: ", : options["thing"].getValue!(float)); : : // no-value options are simply tested for being in Options : if ("a" in options) : writefln("I would process files using alternate method:"); : else : writefln("I would process files using normal method:"); : foreach (char[] f; files) : writefln("\t",f); : writefln("and output to ", : outfile.length ? outfile : "<stdout>"); : } : : return 0; : } Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method. --------------------------------------------------------------- $ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a outputfile I'll say a little. I'll say a lot more. my thing is: -4.23e-06 I would process files using alternate method: somefile anotherfile nextfile and output to outputfile --------------------------------------------------------------- $ ./example --asdf optparse: error: no such option: --asdf [help] --------------------------------------------------------------- $ ./example optparse: error: -fs / --files option is mandatory [help] begin 0644 optparse.d M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ* T*("H 0GD 1&5R:6-K($5D9&EN9W1O;BX 4&QA8V5D(&EN('1H M92!P=6)L:6, 9&]M86EN+B` ("` ("` ("` ("` ("` ("` ("` ("H-"B`J M($EN<W!I<F5D(&)Y(%!Y=&AO;B=S(&]P='!A<G-E+B` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` * T*("H 4V5E(&)O='1O;2!O9B!T:&ES(&9I M;&4 9F]R(&5X86UP;&4 =7-A9V4N("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("H-"B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ+PT* M=&0N<W1D87)G+`T*("` ("` ("` ("` ("` <W1D+G-T9&EO+`T*("` ("` M97,-"GL-" E.;U9A;'5E+`T*"4EN="P-" E);G1!<G)A>2P-"B\K('5I;G0 M:7, 8V%U<VEN9R!S;VUE($1-1"!B=6<N+BX-" E526YT+`T*"55);G1!<G)A M:69T>7!E("A4(#H :6YT*2` ("` ("![(')E='5R;B!3=7!P;W)T9614>7!E M<RY);G0[('T-" D)96QS92!I9G1Y<&4 *%0 .B!I;G1;72D ("` ('L <F5T M="D ("` ("` >R!R971U<FX 4W5P<&]R=&5D5'EP97,N54EN=#L ?0T*"0EE M;'-E(&EF='EP92`H5"`Z('5I;G1;72D ("` ('L <F5T=7)N(%-U<'!O<G1E M"65L<V4 :69T>7!E("A4(#H ;&]N9UM=*2` ("` >R!R971U<FX 4W5P<&]R M"65L<V4 :69T>7!E("A4(#H =6QO;F=;72D ("` ('L <F5T=7)N(%-U<'!O M<G1E9%1Y<&5S+E5,;VYG07)R87D[('TK+PT*"0EE;'-E(&EF='EP92`H5"`Z M(&9L;V%T*2` ("` >R!R971U<FX 4W5P<&]R=&5D5'EP97,N1FQO870[('T- M" D)96QS92!I9G1Y<&4 *%0 .B!F;&]A=%M=*2` ('L <F5T=7)N(%-U<'!O M<G1E9%1Y<&5S+D9L;V%T07)R87D[('T-"B\K"0EE;'-E(&EF='EP92`H5"`Z M(&1O=6)L92D ("` ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O=6)L93L M?0T*"0EE;'-E(&EF='EP92`H5"`Z(&1O=6)L95M=*2` ('L <F5T=7)N(%-U M<'!O<G1E9%1Y<&5S+D1O=6)L94%R<F%Y.R!]*R\-" D)96QS92!I9G1Y<&4 M*%0 .B!C:&%R6UTI("` ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+E-T<FEN M9SL ?0T*"0EE;'-E(&EF='EP92`H5"`Z(&-H87);75M=*2` >R!R971U<FX M4W5P<&]R=&5D5'EP97,N4W1R:6YG07)R87D[('T-" D)96QS92![('1H<F]W M="!C;V1E(&%T=&5M<'1I;F<-"B`J('1O('5S92!U;G-U<'!O<G1E9"!T>7!E M:79A=&4 8VQA<W, 56Y3=7!P;W)T9614>7!E17)R;W( .B!%<G)O< T*>PT* M("H 17)R;W)S('=I=& ;W!T<&%R<V4 ;6]D=6QE('5S86=E+B!0<F]P;V=A M(#H 17)R;W(-"GL-" ET:&ES("AC:&%R6UT ;7-G*2` >R!S=7!E<BAM<V<I M;W!T:6]N<RX 0V%U<V5S(&UE<W-A9V4 =&\ 8F4 <')I;G1E9`T*("H 86YD M('!R;V=R86T 97AI=&5D+B` 1&]E<R!N;W0 <')O<&]G871E(&]U="!O9B!M M< T*>PT*"71H:7, *&-H87);72!M<V<I("![('-U<&5R*&US9RD[('T-"GT- M0V]N<W1R=6-T(&ET('=I=& >6]U<B!P<F]G<F%M)W, ;F%M90T*("H 86YD M(&]P=&EO;F%L;'D 82!U<V%G92!M97-S86=E(&%N9"!V97)S:6]N('-T<FEN M;E!A<G-E< T*>PT*"7!R:79A=&4 8VAA<EM=('!R;V=.86UE+"!U<V%G92P M=F5R.PT*"7!R:79A=&4 0F%S94]P=&EO;EM=(&9I;F1/<'1I;VYS.PT*"7!R M8VAA<EM=('!R;V=.86UE+"!C:&%R6UT =7-A9V4 /2!N=6QL+"!C:&%R6UT M=F5R(#T M" D)=&AI<RYU<V%G92`]('5S86=E.PT*"0ET:&ES+G9E<B`]('9E<CL-" D) M861D3W!T:6]N(2 I*")H(BP (FAE;'`B+"`B4VAO=R!T:&ES(&AE;'` ;65S M<'1I;VXA*"DH;G5L;"P (G9E<G-I;VXB+"`B4VAO=R!P<F]G<F%M)W, =F5R M('=I=&AO=70 82!T>7!E(&9O<B!A(&YO+79A;'5E+W1O9V=L92!O<'1I;VX[ M(&]R('5S92!W:71H(&]N92!O9B!T:&4-" D *B!S=7!P;W)T960 ='EP97, M=&\ <F5T<FEE=F4 =&AE(&]P=&EO;B=S('9A;'5E(&%S('1H870 1"UT>7!E M<W!E8VEF:65D+"!O<B!B;W1H+B` :&5L<"!I<R!T:&4 :&5L<"!M97-S86=E M;2=S(&AE;'` :7, <')I;G1E9"X (&UE=&%687( :7,-" D *B!A(&1E<V-I M<'1I=F4 ;F%M92!F;W( =&AE(&]P=&EO;B=S('9A;'5E('5S960 :6X <')I M;G1I;F< ;W!T:6]N<R!W:71H('9A;'5E<RX-" D *B!4:&4 =F%R87)G<R!I M<R!T;R!A;&QO=R`G5"!D969A=6QT5F%L=64G(&%N9"`G8F]O;"!M86YD871O M(&1E9F%U;'0 =F%L=64 9F]R(&]P=&EO;G, =VET:"!V86QU97, 86YD(&UA M:V4 =&AA=`T*"2`J(&]P=&EO;B!A;'=A>7, 9F]U;F0 =VET:"!T:&%T('9A M;'5E(&)Y(&1E9F%U;'0N("!M86YD871O<GD <W!E8VEF:65S('=H971H97(- M" D *B!T:&4 ;W!T:6]N(&UU<W0 8F4 9VEV96X ;VX =&AE(&-O;6UA;F0M M;&EN92X ($EF(&)O=& 9&5F875L=%9A;'5E(&%N9`T*"2`J(&%N9"!M86YD M871O<GD 87)E(&=I=F5N+"!M86YD871O<GD =VEL;"!H879E(&YO(&5F9F5C M="X ($EF(&1E9F%U;'1686QU92!I<PT*"2`J(&YU;&PL(&ET(&UE86YS(&YO M(&1E9F%U;'0 =F%L=64N("!D969A=6QT5F%L=64 ;75S="!B92!N=6QL(&9O M<B!N;RUV86QU90T*"2`J(&]P=&EO;G, =&AA="!N965D('1O('-P96-I9FEY M(&UA;F1A=&]R>2X-" D *B\-" ET96UP;&%T92!A9&1/<'1I;VX *%0 /2!. M;U9A;'5E*0T*"7L-" EV;VED(&%D9$]P=&EO;B`H8VAA<EM=('-H;W)T3F%M M92P 8VAA<EM=(&QO;F=.86UE(#T ;G5L;"P 8VAA<EM=(&AE;'` /2!N=6QL M="`H<VAO<G1.86UE+FQE;F=T:"!\?"!L;VYG3F%M92YL96YG=& I.PT*"0EA M<W-E<G0 *%]A<F=U;65N=',N;&5N9W1H(#P M" D)9F]R96%C:"`H0F%S94]P=&EO;B!O.R!F:6YD3W!T:6]N<RD >PT*"0D) M:68 *'-H;W)T3F%M92YL96YG=& )B8 <VAO<G1.86UE(#T](&\N<VAO<G1. M86UE*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*")C;VYF;&EC=&EN M9R!O<'1I;VXZ("TB('X <VAO<G1.86UE*3L-" D)"6EF("AL;VYG3F%M92YL M96YG=& )B8 ;&]N9TYA;64 /3T ;RYL;VYG3F%M92D-" D)"0ET:')O=R!N M97< 3W!T4&%R<V5%<G)O<B B8V]N9FQI8W1I;F< ;W!T:6]N.B`M+2( ?B!L M<'1I;VXA*%0I*'-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE=&%687(I M"0DO+R!N965D960 =&\ 861V86YC92!?87)G<'1R(&)E8V%U<V4 ;6%N9&%T M('9A7V%R9R$H='EP96]F*&YU;&PI*2A?87)G<'1R*3L-" D)"0EI9B`H7V%R M9W5M96YT<ULP72`A/2!T>7!E:60H='EP96]F*&YU;&PI*2!\?"!I9VYO<F4 M(3T ;G5L;"D-" D)"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T M*"(E<R!O<'1I;VX :&%S(&YO('9A;'5E+"!D969A=6QT('9A;'5E(&UU<W0 M8F4 ;G5L;"!W:&5N('-P96-I9FEY:6YG(&UA;F1A=&]R>2(L(&]P=&EO;BDI M=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX :&%S M(&YO('9A;'5E+"!S;R!N;R!D969A=6QT('9A;'5E(&-A;B!B92!S<&5C:69I M960B+"!O<'1I;VXI*3L-" D)?0T*"0EE;'-E('L-" D)"6EF("A?87)G=6UE M;G1S+FQE;F=T:"D >PT*"0D)"6EF("A?87)G=6UE;G1S6S!=("$]('1Y<&5I M('1Y<&5I9"A4*2D-" D)"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*&9O M<FUA=" B)7, ;W!T:6]N)W, 9&5F875L="!V86QU92!N;W0 ='EP92`E<RP M:7, ='EP92`E<R(L(&]P=&EO;BP ='EP96ED*%0I+"!?87)G=6UE;G1S6S!= M9F%U;'1686QU94]P=&EO;G-;;W!T:6]N+G-H;W)T3F%M95T /2!O<'1I;VX[ M875L=%9A;'5E3W!T:6]N<UMO<'1I;VXN;&]N9TYA;65=(#T ;W!T:6]N.PT* M"0D)"0DO+V1E8G5G('=R:71E9FQN*")<=&1E9F%U;'0 =F%L=64 /2`E<R(L M=',N;&5N9W1H(#X ,2D >PT*"0D)"0DO+R!N965D960 =&\ 861V86YC92!? M87)G<'1R(&EN8V%S92!M86YD871O<GD :7, ;F5X="!V87)A<F<-" D)"0D) M='EP96]F*&YU;&PI(&EG;F]R92`]('9A7V%R9R$H='EP96]F*&YU;&PI*2A? M;&5N9W1H(#X ,2D >PT*"0D):68 *%]A<F=U;65N='-;,5T (3T ='EP96ED M*&)O;VPI*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R*&9O<FUA=" B M)7, ;W!T:6]N(&UA;F1A=&]R>2!M=7-T(&)E('1Y<&4 )7,B+"!O<'1I;VXL M('1Y<&5I9"AB;V]L*2DI.PT*"0D);W!T:6]N+FUA;F1A=&]R>2`]('9A7V%R M" D *B!087)S92!C;VUM86YD+6QI;F4 87)G=6UE;G1S+B!A<F=S6S!=(&ES M(&%S<W5M960 =&\ 8F4 =&AE('!R;V=R86TM;F%M90T*"2`J(&%N9"!I<R!S M:VEP<&5D+B` 0VAE8VMS(&%R9W, ;65E=', =&AE('-P96-I9FEE9"!O<'1I M;VYS+B` 87)G<R!I<R!R97-E=`T*"2`J('1O(&)E(&%N(&%R<F%Y(&]F(&%L M;"!N;VXM;W!T:6]N(&%R9W5M96YT<R`H=&AO<V4 =&AA="!D;R!N;W0 <W1A M<G0 =VET:`T*"2`J("<M)R!A;F0 9&\ ;F]T(&9O;&QO=R!A('9A;'5E+71A M:7, =7-E9"!T:'5S('1O(&-H96-K(&9O<B!F;W5N9"!O<'1I;VYS.B`H(F]P M=&YA;64B(&EN(&]P=&EO;G,I.R!A;F0-" D *B!U<V5D('1H=7, =&\ <F5T M<FEE=F4 ;W!T:6]N('9A;'5E<SH ;W!T:6]N<ULB;W!T;F%M92)=+F=E=%9A M;'5E(2A4*2X-" D *B\-" E/<'1I;VYS('!A<G-E("AI;F]U="!C:&%R6UU; M"6)O9'D >PT*"0ED96)U9R!W<FET969L;B B)7,N<&%R<V4H87)G<RYL96YG M;F1/<'1I;VYS.PT*"0DO+R!C;W!Y(&1E9F%U;'1686QU94]P=&EO;G, :6YT M"69O<F5A8V *&-H87);72!O<'1S=')I;F<L($)A<V5/<'1I;VX ;SL 9&5F M875L=%9A;'5E3W!T:6]N<RD-" D)"69O=6YD3W!T:6]N<UMO<'1S=')I;F== M(#T ;SL-" D)8VAA<EM=6T)A<V5/<'1I;VY=(&]P='-686QS.PT*"0EC:&%R M('1H870 87)E(&]P=&EO;G,L(&%N9"!G970 =&AE:7( =F%L=64 <W1R:6YG M<R!I9B!T:&5Y(')E<75I<F4 =&AE;2X-" D)+R\ 268 :70G<R!N;W0 86X M;W!T:6]N+"!A9&0 :70 =&\ ;&5F=&]V97)!<F=S+ T*"0DO+R!.3U1%.B!A M<F=S6S!=(&ES('-K:7!P960 87, :70G<R!A<W-U;65D('1O(&)E('!R;V=R M86T ;F%M90T*"0EF;W( *'-I>F5?="!I(#T ,3L :2`\(&%R9W,N;&5N9W1H M"2\O(&ET)W, 82!L;VYG(&]P=&EO; T*"0D)"0ED96)U9R!W<FET969L;B B M8V *$)A<V5/<'1I;VX ;SL 9FEN9$]P=&EO;G,I('L-" D)"0D)"6EF("AO M+FQO;F=.86UE+FQE;F=T:"` )B8 (&$N9FEN9"AO+FQO;F=.86UE*2`]/2`R M?'P *&$N;&5N9W1H+3( /B!O+FQO;F=.86UE+FQE;F=T:"`F)B!A6S(K;RYL M;VYG3F%M92YL96YG=&A=(#T]("<])RDI*0T*"0D)"0D)>PT*"0D)"0D)"2\O M(&=I=F5N(&]P=&EO;B!I<R!O;F4 =V4G<F4 ;&]O:VEN9R!F;W(-" D)"0D) M("AO+G1Y<&4 (3T 4W5P<&]R=&5D5'EP97,N3F]686QU92D >PT*"0D)"0D) M(#X ;RYL;VYG3F%M92YL96YG=& I('L-" D)"0D)"0D)"2\O(&]P=&EO;B=S M('9A;'5E(&ES(&-O;F-A=&5N871E9"!W:71H(&]P=&EO;CT-" D)"0D)"0D) M"6%S<V5R="`H85LR*V\N;&]N9TYA;64N;&5N9W1H72`]/2`G/2<I.PT*"0D) M"0D)"0D);W8 /2!A6S(K;RYL;VYG3F%M92YL96YG=& K,2`N+B`D73L-" D) M"0D)"0D)?0T*"0D)"0D)"0EE;'-E('L-" D)"0D)"0D)"2\O(&]P=&EO;B=S M('9A;'5E('-H;W5L9"!B92!N97AT(&EN(&%R9W,-" D)"0D)"0D)"6EF("AI M(#T M;D5R<F]R*&9O<FUA=" B+2TE<R!O<'1I;VX <F5Q=6ER97, 82!V86QU92(L M(&\N;&]N9TYA;64I*3L-" D)"0D)"0D)"6]V(#T 87)G<ULK*VE=.PT*"0D) M;UT /2!O=CL-" D)"0D)"0EB<F5A:SL ("\O(&9O=6YD('-O('-K:7` =&AE M(')E<W0 ;V8 ;W!T:6]N<R!W92=R92!L;V]K:6YG(&9O< T*"0D)"7T)?0E] M8G5G('=R:71E9FQN*")<='!R;V-E<W-I;F< <VAO<G0M;W!T:6]N("5S(BP M('L-" D)"0D)"6EF("AO+G-H;W)T3F%M92YL96YG=& ("8F("!A+F9I;F0H M;RYS:&]R=$YA;64I(#T M.PT*"0D)"0D)"6-H87);72!O=CL-" D)"0D)"0EI9B`H;RYT>7!E("$](%-U M<'!O<G1E9%1Y<&5S+DYO5F%L=64I('L-" D)"0D)"0D)+R\ 9V5T(&]P=&EO M;B=S(&%R9PT*"0D)"0D)"0EI9B`H82YL96YG=& M,2`^(&\N<VAO<G1.86UE M+FQE;F=T:"D >PT*"0D)"0D)"0D)+R\ ;W!T:6]N)W, =F%L=64 :7, 8V]N M"0D)"0D)"0D)"71H<F]W(&YE=R!/<'1I;VY%<G)O<BAF;W)M870H(BTE<R!O M"0D)"0EO=B`](&%R9W-;*RMI73L-" D)"0D)"0D)?0T*"0D)"0D)"7T-" D) M"0D)"0EE;'-E(&EF("AA+FQE;F=T:"TQ(#X ;RYS:&]R=$YA;64N;&5N9W1H M"6)R96%K.PT*"0D)"0D)"7T-" D)"0D)"0DO+R!E;'-E(&]P=&EO;B!R97%U M:7)E<R!N;R!V86QU92!A;F0 ;V$ :7, ;G5L;`T*"0D)"0D)"6]P='-686QS M6V]=(#T M92!R97-T(&]F(&]P=&EO;G, =V4G<F4 ;&]O:VEN9R!F;W(-" D)"0E]"7T) M<B B;F\ <W5C:"!O<'1I;VXZ("( ?B!A*3L-" D)"7T-" D)"65L<V4 >PT* M"0D)"61E8G5G('=R:71E9FQN*")<=&QE9G0M;W9E<B!A<F=U;65N="`B+"!A M($-H96-K('1H92!F;W5N9"!O<'1I;VYS(&%N9"!P87)S92!A;F0 8VAE8VL M7'1F;W5N9"!O<'1I;VX )7, =VET:"!V86QU92US=')I;F< /2!<(B5S7"(B M+"!O+"!V*3L-" T*"0D):68 *&\N<VAO<G1.86UE+FQE;F=T:"D-" D)"0EF M;W5N9$]P=&EO;G-;;RYS:&]R=$YA;65=(#T ;SL-" D)"6EF("AO+FQO;F=. M86UE+FQE;F=T:"D-" D)"0EF;W5N9$]P=&EO;G-;;RYL;VYG3F%M95T /2!O M"0D)8V%S92!3=7!P;W)T9614>7!E<RY.;U9A;'5E. T*"0D)"0D)87-S97)T M("AV(&ES(&YU;&PI.PT*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O M<'1I;VXZ(&AA<R!N;R!V86QU92!T;R!P87)S92(L(&\I.PT*"0D)"0D)8G)E M=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S M(&EN="(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AI;G0I*6\I+G9A M;'5E(#T M;W)T9614>7!E<RY);G1!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")< M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!I;G1;72(L(&\L('8I M.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AI;G1;72DI;RDN=F%L=64 /2!P87)S M969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6EN="(L M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AU:6YT*2EO*2YV86QU92`] M('1O56EN="AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E M9%1Y<&5S+E5);G1!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT M)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!U:6YT6UTB+"!O+"!V*3L- M" D)"0D)"2AC87-T*$]P=&EO;B$H=6EN=%M=*2EO*2YV86QU92`]('!A<G-E M07)R87DA*'5I;G0I*'8L("9T;U5I;G0I.PT*"0D)"0D)8G)E86L[*R\-"B\K M<FET969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, ;&]N M9R(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AL;VYG*2EO*2YV86QU M92`]('1O3&]N9RAV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O M<G1E9%1Y<&5S+DQO;F=!<G)A>3H-" D)"0D)"61E8G5G('=R:71E9FQN*")< M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!L;VYG6UTB+"!O+"!V M*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H;&]N9UM=*2EO*2YV86QU92`]('!A M<FET969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6QO M;F<B+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H=6QO;F<I*6\I+G9A M;'5E(#T =&]5;&]N9RAV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U M;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, =6QO;F=;72(L M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AU;&]N9UM=*2EO*2YV86QU M<F5A:SLK+PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+D9L;V%T. T*"0D) M"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E M"0D)8V%S92!3=7!P;W)T9614>7!E<RY&;&]A=$%R<F%Y. T*"0D)"0D)9&5B M=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S M(&9L;V%T6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO;B$H9FQO871; M72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AF;&]A="DH=BP )G1O1FQO870I M="A/<'1I;VXA*&1O=6)L92DI;RDN=F%L=64 /2!T;T1O=6)L92AV*3L-" D) M"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+D1O=6)L94%R M<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A M="A/<'1I;VXA*&1O=6)L95M=*2EO*2YV86QU92`]('!A<G-E07)R87DA*&1O M<V4 4W5P<&]R=&5D5'EP97,N4W1R:6YG. T*"0D)"0D)9&5B=6< =W)I=&5F M;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&-H87);72(L M(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AC:&%R6UTI*6\I+G9A;'5E M(#T =CL-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S M+E-T<FEN9T%R<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O M"0D)"0DH8V%S="A/<'1I;VXA*&-H87);75M=*2EO*2YV86QU92`]('!A<G-E M07)R87DA*&-H87);72DH=BP 9G5N8W1I;VX 8VAA<EM=("AC:&%R6UT =G,I M"0EC871C:"`H17)R;W( 92D-" D)"0ET:')O=R!N97< 3W!T:6]N17)R;W(H M9F]R;6%T*"(E<R!O<'1I;VX 97)R;W( <&%R<VEN9R!V86QU92US=')I;F< M*")H96QP(B!I;B!F;W5N9$]P=&EO;G,I('L-" D)"7!R:6YT2&5L<" I.PT* M"0D)97AI=" P*3L-" D)?0T*"0EI9B`H(G9E<G-I;VXB(&EN(&9O=6YD3W!T M3W!T:6]N<PT*"0EF;W)E86-H("A"87-E3W!T:6]N(&\[(&9I;F1/<'1I;VYS M"0D)"69O<F5A8V *$)A<V5/<'1I;VX 9F\[(&9O=6YD3W!T:6]N<RD-" D) M*"%F;W5N9"D-" D)"0D)=&AR;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B M" T*"0ED96)U9R!W<FET969L;B B)7,N<&%R<V4H*2!D;VYE+B(L('1H:7,I M.PT*"0EA<F=S(#T ;&5F=&]V97)!<F=S.PT*"0ER971U<FX 9F]U;F1/<'1I M"6-H87);72!A;&EG;D]P=$AE;'!3='( *&-H87);72!H+"!S:7IE7W0 ;VAL M(EQN(CL-" D)"0EC:&%R6UT :6YD96YT(#T M"0D)"6EF("AL:6YE+FQE;F=T:"D-" D)"0D);&EN97, ?CT ;&EN93L-" D) M"0EF;W)E86-H("AC:&%R6UT ;#L M" D):68 *&9I;F1/<'1I;VYS+FQE;F=T:"D-" D)"6AE;'` ?CT (EQN7&YO M<'1I;VYS.EQN(CL-" T*"0EF;W)E86-H("A"87-E3W!T:6]N(&\[(&9I;F1/ M+G-H;W)T3F%M93L-" D)"0EI9B`H;RYM971A5F%R+FQE;F=T:"D-" D)"0D) M;VYG3F%M92YL96YG=& I('L-" D)"0EO<'1(96QP('X]("(M+2( ?B!O+FQO M;F=.86UE.PT*"0D)"6EF("AO+FUE=&%687(N;&5N9W1H*0T*"0D)"0EO<'1( M96QP('X]("(](B!^(&\N;65T859A<CL-" D)"7T-" D)"6EF("AO+FAE;'`N M;&5N9W1H*0T*"0D)"6]P=$AE;'` ?CT 86QI9VY/<'1(96QP4W1R*&\N:&5L M<"P ;W!T2&5L<"YL96YG=& I.PT*"0D):&5L<"!^/2!O<'1(96QP('X (EQN M5F5R<VEO;B`H*0T*"7L-" D)=W)I=&5F;&XH(B5S("5S(BP <')O9TYA;64L M>PT*"0EW<FET969L;B B)7,Z(&5R<F]R.B`E<UQN(BP <')O9TYA;64L(&US M=&4 =&5M<&QA=&4 <&%R<V5!<G)A>2`H5"D >PT*"51;72!P87)S94%R<F%Y M("AC:&%R6UT =G,L(%0 9G5N8W1I;VX *&-H87);72D <&%R<V54*0T*"7L- M" D)9&5B=6< =W)I=&5F;&XH(B5S+G!A<G-E07)R87DA*"5S*2AV<SU<(B5S M7"( <&%R<V54/25S*2(L('1H:7,L('1Y<&5I9"A4*2P =G,L('!A<G-E5"D[ M"69O<F5A8V *&-H87);72!S.R!S<RD-" D)"6EF("AS+FQE;F=T:"D-" D) M("H 26YT96YD960 =&\ 8F4 =7-E9"!S;VUE=&AI;F< ;&EK93H-"B`J(&EF M(" B;W!T:6]N(B!I;B!O<'1I;VYS*0T*("H ("` (%0 8FQA:"`](&]P=&EO M;G-;(F]P=&EO;B)=+F=E=%9A;'5E(2A4*3L-"B`J+PT*='EP961E9B!"87-E M<&QE;65N=', ;65M8F5R<R!C;VUM;VX =&\ 86QL(&]P=&EO;G, 86YD('!R M;W9I9&5S('1E;7!L871E(&9O< T*("H <F5T<FEE=FEN9R!O<'1I;VX =F%L M8W0 8VQA<W, 0F%S94]P=&EO; T*>PT*"6-H87);72!S:&]R=$YA;64L(&QO M;F=.86UE.PT*"6-H87);72!H96QP+"!M971A5F%R.PT*"6)O;VP ;6%N9&%T M;R!?='EP93L-" T*"71H:7, *%-U<'!O<G1E9%1Y<&5S('0L(%1Y<&5);F9O M('1I+"!C:&%R6UT <TYA;64L(&-H87);72!L3F%M92P 8VAA<EM=(& L(&-H M87);72!M5F%R*0T*"6EN('L-" D)87-S97)T("AS3F%M92YL96YG=& ?'P M='EP92`]('1I.PT*"0ES:&]R=$YA;64 /2!S3F%M93L-" D);&]N9TYA;64 M96)U9R!W<FET969L;B B)7,N=&AI<R I(&1O;F4 +2T 7W1Y<&4 /2`E<R(L M*2`M+2!2971U<FYS('1H:7, ;W!T:6]N)W, =F%L=64 87, =&AE(&-O<G)E M8W0 ='EP92X-" D *B` ("` ("` ("` ("` ("` ("!)9B!T:&4 =W)O;F< M='EP92!I<R!A='1E;7!T960L($]P=%!A<G-E17)R;W( :7, =&AR;W=N+ T* M"2`J+PT*"71E;7!L871E(&=E=%9A;'5E("A4*0T*"7L-" E4(&=E=%9A;'5E M*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I M;VX 9&]E<R!N;W0 :&%V92!A('9A;'5E('1O(')E=')I979E(BP =&AI<RDI M=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX ;75S M="!B92!R971R:65V960 87, ='EP92`E<RP ;F]T('1Y<&4 )7,B+"!T:&ES M<BAF;W)M870H(B5S(&]P=&EO;B!C86X ;F]T(&)E(')E=')I979E9"!A<R!U M:&%R6UT ;W!T5&]3=')I;F< *&-H87);72!S:&]R=$YA;64L(&-H87);72!L M;VYG3F%M92D-"GL-" ER971U<FX *'-H;W)T3F%M92YL96YG=& /R`B+2)^ M<VAO<G1.86UE(#H (B(I('X *"AS:&]R=$YA;64N;&5N9W1H("8F(&QO;F=. M86UE+FQE;F=T:"D /R`B("\ (B`Z("(B*2!^("AL;VYG3F%M92YL96YG=& M/R`B+2TB?FQO;F=.86UE(#H M86YD+6QI;F4 ;W!T:6]N+B` 4&%R86UE=&5R:7IE9"!B>2!A('1Y<&4 =&\ M<W!E8VEF:7D 82!V86QU90T*("H :7, 97AP96-T960 86YD('=H870 ='EP M92P ;W( 3F]686QU92!T;R!M96%N('1H92!O<'1I;VX 9&]E<R!N;W0-"B`J M92P 8VAA<EM=(&QO;F=.86UE+"!C:&%R6UT :&5L<"P 8VAA<EM=(&UE=&%6 M5"DL('-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE=&%687(I.PT*"0E] M:')O=R!N97< 3W!T4&%R<V5%<G)O<BAF;W)M870H(B5S(&]P=&EO;B!C86X M;F]T(&)E('5N<W5P<&]R=&5D('1Y<&4 )7,B+"!O<'14;U-T<FEN9RAS:&]R M=$YA;64L;&]N9TYA;64I+"!U<W1E+G1Y<&4I*3L-" D)?0T*"7T-"GT-" T* M=&5S="(L(%]?1DE,15]?*3L-" T*"4]P=&EO;E!A<G-E<B!O<'1I;VY087)S M;VY087)S97(H7U]&24Q%7U];,"XN)"TR72P (EMO<'1I;VX 6W9A;'5E75TB M<BYA9&1/<'1I;VXA*&EN="DH(G B+")X96YO(BPB9&]E<R!T:&ES(&%N9"!T M*&-H87);72DH;G5L;"PB8F%R(BPB;6%K92!I="!H87!P96XB+")"3$]"(BPB M9&5F875L="UV86QU92(I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N(2AI M"6]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-H87);75M=*2 B<V(B+")S:&%B M4&%R<V5R+F%D9$]P=&EO;B$H*2 I.PT*"0ED96)U9R!W<FET969L;B B+2TM M(&YE=R!/<'1I;VY087)S97(G<R!H96QP("TM+2(I.PT*"0ED96)U9R!O<'1I M96YD("TM+2(I.PT*"7T-" T*"6YE=T]P=&EO;E!A<G-E<B I.PT*"6%R9W, M87-D9B(I.PT*"4]P=&EO;G, ;W!T:6]N<R`](&]P=&EO;E!A<G-E<BYP87)S M92AA<F=S*3L-" ES=&%T:6, 8VAA<EM=6UT ;&5F=&]V97( /2!;(FQA;&$B M+")H;VAO(BPB87-D9B)=.PT*"6%S<V5R="`H87)G<R`]/2!L969T;W9E<BD[ M86QU92$H9FQO870I(#T](#DX-RXV-68I.PT*"6%S<V5R="`H(F)A<B( :6X M8VAA<EM=*2`]/2`B8F%R+7-T<FEN9R(I.PT*"6%S<V5R="`H(F%P<&QE(B!I M871I8R!C:&%R6UU;72!S:&%B86YG0T%!(#T 6R)A8F,B+")D(BPB968B+")Z M>GIZ>GHB73L-" EA<W-E<G0 *&]P=&EO;G-;(G-H86)A;F<B72YG971686QU M92$H8VAA<EM=6UTI(#T M*")M>6%P<"`M+79E<F)O<V4 +2UA<'!L93TL(&QA;&$ :&]H;R!A<V1F("TM M=&EO;E!A<G-E<BYP87)S92AA<F=S*3L-" EA<W-E<G0 *&%R9W, /3T ;&5F M("AO<'1I;VYS6R)F(ETN9V5T5F%L=64A*&9L;V%T*2`]/2`M,"XY,S%E+35F M*3L-" EA<W-E<G0 *")A(B!I;B!O<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO M;G-;(F%P<&QE(ETN9V5T5F%L=64A*&EN=%M=*2`]/2!N=6QL*3L-" EA<W-E M<G0 *")S:&%B86YG(B!I;B!O<'1I;VYS*3L-" ES=&%T:6, 8VAA<EM=6UT M<VAA8F%N9T-!03( /2!;(F]N;'E/;F4B73L-" EA<W-E<G0 *&]P=&EO;G-; M" EN97=/<'1I;VY087)S97(H*3L-" EA<F=S(#T <W!L:70H(FUY87!P("TM M("AO<'1I;VYS6R)S8B)=+F=E=%9A;'5E(2AC:&%R6UU;72D /3T <VAA8F%N M9T1F;'0I.PT*"6%S<V5R="`H(G B(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H M;W!T:6]N<ULB>&5N;R)=+F=E=%9A;'5E(2AI;G0I(#T M97)T(" B8F%R(B!I;B!O<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO;G-;(F)A M<B)=+F=E=%9A;'5E(2AC:&%R6UTI(#T M" DO+R!C:&5C:R!/<'1I;VY%<G)O<B`H=&AE<V4 8V%U<V4 <')O8V5S<R!T M;R!E>&ET+"!S;R!C86XG="!U;F-O;6UE;G0 8GD 9&5F875L="X-" DO+R` M("` ("` ("` ("` ("` ("` 22!C:&5C:V5D('1H96T 86QL(&]N92!B>2!O M.PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+6)A<B(I.PT*"6]P=&EO;G, M/2!O<'1I;VY087)S97(N<&%R<V4H87)G<RD[*R\-" DO+R!N;R!S=6-H(&]P M=&EO; T*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+6YO+7-U8V M;W!T:6]N M<G-E*&%R9W,I.PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M9B!O;W!S(BD[ M(&UI<W-I;F< ;6%N9&%T;W)Y(&]P=&EO;B`M+69O;PT*"2\K87)G<R`]('-P M;&ET*")M>6%P<"(I.PT*"6]P=&EO;G, /2!O<'1I;VY087)S97(N<&%R<V4H M"0D)9F%I;&5D(#T =')U93L-" D)"61E8G5G('=R:71E9FQN*")E>'!E8W1E M=& ;F5S=&5D(&1E;&5G871E<R!T:')O=VEN9R]C871C:&EN9R!P<F5V96YT M<R!F86EL<R I(&9R;VT =V]R:VEN9RP-" DO+R!S;R!U;G1I;"!T:&%T)W, M9FEX960L(&)E;&]W(&%R92!N;W0 87-S97)T*&9A:6QS*"XN+BDI('-O($D M8V]U;&0 =&5S="!T:&5M(&5A8V -" DO+VYE=T]P=&EO;E!A<G-E<B I.PT* M"2\O(&-O;F9L:6-T:6YG(&]P=&EO;G,-" DO+V%S<V5R="`H9F%I;',H9&5L M96=A=&4 =F]I9"`H*2![;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H8VAA<EM= M*2 B>"(I.WTI*3L +R\ 1$U$(&)U9SH =&AE($]P=%!A<G-E17)R;W( :7-N M;B$H8VAA<EM=*2 B>"(I.PT*"2\O('5N<W5P<&]R=&5D('1Y<&4-" DO+V]P M+R]O<'1I;VY087)S97(N861D3W!T:6]N(2A/8FIE8W0I*")O(BPB;V)J96-T M<BYA9&1/<'1I;VXA*&EN="DH(GHB+&YU;&PL;G5L;"QN=6QL+&YU;&PL,2D[ M;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H*2 B>B(L;G5L;"QN=6QL+&YU;&PL M,3(S*3L-" DO+R!.;U9A;'5E(&1E9F%U;'1686QU92!M=7-T(#T](&YU;&P M=VAE;B!M86YD871O<GD-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*"DH M96YO/34T,S(Q('AY>B`M9C`N.3DB*3L-" DO+V]P=&EO;G, /2!O<'1I;VY0 M<F)O<V4B72YG971686QU92$H:6YT*3L-" DO+V%S<V5R="`H9F%I;',H9&5L M96=A=&4 =F]I9"`H*2![(&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H M8F]O;"D[('TI*3L ("\O(&-A=7-E<R!$340 8G5G($D 8V%N)W0 <F5P<F]D M=6-E('-I;7!L97(L(&EF(&)O;VP 8B`]('-T871M96YT(&ES(&1O;F4L(&ET M<&QE('5S86=E+ T*"2`J+PT*"6EN="!M86EN("AC:&%R6UU;72!A<F=S*0T* M960 :6X <')I;G1I;F< :&5L<`T*"0DO+R!O<'1I;VX +6 +R`M+6AE;'` M:7, 86QW87ES(&%D9&5D(&)Y(&1E9F%U;'0 86YD('5S97, <')O9W)A;2UN M86UE(&%N9"!U<V%G90T*"0DO+R!O<'1I;VX +2UV97)S:6]N("AN;R!S:&]R M="!N86UE*2!I<R!A9&1E9"!B>2!D969A=6QT(&EF('9E<G-I;VX :7, 9VEV M96X-" D)+R\ ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ('!R M;V=R86TM;F%M92` ("` ("` ("` ("` ('5S86=E("` ("` ("` ("` ("` M('9E<G-I;VX-" D)3W!T:6]N4&%R<V5R(&]P(#T ;F5W($]P=&EO;E!A<G-E M<BA?7T9)3$5?7ULP+BXD+3)=+"`B6V]P=&EO;G-=("TM9FEL97,]9C$L9DX M;F<L(&AE;'`L(&UE=&%V87(L(&YO(&1E9F%U;'0L(&YO="!M86YD871O<GD- M" D);W`N861D3W!T:6]N(2AI;G0I*")V(BP (G9E<F)O<V4B+"`B0F4 ;6]R M92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R92!A;F0 ;6]R M92!A;F0 ;6]R92!V97)B;W-E+B(L("),159%3"(I.PT*"0DO+R!C;VUM82US M97!A<F%T960 <W1R:6YG(&QI<W0L('-H;W)T(&%N9"!L;VYG+"!H96QP+"!M M971A=F%R+"!N;R!D969A=6QT+"!M86YD871O<GD-" D);W`N861D3W!T:6]N M(2AC:&%R6UU;72DH(F9S(BP (F9I;&5S(BP (D9I;&5S('1O('!R;V-E<W,L M(&%N9"!M86ME('1H:7, 82!R96%L;'D ;&]N9R!H96QP('-T<FEN9R!A<R!W M96QL('1O('1E<W0 86QI9VYI;F<N(BP (D9)3$4L1DE,12PN+BXB+"!N=6QL M+"!T<G5E*3L-" D)+R\ 9FQO870L(&QO;F<M;VYL>2P :&5L<"P ;65T879A M<BP 9&5F875L="P ;F]T(&UA;F1A=&]R>0T*"0EO<"YA9&1/<'1I;VXA*&9L M;V%T*2AN=6QL+"`B=&AI;F<B+"`B1&\ :70 =VET:"!T:&ES+B(L(")&3$]! M5"(L("TT+C(Y-V4R,68I.PT*"0DO+R!N;RUV86QU92P <VAO<G0M;VYL>2P M=VET:"!H96QP+"!N;R!M971A=F%R+"!N;R!D969A=6QT+"!N;W0 ;6%N9&%T M871E(&UE=&AO9"XB*3L-" T*"0DO+R!087)S92!C;VUM86YD+6QI;F4 87)G M=6UE;G1S+"!I;F-L=61I;F< 87)G<ULP72!P<F]G<F%M+6YA;64 *&ET)W, M<R!I;B!T:&4 ;W)D97( =&AE>2!A<'!E87)E9"X-" D)3W!T:6]N<R!O<'1I M;VYS(#T M(&)O=& <VAO<G0 86YD(&QO;F< ;F%M97,L(&5I=&AE<B!C86X 8F4 =7-E M9"X-" D):68 *")V97)B;W-E(B!I;B!O<'1I;VYS*0T*"0D)+R\ 268 ;W!T M:65V92!I="!B>2!I;F1E>&EN9R!/<'1I;VYS('=I=& <VAO<G0 ;W( ;&]N M9R!N86UE("AO<B!O;FQY(&]N92!I9B!O;FQY(&]N92D-" D)"2\O(&%N9"!D M;R!G971686QU92$H5F%L=654>7!E*0T*"0D)=F5R8F]S:71Y(#T ;W!T:6]N M='D /B`P*0T*"0D)=W)I=&5F;&XH(DDG;&P <V%Y(&$ ;&ET=&QE+B(I.PT* M"0EI9B`H=F5R8F]S:71Y(#X ,2D-" D)"7=R:71E9FQN*")))VQL('-A>2!A M('1O('1H92!R96UA:6YI;F< ;F]N+6]P=&EO;B!C;VUM86YD+6QI;F4 87)G M<ULP73L-" D)96QS92!I9B`H87)G<RYL96YG=& /B`Q*0T*"0D)+R\ 3W!T M:6]N17)R;W(N97)R;W)%>&ET*")M97-S86=E(BD 8V%N(&)E('5S960 =&\ M<')I;G0 :&5L<"!A;F0 97AI="!P<F]C97-S.PT*"0D)+R\ =7-E9G5L('=H M96X 8VAE8VMI;F< ;F]N+6]P=&EO;B!A<F=U;65N=',-" D)"6]P+F5R<F]R M17AI=" B;6]R92!T:&%N(&]N92!O=71P=70 9FEL92!S<&5C:69I960B*3L- M" T*"0DO+R!M86YD871O<GD ;W!T:6]N<R!C86X 8F4 87-S=6UE9"!T;R!B M92!T:&5R92!A9G1E<B!P87)S92AA<F=S*0T*"0EA<W-E<G0 *")F:6QE<R( M86QU92$H8VAA<EM=6UTI.PT*"0EI9B`H9FEL97,N;&5N9W1H(#T M"0EO<"YE<G)O<D5X:70H(FYE960 =&\ <W!E8VEF:7D 870 ;&5A<W0 ;VYE M(&EN<'5T(&9I;&4B*3L-" T*"0EI9B`H=F5R8F]S:71Y(#X ,"D-" D)>PT* M"0D):68 *")T:&EN9R( :6X ;W!T:6]N<RD-" D)"0EW<FET969L;B B;7D M=&AI;F< :7,Z("(L(&]P=&EO;G-;(G1H:6YG(ETN9V5T5F%L=64A*&9L;V%T M960 9F]R(&)E:6YG(&EN($]P=&EO;G,-" D)"6EF(" B82( :6X ;W!T:6]N M<RD-" D)"0EW<FET969L;B B22!W;W5L9"!P<F]C97-S(&9I;&5S('5S:6YG M(DD =V]U;&0 <')O8V5S<R!F:6QE<R!U<VEN9R!N;W)M86P ;65T:&]D.B(I M.PT*"0D)9F]R96%C:"`H8VAA<EM=(&8[(&9I;&5S*0T*"0D)"7=R:71E9FQN M:6QE+FQE;F=T:"`_(&]U=&9I;&4 .B`B/'-T9&]U=#XB 3"7)E='5R;B`P.PT*"7T-"GT-"F4 ` end
May 30 2005
In article <d7g5nd$3i3$1 digitaldaemon.com>, derick_eddington nospam.yashmoo.com says...Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method.Arg, forgot to : these. The help print is nicely formatted...
May 30 2005
Very useful. I'd like to add this to Mango, if that would be OK? - Kris <derick_eddington nospam.yashmoo.com> wrote in message news:d7g5nd$3i3$1 digitaldaemon.com...I've made a command-line option helper similar to Python's optparse. Itallowsyou to specify what D-type you want the option as, short name, long name,help,and more. It automatically creates a formatted help message and prints itonerrors. It checks that clients' usage of the module is proper; and itchecksthat the command-line arguments meet what was specified. It has acompehensiveunittest that demonstrates more. The source is attached. : /** : * Example usage: : */ : int main (char[][] args) : { : int verbosity; : char[] outfile; : char[][] files; : : // Constructor parameters are used in printing help. : // -h / --help is always added by default : // and uses program-name and usage. : // --version (no short name) is added by : // default if version is given. : // program-name : OptionParser op = new OptionParser(__FILE__[0..$-2], : // usage version : "[options] --files=f1,fN [outfile]", "0.2"); : : // int, short and long, help, metavar, : // no default, not mandatory : op.addOption!(int)("v", "verbose", : "Be more and more and more and more and more " : "and more and more verbose.", "LEVEL"); : // comma-separated string list, short and long, help, : // metavar, no default, mandatory : op.addOption!(char[][])("fs", "files", : "Files to process, and make this a really long help " : "string as well to test aligning.", "FILE,FILE,...", : null, true); : // float, long-only, help, metavar, default, not mandatory : op.addOption!(float)(null, "thing", "Do it with this.", : "FLOAT", -4.297e21f); : // no-value, short-only, with help, no metavar, : // no default, not mandatory : op.addOption!()("a", null, "Use alternate method."); : : // Parse command-line arguments, including args[0] : // program-name (it's skipped). : // args will be reset to the remaining non-option : // command-line arguments in the order they appeared. : Options options = op.parse(args); : : // Check if option was given on the command-line : // by using (char[] in Options). : // If the option has both short and long names, : // either can be used. : if ("verbose" in options) : // If option was given and it has a value, : // retrieve it by indexing Options with short : // or long name (or only one if only one) : // and do getValue!(T) : verbosity = options["verbose"].getValue!(int); : : if (verbosity > 0) : writefln("I'll say a little."); : if (verbosity > 1) : writefln("I'll say a lot more."); : : // args was reset by parse to the remaining : // non-option command-line arguments : if (args.length == 1) : // use the first non-option argument : outfile = args[0]; : else if (args.length > 1) : // OptionError.errorExit("message") can be used to : // print help and exit process; : // useful when checking non-option arguments : op.errorExit("more than one output file specified"); : : // mandatory options can be assumed to be : // there after successful parse : assert ("files" in options); : files = options["files"].getValue!(char[][]); : if (files.length == 0) : op.errorExit("need to specifiy at least one input file"); : : if (verbosity > 0) : { : if ("thing" in options) : writefln("my thing is: ", : options["thing"].getValue!(float)); : : // no-value options are simply tested for being in Options : if ("a" in options) : writefln("I would process files using alternate method:"); : else : writefln("I would process files using normal method:"); : foreach (char[] f; files) : writefln("\t",f); : writefln("and output to ", : outfile.length ? outfile : "<stdout>"); : } : : return 0; : } Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method. --------------------------------------------------------------- $ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a outputfile I'll say a little. I'll say a lot more. my thing is: -4.23e-06 I would process files using alternate method: somefile anotherfile nextfile and output to outputfile --------------------------------------------------------------- $ ./example --asdf optparse: error: no such option: --asdf [help] --------------------------------------------------------------- $ ./example optparse: error: -fs / --files option is mandatory [help]
May 30 2005
Certainly. I'll keep you updated as I enhance and fix bugs. In article <d7g9q7$7b3$1 digitaldaemon.com>, Kris says...Very useful. I'd like to add this to Mango, if that would be OK? - Kris <derick_eddington nospam.yashmoo.com> wrote in message news:d7g5nd$3i3$1 digitaldaemon.com...I've made a command-line option helper similar to Python's optparse. Itallowsyou to specify what D-type you want the option as, short name, long name,help,and more. It automatically creates a formatted help message and prints itonerrors. It checks that clients' usage of the module is proper; and itchecksthat the command-line arguments meet what was specified. It has acompehensiveunittest that demonstrates more. The source is attached.
May 30 2005
derick_eddington nospam.yashmoo.com wrote:Certainly. I'll keep you updated as I enhance and fix bugs.Excellent ~ thx!
May 30 2005
In article <d7gqjo$nth$2 digitaldaemon.com>, kris says...derick_eddington nospam.yashmoo.com wrote:Who doesn't love to enhance bugs? =PCertainly. I'll keep you updated as I enhance and fix bugs.Excellent ~ thx!Regards, James Dunne
May 31 2005
I've updated optparse.d: Option groups for help printout. Example: : optionParser = new OptionParser("myapp", "[option [value]]"); : optionParser.addOption!()("v", "verbose"); : optionParser.addOption!(float)("f", "foo", null, null, null, true); : optionParser.addOption!(int)("x", "xeno", "does this and that", "THING"); : optionParser.addOption!(int[])("a", "apple", "make applesauce", null); : optionParser.addOption!(long)("l", "long", "be longer", "LONG"); : optionParser.addOption!(double)("d", "double", null, "DOUBLE"); : optionParser.addOption!(uint[])("ui", "uint", null, "UINT,..."); : // make a group, options must have previously been added : optionParser.makeGroup("number options", "f", "x", "a", "l", "d", "ui"); : optionParser.addOption!(char[])(null, "bar", "make it happen", "BLOB"); : optionParser.addOption!(char[][])("sb", "shabang", "blow up", "IT"); : // make a group, options must have previously been added : optionParser.makeGroup("string options", "bar", "sb"); Will make help: : usage: myapp [option [value]] : : options: : -h, --help Show this help message and exit. : --version Show program's version number and exit. : -v, --verbose : : number options: : -f, --foo : -x THING, --xeno=THING : does this and that : -a, --apple make applesauce : -l LONG, --long=LONG : be longer : -d DOUBLE, --double=DOUBLE : -ui UINT,..., --uint=UINT,... : : string options: : --bar=BLOB make it happen : -sb IT, --shabang=IT : blow up Help string formatting separates short-name from METAVAR by a space for easier reading. Smarter use of templates to support more types. Bug *un-enhanced* :) where "--option= --next-opt" would consume --next-opt as --option's value instead of causing error because --option has no value. A few more unittest cases. Question for potential users of optparse.d: Would you rather have anal checking of all usage of the module or reduce the object-file size from 55k to 35k? I tried to use "version" but it's too buggy (I just wanted version'd else-if...) --Derick begin 0644 optparse.d M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ* T*("H 0GD 1&5R:6-K($5D9&EN9W1O;BX 4&QA8V5D(&EN('1H M92!P=6)L:6, 9&]M86EN+B` ("` ("` ("` ("` ("` ("` ("` ("H-"B`J M($EN<W!I<F5D(&)Y(%!Y=&AO;B=S(&]P='!A<G-E+B` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("` ("` ("` ("` * T*("H 4V5E(&)O='1O;2!O9B!T:&ES(&9I M;&4 9F]R(&5X86UP;&4 =7-A9V4N("` ("` ("` ("` ("` ("` ("` ("` M("` ("` ("H-"B`J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ+PT* M("` ("` ("` <W1D+G-T9&EO+`T*("` ("` ("` ("` ("` <W1D+F,N<W1D M<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T9614>7!E<RY.;U9A;'5E M5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+DEN=#L M?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!I;G1;72D >PT*4W5P<&]R=&5D M5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+DEN=$%R M<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T9614>7!E<RY5 M<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S M+E5);G1!<G)A>3L ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!L;VYG*2![ M5'EP97,N3&]N9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!L;VYG6UTI M('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3=7!P;W)T M9614>7!E<RY,;VYG07)R87D[('T-"GT-"G1E;7!L871E(&=E=%-4("A4(#H M=6QO;F<I('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4(" I("![(')E='5R;B!3 M=7!P;W)T9614>7!E<RY53&]N9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 M<FX 4W5P<&]R=&5D5'EP97,N54QO;F=!<G)A>3L ?0T*?0T*=&5M<&QA=&4 M9V5T4U0 *%0 .B!F;&]A="D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D M92!G97135"`H5"`Z(&9L;V%T6UTI('L-"E-U<'!O<G1E9%1Y<&5S(&=E=%-4 M97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O=6)L93L M?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!D;W5B;&5;72D >PT*4W5P<&]R M=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E9%1Y<&5S+D1O M>PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U<'!O<G1E M9%1Y<&5S+E-T<FEN9SL ?0T*?0T*=&5M<&QA=&4 9V5T4U0 *%0 .B!C:&%R M6UU;72D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L <F5T=7)N(%-U M5"`H5"D >PT*4W5P<&]R=&5D5'EP97, 9V5T4U0 *"D ('L =&AR;W< ;F5W M(%5N4W5P<&]R=&5D5'EP945R<F]R*'1Y<&5I9"A4*2D[('T-"GT-"GT +R]E M=&-H(&-L:65N="!C;V1E(&%T=&5M<'1I;F<-"B`J('1O('5S92!U;G-U<'!O M<G1E9"!T>7!E<RX 1&]E<R!N;W0 <')O<&]G871E(&]U="!O9B!M;V1U;&4N M87)S945R<F]R(#H 17)R;W(-"GL-" ET:&ES("AC:&%R6UT ;7-G*2` >R!S M86YD+6QI;F4 ;W!T:6]N<RX 0V%U<V5S(&UE<W-A9V4 =&\ 8F4 <')I;G1E M9`T*("H 86YD('!R;V=R86T 97AI=&5D+B` 1&]E<R!N;W0 <')O<&]G871E M;W( .B!%<G)O< T*>PT*"71H:7, *&-H87);72!M<V<I("![('-U<&5R*&US M;6]D=6QE+B` 0V]N<W1R=6-T(&ET('=I=& >6]U<B!P<F]G<F%M)W, ;F%M M90T*("H 86YD(&]P=&EO;F%L;'D 82!U<V%G92!M97-S86=E(&%N9"!V97)S M87-S($]P=&EO;E!A<G-E< T*>PT*"7!R:79A=&4 8VAA<EM=('!R;V=.86UE M+"!U<V%G92P =F5R.PT*"7!R:79A=&4 0F%S94]P=&EO;EM=(&9I;F1/<'1I M;VYS.PT*"7!R:79A=&4 3W!T:6]N<R!D969A=6QT5F%L=65/<'1I;VYS.PT* M("AC:&%R6UT <')O9TYA;64L(&-H87);72!U<V%G92`](&YU;&PL(&-H87); M72!V97( /2!N=6QL*0T*"6EN('L-" D)87-S97)T("AP<F]G3F%M92YL96YG M=& I.PT*"7T-" EB;V1Y('L-" D)=&AI<RYP<F]G3F%M92`]('!R;V=.86UE M.PT*"0ET:&ES+G5S86=E(#T M"0EO<'1I;VY'<F]U<', ?CT ;F5W($]P=&EO;D=R;W5P*")O<'1I;VYS(BD[ M861D3W!T:6]N(2 I*&YU;&PL(")V97)S:6]N(BP (E-H;W< <')O9W)A;2=S M('9E<G-I;VX ;G5M8F5R(&%N9"!E>&ET+B(I.PT*"7T-" T*"6EN=F%R:6%N M=`T*"7L-" D)87-S97)T("AO<'1I;VY'<F]U<',N;&5N9W1H*3L-" D)87-S M97)T("AO<'1I;VY'<F]U<'-;,%T (3T](&YU;&PI.PT*"7T-" T*"2\J* T* M"2`J(%5S92!W:71H;W5T(&$ ='EP92!F;W( 82!N;RUV86QU92]T;V=G;&4 M('1Y<&5S('1O(')E=')I979E('1H92!O<'1I;VXG<R!V86QU92!A<R!T:&%T M($0M='EP92X ($]N92!O9 T*"2`J('-H;W)T3F%M92!O<B!L;VYG3F%M92!M M=7-T(&)E('-P96-I9FEE9"P ;W( 8F]T:"X (&AE;'` :7, =&AE(&AE;'` M;65S<V%G90T*"2`J(&9O<B!T:&4 ;W!T:6]N+"!P<FEN=&5D('=H96X =&AE M82!D97-C:7!T:79E(&YA;64 9F]R('1H92!O<'1I;VXG<R!V86QU92!U<V5D M<F%R9W, :7, =&\ 86QL;W< )U0 9&5F875L=%9A;'5E)R!A;F0 )V)O;VP M;6%N9&%T;W)Y)R!P87)A;65T97)S+ T*"2`J(&1E9F%U;'1686QU92!I<R!T M;R!S970 82!D969A=6QT('9A;'5E(&9O<B!O<'1I;VYS('=I=& =F%L=65S M(&%N9"!M86ME('1H870-" D *B!O<'1I;VX 86QW87ES(&9O=6YD('=I=& M=&AA="!V86QU92!B>2!D969A=6QT+B` ;6%N9&%T;W)Y('-P96-I9FEE<R!W M;VUM86YD+6QI;F4N("!)9B!B;W1H(&1E9F%U;'1686QU92!A;F0-" D *B!A M;F0 ;6%N9&%T;W)Y(&%R92!G:79E;BP ;6%N9&%T;W)Y('=I;&P :&%V92!N M;R!E9F9E8W0N("!)9B!D969A=6QT5F%L=64 :7,-" D *B!N=6QL+"!I="!M M96%N<R!N;R!D969A=6QT('9A;'5E+B` 9&5F875L=%9A;'5E(&UU<W0 8F4 M;G5L;"!F;W( ;F\M=F%L=64-" D *B!O<'1I;VYS('1H870 ;F5E9"!T;R!S M("A4(#T M:&]R=$YA;64L(&-H87);72!L;VYG3F%M92`](&YU;&PL(&-H87);72!H96QP M(#T M96)U9R!W<FET969L;B B)7,N861D3W!T:6]N*"DB+"!T:&ES*3L-" T*"0EI M"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B861D3W!T:6]N*"D <F5Q=6ER M<B B861D3W!T:6]N*"D =&%K97, 870 ;6]S="!T=V\ =F%R:6%D:6, 87)G M:6]N<RD >PT*"0D):68 *'-H;W)T3F%M92YL96YG=& )B8 <VAO<G1.86UE M(#T](&\N<VAO<G1.86UE*0T*"0D)"71H<F]W(&YE=R!/<'1087)S945R<F]R M*")C;VYF;&EC=&EN9R!O<'1I;VXZ("TB('X <VAO<G1.86UE*3L-" D)"6EF M("AL;VYG3F%M92YL96YG=& )B8 ;&]N9TYA;64 /3T ;RYL;VYG3F%M92D- M" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B8V]N9FQI8W1I;F< ;W!T M(&-O;G-T<G5C=&]R(&-H96-K<R!4(&ES('-U<'!O<G1E9"P 86YD('1H<F]W M<R!/<'1087)S945R<F]R(&EF(&YO=`T*"0E/<'1I;VXA*%0I(&]P=&EO;B`] M(&YE=R!/<'1I;VXA*%0I*'-H;W)T3F%M92P ;&]N9TYA;64L(&AE;'`L(&UE M('L-" D)"0DO+R!N965D960 =&\ 861V86YC92!?87)G<'1R(&)E8V%U<V4 M;F]R92`]('9A7V%R9R$H='EP96]F*&YU;&PI*2A?87)G<'1R*3L-" D)"0EI M9B`H7V%R9W5M96YT<ULP72`A/2!T>7!E:60H='EP96]F*&YU;&PI*2!\?"!I M9VYO<F4 (3T ;G5L;"D-" D)"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H M9F]R;6%T*"(E<R!O<'1I;VX :&%S(&YO('9A;'5E+"!D969A=6QT('9A;'5E M(&UU<W0 8F4 ;G5L;"!W:&5N('-P96-I9FEY:6YG(&UA;F1A=&]R>2(L(&]P M=&EO;BDI.PT*"0D)?0T*"0D)96QS92!I9B`H7V%R9W5M96YT<RYL96YG=& I M;VX :&%S(&YO('9A;'5E+"!S;R!N;R!D969A=6QT('9A;'5E(&-A;B!B92!S M<&5C:69I960B+"!O<'1I;VXI*3L-" D)?0T*"0EE;'-E('L-" D)"6EF("A? M87)G=6UE;G1S+FQE;F=T:"D >PT*"0D)"6EF("A?87)G=6UE;G1S6S!=("$] M6S!=("$]('1Y<&5I9"A4*2D-" D)"0D)"71H<F]W(&YE=R!/<'1087)S945R M<F]R*&9O<FUA=" B)7, ;W!T:6]N)W, 9&5F875L="!V86QU92!N;W0 ='EP M92`E<RP :7, ='EP92`E<R(L(&]P=&EO;BP ='EP96ED*%0I+"!?87)G=6UE M"0D)"61E9F%U;'1686QU94]P=&EO;G-;;W!T:6]N+G-H;W)T3F%M95T /2!O M"0D)9&5F875L=%9A;'5E3W!T:6]N<UMO<'1I;VXN;&]N9TYA;65=(#T ;W!T M86QU92`]("(I.PT*"0D)"0D):69T>7!E("A4(#H M"0D)=W)I=&5F;&XH;W!T:6]N+G9A;'5E*3L-" D)"0D)"7T-" D)"0D)"65L M<V4 :69T>7!E("A4($$ .B!!6UTI('L-" D)"0D)"0EI9B`H;W!T:6]N+G9A M+G9A;'5E*0T*"0D)"0D)"0D)=W)I=&5F*"(E<RPB+"!E*3L-" D)"0D)"0EI M9B`H;W!T:6]N+G9A;'5E+FQE;F=T:"D-" D)"0D)"0D)=W)I=&5F*&]P=&EO M;BYV86QU95LD+3%=*3L-" D)"0D)"0EW<FET969L;B I.PT*"0D)"0D)?0T* M" D)"0D)"7T-" D)"0D)?0T*"0D)"7T-" D)"0EE;'-E(&EF("A?87)G=6UE M"71Y<&5O9BAN=6QL*2!I9VYO<F4 /2!V85]A<F<A*'1Y<&5O9BAN=6QL*2DH M9"AB;V]L*2D-" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<BAF;W)M870H M(B5S(&]P=&EO;B!M86YD871O<GD <&%R86UE=&5R(&UU<W0 8F4 ='EP92`E M;W)Y(#T =F%?87)G(2AB;V]L*2A?87)G<'1R*3L-" D)"61E8G5G('=R:71E M<ULP72YO<'1I;VYS('X](&]P=&EO;CL-" T*"0ED96)U9R!W<FET969L;B B M<%1I=&QE+FQE;F=T:"`]/2`P*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R M;W(H(FUA:V5'<F]U<" I(')E<75I<F5S(&$ 9W)O=7`M=&ET;&4B*3L-" D) M:68 *%]A<F=U;65N=',N;&5N9W1H(#T M4&%R<V5%<G)O<B B;6%K94=R;W5P*"D <F5Q=6ER97, 870 ;&5A<W0 ;VYE M8VAA<EM=*2D-" D)"0ET:')O=R!N97< 3W!T4&%R<V5%<G)O<B B;6%K94=R M9R!W<FET969L;B B7'1A9&1I;F< ;W!T:6]N("5S('1O(&=R;W5P(BP ;VXI M<V5/<'1I;VY;72!B87-I8T]P=&EO;G, /2!O<'1I;VY'<F]U<'-;,%TN;W!T M:6]N<SL-" T*"0D)9F]R96%C:"`H<VEZ95]T(&DL($)A<V5/<'1I;VX ;SL M(&]N(#T](&\N;&]N9TYA;64I('L-" D)"0D)9F]U;F0 /2!T<G5E.PT*"0D) M=F4 9G)O;2!B87-I8T]P=&EO;G, 86YD('-H:69T(')E;6%I;FEN9R!T;R!P M<F5S97)V92!O<F1E< T*"0D)"7=H:6QE("AR96UO=F4 *R`Q(#P 8F%S:6-/ M<'1I;VYS+FQE;F=T:"D >PT*"0D)"0EB87-I8T]P=&EO;G-;<F5M;W9E72`] M"0D)?0T*"0D)"6]P=&EO;D=R;W5P<ULP72YO<'1I;VYS(#T 8F%S:6-/<'1I M=%!A<G-E17)R;W(H;VX ?B`B(&]P=&EO;B!N965D<R!T;R!B92!A9&1E9"!B M8V]M;6%N9"UL:6YE(&%R9W5M96YT<RX 87)G<ULP72!I<R!A<W-U;65D('1O M(&)E('1H92!P<F]G<F%M+6YA;64-" D *B!A;F0 :7, <VMI<'!E9"X ($-H M96-K<R!A<F=S(&UE971S('1H92!S<&5C:69I960 ;W!T:6]N<RX (&%R9W, M:7, <F5S970-" D *B!T;R!B92!A;B!A<G)A>2!O9B!A;&P ;F]N+6]P=&EO M;B!A<F=U;65N=', *'1H;W-E('1H870 9&\ ;F]T('-T87)T('=I=& -" D M*B`G+2< 86YD(&1O(&YO="!F;VQL;W< 82!V86QU92UT86MI;F< ;W!T:6]N M*2X (%)E='5R;G, 86X 3W!T:6]N<R!W:&EC:`T*"2`J(&ES('5S960 =&AU M<R!T;R!C:&5C:R!F;W( 9F]U;F0 ;W!T:6]N<SH *")O<'1N86UE(B!I;B!O M3W!T:6]N<R!S;R!T:&5Y)W)E(&9O=6YD(&)Y(&1E9F%U;'0-" D)9F]R96%C M:"`H8VAA<EM=(&]P='-T<FEN9RP 0F%S94]P=&EO;B!O.R!D969A=6QT5F%L M=65/<'1I;VYS*0T*"0D)9F]U;F1/<'1I;VYS6V]P='-T<FEN9UT /2!O.PT* M9G1O=F5R07)G<SL-" T*"0ET<GD >PT*"0DO+R!&:6YD(&%R9W, =&AA="!A M<F4 ;W!T:6]N<RP 86YD(&=E="!T:&5I<B!V86QU92!S=')I;F=S(&EF('1H M97D <F5Q=6ER92!T:&5M+ T*"0DO+R!)9B!I="=S(&YO="!A;B!O<'1I;VXL M:7, <VMI<'!E9"!A<R!I="=S(&%S<W5M960 =&\ 8F4 <')O9W)A;2!N86UE M("AA6S%=(#T M<W-I;F< ;&]N9RUO<'1I;VX )7,B+"!A*3L-" D)"0D)9F]R96%C:"`H0F%S M94]P=&EO;B!O.R!F:6YD3W!T:6]N<RD >PT*"0D)"0D):68 *&\N;&]N9TYA M;64N;&5N9W1H("`F)B` 82YF:6YD*&\N;&]N9TYA;64I(#T M"0DF)B`H82YL96YG=& M,B`]/2!O+FQO;F=.86UE+FQE;F=T:"!\?"`H82YL M96YG=& M,B`^(&\N;&]N9TYA;64N;&5N9W1H("8F(&%;,BMO+FQO;F=.86UE M;W!T:6]N(&ES(&]N92!W92=R92!L;V]K:6YG(&9O< T*"0D)"0D)"69O=6YD M(#T M="!O<'1I;VXG<R!A<F<-" D)"0D)"0D):68 *&$N;&5N9W1H+3( /B!O+FQO M;F=.86UE+FQE;F=T:"D >PT*"0D)"0D)"0D)+R\ ;W!T:6]N)W, =F%L=64 M:7, 8V]N8V%T96YA=&5D('=I=& (BTM;W!T:6]N/2(-" D)"0D)"0D)"6EF M("AA+FQE;F=T:"TR(#T M;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B+2TE<R!O<'1I;VX <F5Q=6ER97, M82!V86QU92(L(&\N;&]N9TYA;64I*3L-" D)"0D)"0D)"6]V(#T 85LR*V\N M*0T*"0D)"0D)"0D)"71H<F]W(&YE=R!/<'1I;VY%<G)O<BAF;W)M870H(BTM M"0D)"0D)"0EO=B`](&%R9W-;*RMI73L-" D)"0D)"0D)?0T*"0D)"0D)"7T- M" D)"0D)"0DO+R!E;'-E(&]P=&EO;B!R97%U:7)E<R!N;R!V86QU92!A;F0 M;W8 :7, ;G5L;`T*"0D)"0D)"6]P='-686QS6V]=(#T M8G)E86L[("`O+R!F;W5N9"!S;R!S:VEP('1H92!R97-T(&]F(&]P=&EO;G, M=V4G<F4 ;&]O:VEN9R!F;W(-" D)"0E]"7T)?0T*"0D)"65L<V4 >R` +R\ M:70G<R!A('-H;W)T(&]P=&EO; T*"0D)"0ED96)U9R!W<FET969L;B B7'1P M<F]C97-S:6YG('-H;W)T+6]P=&EO;B`E<R(L(&$I.PT*"0D)"0EF;W)E86-H M:&]R=$YA;64N;&5N9W1H("`F)B` 82YF:6YD*&\N<VAO<G1.86UE*2`]/2`Q M:6YG(&9O< T*"0D)"0D)"69O=6YD(#T =')U93L-" D)"0D)"0EC:&%R6UT M:68 *&$N;&5N9W1H+3$ /B!O+G-H;W)T3F%M92YL96YG=& I('L-" D)"0D) M"0D)"2\O(&]P=&EO;B=S('9A;'5E(&ES(&-O;F-A=&5N871E9"!W:71H("(M M;W!T:6]N( T*"0D)"0D)"0D);W8 /2!A6V\N<VAO<G1.86UE+FQE;F=T:"LQ M+R\ ;W!T:6]N)W, =F%L=64 <VAO=6QD(&)E(&YE>'0 :6X 87)G<PT*"0D) M"0D)"0D):68 *&D /3T 87)G<RYL96YG=& M,2D-" D)"0D)"0D)"0ET:')O M=R!N97< 3W!T:6]N17)R;W(H9F]R;6%T*"(M)7, ;W!T:6]N(')E<75I<F5S M(&$ =F%L=64B+"!O+G-H;W)T3F%M92DI.PT*"0D)"0D)"0D);W8 /2!A<F=S M82YL96YG=& M,2`^(&\N<VAO<G1.86UE+FQE;F=T:"D >PT*"0D)"0D)"0DO M+R!N;RUV86QU92!O<'1I;VX 9&ED;B=T(&UA=&-H+"!I93H +6]74D].1PT* M"0D)"0D)"0EF;W5N9"`](&9A;'-E.PT*"0D)"0D)"0EB<F5A:SL-" D)"0D) M86YD(&]A(&ES(&YU;&P-" D)"0D)"0EO<'1S5F%L<UMO72`](&]V.PT*"0D) M"0D)"6)R96%K.R` +R\ 9F]U;F0 <V\ <VMI<"!T:&4 <F5S="!O9B!O<'1I M=6YD*0T*"0D)"0ET:')O=R!N97< 3W!T:6]N17)R;W(H(FYO('-U8V ;W!T M;F0 ;W!T:6]N<R!A;F0 <&%R<V4 86YD(&-H96-K('1H96ER(&9O=6YD('9A M;'5E<PT*"0EF;W)E86-H("A"87-E3W!T:6]N(&\L(&-H87);72!V.R!O<'1S M5F%L<RD-" D)>PT*"0D)9&5B=6< =W)I=&5F;&XH(EQT9F]U;F0 ;W!T:6]N M("5S('=I=& =F%L=64M<W1R:6YG(#T M"0D)9F]U;F1/<'1I;VYS6V\N;&]N9TYA;65=(#T ;SL-" T*"0D)=')Y('L- M=&5D5'EP97,N3F]686QU93H-" D)"0D)"6%S<V5R="`H=B!I<R!N=6QL*3L- M" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!H87, ;F\ M=F%L=64 =&\ <&%R<V4B+"!O*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E M(%-U<'!O<G1E9%1Y<&5S+DEN=#H-" D)"0D)"61E8G5G('=R:71E9FQN*")< M=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!I;G0B+"!O+"!V*3L- M" D)"0D)"2AC87-T*$]P=&EO;B$H:6YT*2EO*2YV86QU92`]('1O26YT*'8I M<&%R<VEN9R!<(B5S7"( 87, :6YT6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T M*$]P=&EO;B$H:6YT6UTI*6\I+G9A;'5E(#T <&%R<V5!<G)A>2$H:6YT*2AV M5'EP97,N54EN=#H-" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T M8V%S="A/<'1I;VXA*'5I;G0I*6\I+G9A;'5E(#T =&]5:6YT*'8I.PT*"0D) M. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I M;F< 7"(E<UPB(&%S('5I;G1;72(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T M:6]N(2AU:6YT6UTI*6\I+G9A;'5E(#T <&%R<V5!<G)A>2$H=6EN="DH=BP M>7!E<RY,;VYG. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I M;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&QO;F<B+"!O+"!V*3L-" D)"0D)"2AC M"0EB<F5A:SL-" D)"0D)8V%S92!3=7!P;W)T9614>7!E<RY,;VYG07)R87DZ M;VXA*&QO;F=;72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AL;VYG*2AV+"`F M=&],;VYG*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y M<&5S+E5,;VYG. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I M"0D)"0EB<F5A:SL-" D)"0D)8V%S92!3=7!P;W)T9614>7!E<RY53&]N9T%R M<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F;&XH(EQT7'0E<R!O<'1I;VXZ('!A M<G-I;F< 7"(E<UPB(&%S('5L;VYG6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T M*$]P=&EO;B$H=6QO;F=;72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AU;&]N M="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9FQO870B+"!O+"!V*3L- M" D)"0D)"2AC87-T*$]P=&EO;B$H9FQO870I*6\I+G9A;'5E(#T =&]&;&]A M="AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S M=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9FQO871;72(L(&\L('8I.PT*"0D) M"0D)*&-A<W0H3W!T:6]N(2AF;&]A=%M=*2EO*2YV86QU92`]('!A<G-E07)R M969L;B B7'1<="5S(&]P=&EO;CH <&%R<VEN9R!<(B5S7"( 87, 9&]U8FQE M=64 /2!T;T1O=6)L92AV*3L-" D)"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U M<'!O<G1E9%1Y<&5S+D1O=6)L94%R<F%Y. T*"0D)"0D)9&5B=6< =W)I=&5F M;&XH(EQT7'0E<R!O<'1I;VXZ('!A<G-I;F< 7"(E<UPB(&%S(&1O=6)L95M= M86QU92`]('!A<G-E07)R87DA*&1O=6)L92DH=BP )G1O1&]U8FQE*3L-" D) M"0D)"6)R96%K.PT*"0D)"0EC87-E(%-U<'!O<G1E9%1Y<&5S+E-T<FEN9SH- M" D)"0D)"61E8G5G('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!P87)S:6YG M(%PB)7-<(B!A<R!C:&%R6UTB+"!O+"!V*3L-" D)"0D)"2AC87-T*$]P=&EO M8V%S92!3=7!P;W)T9614>7!E<RY3=')I;F=!<G)A>3H-" D)"0D)"61E8G5G M('=R:71E9FQN*")<=%QT)7, ;W!T:6]N.B!P87)S:6YG(%PB)7-<(B!A<R!C M:&%R6UU;72(L(&\L('8I.PT*"0D)"0D)*&-A<W0H3W!T:6]N(2AC:&%R6UU; M72DI;RDN=F%L=64 /2!P87)S94%R<F%Y(2AC:&%R6UTI*'8L(&9U;F-T:6]N M(&-H87);72`H8VAA<EM=('9S*2![<F5T=7)N('9S.WTI.PT*"0D)"0D)8G)E M;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&5R<F]R('!A M<G-I;F< =F%L=64M<W1R:6YG(%PB)7-<(B!A<R`E<SH )7,B+"!O+"!V+"!O M9$]P=&EO;G,I('L-" D)"7!R:6YT2&5L<" I.PT*"0D)97AI=" P*3L-" D) M?0T*"0EI9B`H(G9E<G-I;VXB(&EN(&9O=6YD3W!T:6]N<RD >PT*"0D)<')I M;6%N9&%T;W)Y(&]P=&EO;G, 87)E(&EN(&9O=6YD3W!T:6]N<PT*"0EF;W)E M86YD871O<GDI('L-" D)"0EB;V]L(&9O=6YD.PT*"0D)"69O<F5A8V *$)A M<V5/<'1I;VX 9F\[(&9O=6YD3W!T:6]N<RD-" D)"0D):68 *&9O(&ES(&\I M=&AR;W< ;F5W($]P=&EO;D5R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&ES(&UA M969L;B B)7,N<&%R<V4H*2!D;VYE+B(L('1H:7,I.PT*"0EA<F=S(#T ;&5F M=&]V97)!<F=S.PT*"0ER971U<FX 9F]U;F1/<'1I;VYS.PT*"7T-" T*"79O M;VAL(#X ,C$I('L-" D)"0EC:&%R6UT <F5T(#T (EQN(CL-" D)"0EC:&%R M6UT :6YD96YT(#T M92YL96YG=& /B`W,BD >PT*"0D)"0D);&EN97, ?CT ;&EN93L-" D)"0D) M;F=T:"D-" D)"0D);&EN97, ?CT ;&EN93L-" D)"0EF;W)E86-H("AC:&%R M6UT ;#L M"0ER971U<FX ;6%K94EN9&5N=" R-"`M(&]H;"D ?B!H.PT*"0D)?0T*"0E] M<R`E<UQN(BP <')O9TYA;64L('5S86=E*3L-" D)?0T*"0EF;W)E86-H("A/ M<'1I;VY'<F]U<"!G<F]U<#L M;VX ;SL 9W)O=7`N;W!T:6]N<RD >PT*"0D)"6-H87);72!O<'1(96QP(#T M87(N;&5N9W1H*0T*"0D)"0D);W!T2&5L<"!^/2`B("( ?F\N;65T859A<CL- M" D)"0D):68 *&\N;&]N9TYA;64N;&5N9W1H*0T*"0D)"0D);W!T2&5L<"!^ M/2`B+"`B.PT*"0D)"7T-" D)"0EI9B`H;RYL;VYG3F%M92YL96YG=& I('L- M" D)"0D);W!T2&5L<"!^/2`B+2TB('X ;RYL;VYG3F%M93L-" D)"0D):68 M"6]P=$AE;'` ?CT 86QI9VY/<'1(96QP4W1R*&\N:&5L<"P ;W!T2&5L<"YL M"7T-" D)=W)I=&5F*&AE;'`I.PT*"7T-" T*"79O:60 <')I;G1697)S:6]N M:71E9FQN*"(E<SH 97)R;W(Z("5S7&XB+"!P<F]G3F%M92P ;7-G*3L-" D) M9R!W<FET969L;B B)7,N<&%R<V5!<G)A>2$H)7,I*'9S/5PB)7-<(B!P87)S M950])7,I(BP =&AI<RP ='EP96ED*%0I+"!V<RP <&%R<V54*3L-" D)5%M= M:"`H8VAA<EM=(',[('-S*0T*"0D):68 *',N;&5N9W1H*0T*"0D)"6$ ?CT M;F1E9"!T;R!B92!U<V5D('-O;65T:&EN9R!L:6ME. T*("H :68 *")O<'1I M('1O(&%L;"!O<'1I;VYS(&%N9"!P<F]V:61E<R!T96UP;&%T92!F;W(-"B`J M(')E=')I979I;F< ;W!T:6]N('9A;'5E<R!A<R!T:&4 8V]R<F5C="!T>7!E M" EC:&%R6UT <VAO<G1.86UE+"!L;VYG3F%M93L-" EC:&%R6UT :&5L<"P M;65T859A<CL-" EB;V]L(&UA;F1A=&]R>3L-" E3=7!P;W)T9614>7!E<R!T M;W)T9614>7!E<R!T+"!4>7!E26YF;R!T:2P 8VAA<EM=('-.86UE+"!C:&%R M<V5R="`H=&D (3T](&YU;&PI.PT*"0EA<W-E<G0 *'-.86UE+FQE;F=T:"!\ M"5]T>7!E(#T M92`](&Q.86UE.PT*"0EH96QP(#T :#L- M"61E8G5G('=R:71E9FQN*"(E<RYT:&ES*"D 9&]N92`M+2!T>7!E(#T )60 M(%]T>7!E(#T M("` ("` ("` ("` ("` 268 =&AE('=R;VYG('1Y<&4 :7, 871T96UP=&5D M+"!/<'1087)S945R<F]R(&ES('1H<F]W;BX-" D *B\-" ET96UP;&%T92!G M<&4 /3T 4W5P<&]R=&5D5'EP97,N3F]686QU92D-" D)"71H<F]W(&YE=R!/ M<'1087)S945R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&1O97, ;F]T(&AA=F4 M82!V86QU92!T;R!R971R:65V92(L('1H:7,I*3L-" T*"0ET<GD >PT*"0D) M:68 *&=E=%-4(2A4*2`A/2!T>7!E*0T*"0D)"71H<F]W(&YE=R!/<'1087)S M945R<F]R*&9O<FUA=" B)7, ;W!T:6]N(&UU<W0 8F4 <F5T<FEE=F5D(&%S M('1Y<&4 )7,L(&YO="!T>7!E("5S(BP =&AI<RP 7W1Y<&4L('1Y<&5I9"A4 M*0T*"0D)=&AR;W< ;F5W($]P=%!A<G-E17)R;W(H9F]R;6%T*"(E<R!O<'1I M;VX 8V%N(&YO="!B92!R971R:65V960 87, =6YS=7!P;W)T960 ='EP92`E M(%!A<F%M971E<FEZ960 8GD 82!T>7!E('1O('-P96-I9FEY(&$ =F%L=64- M"B`J(&ES(&5X<&5C=&5D(&%N9"!W:&%T('1Y<&4L(&]R($YO5F%L=64 =&\ M"B`J+PT*<')I=F%T92!C;&%S<R!/<'1I;VX *%0I(#H 0F%S94]P=&EO; T* M('T-" T*"71H:7, *&-H87);72!S:&]R=$YA;64L(&-H87);72!L;VYG3F%M M92P 8VAA<EM=(&AE;'`L(&-H87);72!M971A5F%R*0T*"7L-" D)=')Y('L- M" D)"7-U<&5R*&=E=%-4(2A4*2P ='EP96ED*%0I+"!S:&]R=$YA;64L(&QO M;F=.86UE+"!H96QP+"!M971A5F%R*3L-" D)?0T*"0EC871C:"`H56Y3=7!P M;W)T9614>7!E17)R;W( =7-T92D >PT*"0D)=&AR;W< ;F5W($]P=%!A<G-E M17)R;W(H9F]R;6%T*"(E<R!O<'1I;VX 8V%N(&YO="!B92!U;G-U<'!O<G1E M9"!T>7!E("5S(BP ;W!T5&]3=')I;F<H<VAO<G1.86UE+&QO;F=.86UE*2P M96)U9R!W<FET969L;B B8F5G:6X )7, =6YI='1E<W0B+"!?7T9)3$5?7RD[ M>PT*"0EO<'1I;VY087)S97( /2!N97< 3W!T:6]N4&%R<V5R*%]?1DE,15]? M6S`N+B0M,ETL(");;W!T:6]N(%MV86QU95U=(BP (C`N,"(I.PT*"0EO<'1I M;VY087)S97(N861D3W!T:6]N(2 I*")V(BP (G9E<F)O<V4B*3L-" D);W!T M:6]N4&%R<V5R+F%D9$]P=&EO;B$H9FQO870I*")F(BP (F9O;R(L(&YU;&PL M(&YU;&PL(&YU;&PL('1R=64I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N M(2AI;G0I*")X(BP (GAE;F\B+"`B9&]E<R!T:&ES(&%N9"!T:&%T(BP (E1( M24Y'(BP ,3(S*3L-" D);W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H:6YT6UTI M*")A(BP (F%P<&QE(BP (FUA:V4 87!P;&5S875C92(L(&YU;&PI.PT*"0EO M<'1I;VY087)S97(N861D3W!T:6]N(2AL;VYG*2 B;"(L(")L;VYG(BP (F)E M*&1O=6)L92DH(F0B+"`B9&]U8FQE(BP ;G5L;"P (D1/54),12(I.PT*"0EO M<'1I;VY087)S97(N861D3W!T:6]N(2AU:6YT6UTI*")U:2(L(")U:6YT(BP M(FYU;6)E<B!O<'1I;VYS(BP (F8B+"`B>"(L(")A(BP (FPB+"`B9"(L(")U M:2(I.PT*"0EO<'1I;VY087)S97(N861D3W!T:6]N(2AC:&%R6UTI*&YU;&PL M(")B87(B+"`B;6%K92!I="!H87!P96XB+"`B0DQ/0B(L(")D969A=6QT+79A M<V(B+"`B<VAA8F%N9R(L(")B;&]W('5P(BP (DE4(BP <VAA8F%N9T1F;'0I M.PT*"0EO<'1I;VY087)S97(N;6%K94=R;W5P*")S=')I;F< ;W!T:6]N<R(L M*")M>6%P<"!L86QA("UV("TM9F]O/3DX-RXV-2`M+6)A<B!B87(M<W1R:6YG M.PT*"7-T871I8R!C:&%R6UU;72!L969T;W9E<B`](%LB;&%L82(L(FAO:&\B M<G0 *")V97)B;W-E(B!I;B!O<'1I;VYS("8F(")V(B!I;B!O<'1I;VYS*3L- M" EA<W-E<G0 *")F;V\B(&EN(&]P=&EO;G, )B8 (F8B(&EN(&]P=&EO;G,I M.PT*"6%S<V5R="`H;W!T:6]N<ULB9F]O(ETN9V5T5F%L=64A*&9L;V%T*2`] M<V5R="`H;W!T:6]N<ULB8F%R(ETN9V5T5F%L=64A*&-H87);72D /3T (F)A M<BUS=')I;F<B*3L-" EA<W-E<G0 *")A<'!L92( :6X ;W!T:6]N<R`F)B`B M6UTI(#T](&%P<&QE24$I.PT*"6%S<V5R="`H(G-H86)A;F<B(&EN(&]P=&EO M="`H;W!T:6]N<ULB<VAA8F%N9R)=+F=E=%9A;'5E(2AC:&%R6UU;72D /3T M<W!L:70H(FUY87!P("TM=F5R8F]S92`M+6%P<&QE/2P ;&%L82!H;VAO(&%S M9&8 +2US:&%B86YG(&]N;'E/;F4 +68M,"XY,S%E+34B*3L-" EO<'1I;VYS M(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I.PT*"6%S<V5R="`H87)G<R`] M<W-E<G0 *&]P=&EO;G-;(F8B72YG971686QU92$H9FQO870I(#T]("TP+CDS M,64M-68I.PT*"6%S<V5R="`H(F$B(&EN(&]P=&EO;G,I.PT*"2\O(&EF('EO M=2!R96%L;'D =V%N="!T;R!G:79E(&$ ;G5L;"!V86QU92UA<G)A>2P >6]U M(&-A;B!G:79E(&IU<W0 82`G+"<-" EA<W-E<G0 *&]P=&EO;G-;(F%P<&QE M(ETN9V5T5F%L=64A*&EN=%M=*2`]/2!N=6QL*3L-" EA<W-E<G0 *")S:&%B M86YG(B!I;B!O<'1I;VYS*3L-" ES=&%T:6, 8VAA<EM=6UT <VAA8F%N9T-! M03( /2!;(F]N;'E/;F4B73L-" EA<W-E<G0 *&]P=&EO;G-;(G-B(ETN9V5T M;VY087)S97(H*3L-" EA<F=S(#T M/3DY+"PB*3L-" EO<'1I;VYS(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I M.PT*"6%S<V5R="`H(G-H86)A;F<B(&EN(&]P=&EO;G, )B8 (G-B(B!I;B!O M<'1I;VYS*3L-" EA<W-E<G0 *&]P=&EO;G-;(G-B(ETN9V5T5F%L=64A*&-H M6R)X96YO(ETN9V5T5F%L=64A*&EN="D /3T ,3(S*3L-" EA<W-E<G0 *")B M87(B(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H;W!T:6]N<ULB8F%R(ETN9V5T M5F%L=64A*&-H87);72D /3T (F1E9F%U;'0M=F%L=64B*3L-" EA<W-E<G0 M*")L;VYG(B!I;B!O<'1I;VYS("8F(")L(B!I;B!O<'1I;VYS*3L-" EA<W-E M<G0 *&]P=&EO;G-;(FQO;F<B72YG971686QU92$H;&]N9RD /3T +3$Q-3(Y M;&4B72YG971686QU92$H9&]U8FQE*2`]/2`Q+C<Y-S8P92LR.3$I.PT*"7-T M871I8R!U:6YT6UT =6EA(#T M;W!T:6]N<R`F)B`B=6DB(&EN(&]P=&EO;G,I.PT*"6%S<V5R="`H;W!T:6]N M8VL 3W!T:6]N17)R;W( *'1H97-E(&-A=7-E('!R;V-E<W, =&\ 97AI="P M("` ("` ("` ($D 8VAE8VME9"!T:&5M(&%L;"!O;F4 8GD ;VYE*0T*"2\O M9W, /2!S<&QI=" B;7EA<'` +2UB87(B*3L-" EO<'1I;VYS(#T ;W!T:6]N M("TM8F%R/2(I.PT*"6]P=&EO;G, /2!O<'1I;VY087)S97(N<&%R<V4H87)G M<RD[*R\-" DO+R!N;R!S=6-H(&]P=&EO; T*"2\K87)G<R`]('-P;&ET*")M M+R]A<F=S(#T M;VYS(#T ;W!T:6]N4&%R<V5R+G!A<G-E*&%R9W,I.PT*"2\K87)G<R`]('-P M<BYP87)S92AA<F=S*3LK+PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"`M+75I M;G0 -34L,C,L+3$R+#DY M87)S92AA<F=S*3LK+PT*"2\O(&UI<W-I;F< ;6%N9&%T;W)Y(&]P=&EO;B`M M+69O;PT*"2\K87)G<R`]('-P;&ET*")M>6%P<"(I.PT*"6]P=&EO;G, /2!O M<GD >PT*"0D)+R]D96)U9R!W<FET969L;B B9F%I;', 86)O=70 =&\ 8V%L M87)S945R<F]R(&]P92D >PT*"0D)9F%I;&5D(#T =')U93L-" D)"61E8G5G M<F5T=7)N(&9A:6QE9#L- M;W(-" DO+R!$340 8G5G('=I=& ;F5S=&5D(&1E;&5G871E<R!T:')O=VEN M9R]C871C:&EN9R!P<F5V96YT<R!F86EL<R I(&9R;VT =V]R:VEN9RP-" DO M+R!S;R!U;G1I;"!T:&%T)W, 9FEX960L(&)E;&]W(&%R92!N;W0 87-S97)T M*&9A:6QS*"XN+BDI('-O($D 8V]U;&0 =&5S="!T:&5M(&5A8V -" EN97=/ M<W-E<G0 *&9A:6QS*&1E;&5G871E('9O:60 *"D >V]P=&EO;E!A<G-E<BYA M9&1/<'1I;VXA*&-H87);72DH(G B*3M]*2D[("\O($1-1"!B=6<Z('1H92!/ M<'1087)S945R<F]R(&ES;B=T(&-A=6=H="!B>2!F86EL<PT*"2\O;W!T:6]N M4&%R<V5R+F%D9$]P=&EO;B$H8VAA<EM=*2 B>"(I.PT*"2\O('5N<W5P<&]R M=&5D('1Y<&4-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-D;W5B;&4I M<&4-" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&-H87);72DH(GHB+&YU M" DO+V]P=&EO;E!A<G-E<BYA9&1/<'1I;VXA*&EN="DH(GHB+&YU;&PL;G5L M875L="!V86QU90T*"2\O;W!T:6]N4&%R<V5R+F%D9$]P=&EO;B$H*2 B>B(L M;G5L;"QN=6QL+&YU;&PL,3(S*3L-" DO+R!.;U9A;'5E(&1E9F%U;'1686QU M92!M=7-T(#T](&YU;&P =VAE;B!M86YD871O<GD-" DO+V]P=&EO;E!A<G-E M87!P("UV(&%S9&8 +2UX96YO/34T,S(Q('AY>B`M9C`N.3DB*3L-" DO+V]P M92`](&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H:6YT*3L-" DO+V%S M<V5R="`H9F%I;',H9&5L96=A=&4 =F]I9"`H*2![(&]P=&EO;G-;(G9E<F)O M<V4B72YG971686QU92$H8F]O;"D[('TI*3L ("\O(&-A=7-E<R!$340 8G5G M($D 8V%N)W0 <F5P<F]D=6-E('-I;7!L97(L(&EF(&)O;VP 8B`]('-T871M M97(N;6%K94=R;W5P*")C<F%P(&]P=&EO;G,B+"`B;6ES<VEN9R(I.PT*"2\O M<'1I;VY087)S97(N861D3W!T:6]N(2 I*&YU;&PL(&YU;&PL(")W:&%T(&%M M($D 9&]I;F<_(2(I.PT*"2\O(&UI<W-I;F< 9W)O=7` =&ET;&4-" DO+V]P M=&EO;E!A<G-E<BYM86ME1W)O=7`H;G5L;"P (G9E<F)O<V4B*3L-" DO+R!W M<VEO;B`H3W!T4&%R<V5-86EN*0T*>PT*"2\J* T*"2`J(%=O<FMI;F< 97AA M;7!L92!U<V%G92X-" D *B\-" EI;G0 ;6%I;B`H8VAA<EM=6UT 87)G<RD- M:&%R6UU;72!F:6QE<SL-" T*"0DO+R!C;VYS=')U8W1O<B!A<F=S(&%R92!U M<V5D(&EN('!R:6YT:6YG(&AE;'`-" D)+R\ ;W!T:6]N("UH("\ +2UH96QP M(&ES(&%L=V%Y<R!A9&1E9"!B>2!D969A=6QT(&%N9"!U<V5S('!R;V=R86TM M;F%M92!A;F0 =7-A9V4-" D)+R\ ;W!T:6]N("TM=F5R<VEO;B`H;F\ <VAO M<G0 ;F%M92D :7, 861D960 8GD 9&5F875L="!I9B!V97)S:6]N(&ES(&=I M<F]G<F%M+6YA;64 ("` ("` ("` ("` ("!U<V%G92` ("` ("` ("` ("` M97(H7U]&24Q%7U];,"XN)"TR72P (EMO<'1I;VYS72`M+69I;&5S/68Q+&9. M(%MO=71F:6QE72(L("(P+C,B*3L-" T*"0DO+R!I;G0L('-H;W)T(&%N9"!L M;VYG+"!H96QP+"!M971A=F%R+"!N;R!D969A=6QT+"!N;W0 ;6%N9&%T;W)Y M<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO<F4 86YD(&UO M<F4 86YD(&UO<F4 =F5R8F]S92XB+"`B3$5614PB*3L-" D)+R\ 8V]M;6$M M<V5P87)A=&5D('-T<FEN9R!L:7-T+"!S:&]R="!A;F0 ;&]N9RP :&5L<"P M;B$H8VAA<EM=6UTI*")F<R(L(")F:6QE<R(L(")&:6QE<R!T;R!P<F]C97-S M+"!A;F0 ;6%K92!T:&ES(&$ <F5A;&QY(&QO;F< :&5L<"!S=')I;F< 87, M=V5L;"!T;R!T97-T(&%L:6=N:6YG+B(L(")&24Q%+$9)3$4L+BXN(BP ;G5L M87(L(&1E9F%U;'0L(&YO="!M86YD871O<GD-" D);W`N861D3W!T:6]N(2AF M;&]A="DH;G5L;"P (G1H:6YG(BP (D1O(&ET('=I=& =&AI<RXB+"`B1DQ/ M050B+"`M-"XR.3=E,C%F*3L-" D)+R\ ;F\M=F%L=64L('-H;W)T+6]N;'DL M('=I=& :&5L<"P ;F\ ;65T879A<BP ;F\ 9&5F875L="P ;F]T(&UA;F1A M=&]R>0T*"0EO<"YA9&1/<'1I;VXA*"DH(F$B+"!N=6QL+"`B57-E(&%L=&5R M:6YE(&%R9W5M96YT<RP :6YC;'5D:6YG(&%R9W-;,%T <')O9W)A;2UN86UE M("AI="=S('-K:7!P960I+ T*"0DO+R!!<F=S('=I;&P 8F4 <F5S970 =&\ M=&AE(')E;6%I;FEN9R!N;VXM;W!T:6]N(&-O;6UA;F0M;&EN90T*"0DO+R!A M(&]P=&EO;B!W87, 9VEV96X ;VX =&AE(&-O;6UA;F0M;&EN90T*"0DO+R!B M>2!U<VEN9R`H8VAA<EM=(&EN($]P=&EO;G,I+ T*"0DO+R!)9B!T:&4 ;W!T M:6]N(&AA<R!B;W1H('-H;W)T(&%N9"!L;VYG(&YA;65S+"!E:71H97( 8V%N M($EF(&]P=&EO;B!W87, 9VEV96X 86YD(&ET(&AA<R!A('9A;'5E+`T*"0D) M+R\ <F5T<FEE=F4 :70 8GD :6YD97AI;F< 3W!T:6]N<R!W:71H('-H;W)T M+R!A;F0 9&\ 9V5T5F%L=64A*%9A;'5E5'EP92D-" D)"79E<F)O<VET>2`] M(&]P=&EO;G-;(G9E<F)O<V4B72YG971686QU92$H:6YT*3L-" T*"0EI9B`H M=F5R8F]S:71Y(#X ,"D-" D)"7=R:71E9FQN*")))VQL('-A>2!A(&QI='1L M;"!S87D 82!L;W0 ;6]R92XB*3L-" T*"0DO+R!A<F=S('=A<R!R97-E="!B M>2!P87)S92!T;R!T:&4 <F5M86EN:6YG(&YO;BUO<'1I;VX 8V]M;6%N9"UL M:6YE(&%R9W5M96YT<PT*"0EI9B`H87)G<RYL96YG=& /3T ,2D-" D)"2\O M('5S92!T:&4 9FER<W0 ;F]N+6]P=&EO;B!A<F=U;65N=`T*"0D);W5T9FEL M"2\O($]P=&EO;D5R<F]R+F5R<F]R17AI=" B;65S<V%G92(I(&-A;B!B92!U M<V5D('1O('!R:6YT(&AE;'` 86YD(&5X:70 <')O8V5S<SL-" D)"2\O('5S M<"YE<G)O<D5X:70H(FUO<F4 =&AA;B!O;F4 ;W5T<'5T(&9I;&4 <W!E8VEF M960 =&\ 8F4 =&AE<F4 869T97( <&%R<V4H87)G<RD-" D)87-S97)T(" B M9FEL97,B(&EN(&]P=&EO;G,I.PT*"0EF:6QE<R`](&]P=&EO;G-;(F9I;&5S M(ETN9V5T5F%L=64A*&-H87);75M=*3L-" D):68 *&9I;&5S+FQE;F=T:"`] M/2`P*0T*"0D);W`N97)R;W)%>&ET*")N965D('1O('-P96-I9FEY(&%T(&QE M;&XH(FUY('1H:6YG(&ES.B`B+"!O<'1I;VYS6R)T:&EN9R)=+F=E=%9A;'5E M<R!U<VEN9R!A;'1E<FYA=&4 ;65T:&]D.B(I.PT*"0D)96QS90T*"0D)"7=R M:71E9FQN*"))('=O=6QD('!R;V-E<W, 9FEL97, =7-I;F< ;F]R;6%L(&UE M=&AO9#HB*3L-" D)"69O<F5A8V *&-H87);72!F.R!F:6QE<RD-" D)"0EW M<FET969L;B B7'0B+&8I.PT*"0D)=W)I=&5F;&XH(F%N9"!O=71P=70 =&\ M(BP ;W5T9FEL92YL96YG=& /R!O=71F:6QE(#H :"7T-" T*"0ER971U<FX ,#L- ` end
Jun 01 2005
Cool, Derick! What about using box values there? Having them and use TypeList instead of optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]", "0.0"); optionParser.addOption!()("v","verbose"); optionParser.addOption!(float)("f","foo",null,null,null,true); optionParser.addOption!(int)("x","xeno","does this and that","THING",123); will allow to build such declarations in compile time - statically. Just hypothesis.... Andrew. <derick_eddington nospam.yashmoo.com> wrote in message news:d7g5nd$3i3$1 digitaldaemon.com...I've made a command-line option helper similar to Python's optparse. It allows you to specify what D-type you want the option as, short name, long name, help, and more. It automatically creates a formatted help message and prints it on errors. It checks that clients' usage of the module is proper; and it checks that the command-line arguments meet what was specified. It has a compehensive unittest that demonstrates more. The source is attached. : /** : * Example usage: : */ : int main (char[][] args) : { : int verbosity; : char[] outfile; : char[][] files; : : // Constructor parameters are used in printing help. : // -h / --help is always added by default : // and uses program-name and usage. : // --version (no short name) is added by : // default if version is given. : // program-name : OptionParser op = new OptionParser(__FILE__[0..$-2], : // usage version : "[options] --files=f1,fN [outfile]", "0.2"); : : // int, short and long, help, metavar, : // no default, not mandatory : op.addOption!(int)("v", "verbose", : "Be more and more and more and more and more " : "and more and more verbose.", "LEVEL"); : // comma-separated string list, short and long, help, : // metavar, no default, mandatory : op.addOption!(char[][])("fs", "files", : "Files to process, and make this a really long help " : "string as well to test aligning.", "FILE,FILE,...", : null, true); : // float, long-only, help, metavar, default, not mandatory : op.addOption!(float)(null, "thing", "Do it with this.", : "FLOAT", -4.297e21f); : // no-value, short-only, with help, no metavar, : // no default, not mandatory : op.addOption!()("a", null, "Use alternate method."); : : // Parse command-line arguments, including args[0] : // program-name (it's skipped). : // args will be reset to the remaining non-option : // command-line arguments in the order they appeared. : Options options = op.parse(args); : : // Check if option was given on the command-line : // by using (char[] in Options). : // If the option has both short and long names, : // either can be used. : if ("verbose" in options) : // If option was given and it has a value, : // retrieve it by indexing Options with short : // or long name (or only one if only one) : // and do getValue!(T) : verbosity = options["verbose"].getValue!(int); : : if (verbosity > 0) : writefln("I'll say a little."); : if (verbosity > 1) : writefln("I'll say a lot more."); : : // args was reset by parse to the remaining : // non-option command-line arguments : if (args.length == 1) : // use the first non-option argument : outfile = args[0]; : else if (args.length > 1) : // OptionError.errorExit("message") can be used to : // print help and exit process; : // useful when checking non-option arguments : op.errorExit("more than one output file specified"); : : // mandatory options can be assumed to be : // there after successful parse : assert ("files" in options); : files = options["files"].getValue!(char[][]); : if (files.length == 0) : op.errorExit("need to specifiy at least one input file"); : : if (verbosity > 0) : { : if ("thing" in options) : writefln("my thing is: ", : options["thing"].getValue!(float)); : : // no-value options are simply tested for being in Options : if ("a" in options) : writefln("I would process files using alternate method:"); : else : writefln("I would process files using normal method:"); : foreach (char[] f; files) : writefln("\t",f); : writefln("and output to ", : outfile.length ? outfile : "<stdout>"); : } : : return 0; : } Example command-line output of above program: --------------------------------------------------------------- $ ./example -h usage: optparse [options] --files=f1,fN [outfile] options: -h, --help Show this help message and exit. --version Show program's version number and exit. -vLEVEL, --verbose=LEVEL Be more and more and more and more and more and more and more verbose. -fsFILE,FILE,..., --files=FILE,FILE,... Files to process, and make this a really long help string as well to test aligning. --thing=FLOAT Do it with this. -a Use alternate method. --------------------------------------------------------------- $ ./example -v2 --files=somefile,anotherfile,nextfile --thing -4.23e-6 -a outputfile I'll say a little. I'll say a lot more. my thing is: -4.23e-06 I would process files using alternate method: somefile anotherfile nextfile and output to outputfile --------------------------------------------------------------- $ ./example --asdf optparse: error: no such option: --asdf [help] --------------------------------------------------------------- $ ./example optparse: error: -fs / --files option is mandatory [help]
May 31 2005
If it could be setup statically at compile-time and have the same conciseness, flexibility, and ease of checking for options and retrieving their values, that would be awesome, but I don't follow what you mean about box values and TypeList. Could you elaborate? The only way to parameterize something at compile-time is with templates, right? But they can only take integral values, not char[] for option names or arbitrary types for default values. Statically-initialized structs could be used but then they still have to be given to an OptionParser and variables for them would also need to be declared. I don't think it can be done and retain the same degree of simpleness of use. In article <d7iifp$2jhh$1 digitaldaemon.com>, Andrew Fedoniouk says...Cool, Derick! What about using box values there? Having them and use TypeList instead of optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]", "0.0"); optionParser.addOption!()("v","verbose"); optionParser.addOption!(float)("f","foo",null,null,null,true); optionParser.addOption!(int)("x","xeno","does this and that","THING",123); will allow to build such declarations in compile time - statically. Just hypothesis.... Andrew.
Jun 01 2005
<derick_eddington nospam.yashmoo.com> wrote in message news:d7jvl1$1420$1 digitaldaemon.com...If it could be setup statically at compile-time and have the same conciseness, flexibility, and ease of checking for options and retrieving their values, that would be awesome, but I don't follow what you mean about box values and TypeList. Could you elaborate? The only way to parameterize something at compile-time is with templates, right? But they can only take integral values, not char[] for option names or arbitrary types for default values. Statically-initialized structs could be used but then they still have to be given to an OptionParser and variables for them would also need to be declared. I don't think it can be done and retain the same degree of simpleness of use.Yep. You are right. I was thinking about simple implementation of something close to boost::spirit http://spirit.sourceforge.net/ but it seems like even simple implementation is an overkill for such task. Andrew.In article <d7iifp$2jhh$1 digitaldaemon.com>, Andrew Fedoniouk says...Cool, Derick! What about using box values there? Having them and use TypeList instead of optionParser = new OptionParser(__FILE__[0..$-2], "[option [value]]", "0.0"); optionParser.addOption!()("v","verbose"); optionParser.addOption!(float)("f","foo",null,null,null,true); optionParser.addOption!(int)("x","xeno","does this and that","THING",123); will allow to build such declarations in compile time - statically. Just hypothesis....Andrew.
Jun 01 2005