FW: (Long) Fix to ldapd's modify.c: merge modify changes with current

Peter Whittaker (pww@entrust.com)
Fri, 25 Oct 1996 07:47:58 -0400

I mailed the (rather large) message below only to discover that the
majordomo handling this list has a 40KB limit (that's kind of small with
people like on the list :->). Thanks to Mark (mcs@netscape.com) for
pointing this out, and for agreeing that this message is appropriate to
this list (owing to the uncertainty over future releases from UMich).

To get around the limit, I'm splitting one of the attachments out from
the original note: the original note follows below, with the status
tracker diff file; the complete diff file will come separately (chances
are you don't need it and that the note below will be enough).

pww

>----------
>From: Peter Whittaker
>Sent: Tuesday, October 22, 1996 12:17 PM
>To: 'The LDAP Mailing List'
>Cc: 'LDAP Bugs at Umich'; 'LDAP Support at UMich'
>Subject: (Long) Fix to ldapd's modify.c: merge modify changes with current
>entry prior to making modification.
>
>I apologize for sending this to the mailing list, the bug address, and the
>support address, as this is a bug/support issue, but I'm unsure whether the
>bug and support addresses are monitored now that Tim, et. al., have left for
>other pastures, and, given the uncertain fate of future releases from UMich
>(at least last I read, it was uncertain), I thought most readers of the list,
>who probably represent a fair portion of the UMich user base, would be
>interested in this problem and fix.
>
>The attached files are explained below. Please bear with this note, it is
>long, but worthwhile (AFAIK, IMHO, YMMV :->).
>
>Enough with the rationalizing, what's the problem, why I have included this
>fix, and what does it do?
>
>If one performs an LDAP modify operation on an entry, and attempts to add and
>delete values of an attribute, the operation's success depends on the order
>in which the add and delete components are specified; this seemed wrong to
>me, so I fixed it.
>
>To explain by example: assume you wish to change a single value of an
>attribute that may have multiple values, and that be updated by multiple
>authorities, i.e., you wish to replace a particular value of an attribute,
>not all values, in order to avoid trampling values written in by other
>applications. (If you didn't care about others, you'd use MOD_REPLACE and
>there would be no problem (so long as you have the modification order fix to
>replace_mod() that I submitted quite some time ago, see below for more on
>this, it's also DSA dependent).)
>
>Let's say you want to replace "foo=pub" with "foo=bar", "foo=pub" exists, and
>"foo=bar" does not.
>
>When constructing your request, you could do it as either
>
> Type: foo
> Add value: bar
> Type foo
> Delete value: pub
>
>or
>
> Type: foo
> Delete value: pub
> Type: foo
> Add value: bar
>
>If the attribute has multiple values, either formulation will work. If the
>attribute has only one value, the second formulation may work or may fail (it
>depends on the type of DSA being used), while the first will always succeed
>but fail to do what you want it to (more on this below).
>
>Why? Because the UMich ldapd reads the entry, and compares what you want to
>do with what it read as it builds the DAP request; unfortunately, it forgets
>what you have already asked it to do.
>
>In other words, it reads the first formulation and says:
>
> Read the entry
>
> Add the value "bar" to attribute foo: at the time of the read, foo existed,
> so this is an AddAttributeValue operation
>
> Delete the value "pub": at the time of the read, pub was foo's only value,
> so delete foo.
>
>In other words, ldapd adds the value you wanted, then deletes the attribute.
>Not good.
>
>In the case of the second formulation, it does the following:
>
> Read the entry
>
> Delete the value "pub": at the time of the read, pub was foo's only value,
> so delete foo.
>
> Add the value "bar" to attribute foo: at the time of the read, foo existed,
> so this is an AddAttributeValue operation
>
>While this looks the same, the result depends on the DSA involved: a QUIPU
>DSA will do what you wanted, but other DSAs may reject the AddAttributeValue
>operation with a "No such attribute" error. The reason is that by the time
>the AddAttributeValue operation hits the DSA, the attribute no longer exists:
> since X.500 insists that an attribute must exist in order for an
>AddAttributeValue operation to succeed, a purely conformant DSA will reject
>that operation; QUIPU, in its non-pedantic mode, will helpfully assume that
>what you wanted to do was have an attribute with (at least) that value, so it
>goes ahead and creates the attribute if it doesn't exist.
>
>OK. Enough of that. The question is, should the order of AddValue and
>DeleteValue matter to ldapd? I don't think so. So added code to track the
>status of any particular attribute, and, when adding or deleting values to
>that attribute, reference the status of the attribute, as modified by
>previous components of the current operation, as part of deciding exactly
>what kind of mod to make to the entry
>
>The basic algorithm is this:
>
> Prior to reading the list of modifications, initialize the status tracker
> For every attribute listed in the modify request, add the
> attribute to the tracker
> When deciding whether to delete a value or delete the
> attribute, or add a value or add the attribute, check if
> previous operations will have left the attribute with or
> without values; based on this, make the current operation
> a delete value, delete attribute, add value, or add attribute,
> as appropriate.
> Once the modification request has been read, or if errors have been
> encountered, destroy the status tracker prior to returning.
>
>Note that adding an attribute to the status tracker is idempotent: if it's
>not there, it's added, if it is there, OK.
>
>Once more, an apology: for various reasons, I currently use the 3.1
>distribution from UMich (it's stable, it works in the field, if it ain't
>broke, don't fix it); thus, my version of modify.c won't line up exactly
>with yours, and it contains some of my editorial comments that accompanied
>previous fixes, which were wisely deleted by the kind folks at UMich prior to
>inclusion in 3.2 or 3.3 (whichever one they made it into).
>
>The file modify.c.statTracker.diffs contains a context-diff between my
>current version of modify.c and the one that did not contain the status
>tracker code; I've included it as it is the simplest way for someone else to
>figure out what I added and what I changed: line numbers won't line up, but
>you'll get the idea.

>

>The file modify.c.diffs contains all diffs between my current modify.c and
>the original UMich 3.1 modify.c.
>
>These include:
>
> The status tracker diffs.
>
> Better attribute value comparisons when values are large, and the Attr_.*()
> routines think that the values are stored in files instead of in memory.
>
> Changed order of add values and delete values in replace_mod() to work with
> conformant DSAs.
>
>To explain that latter point: the UMich 3.1 ldapd would order operations in
>replace_mod() as delete values first, then add values; this worked fine
>against QUIPU, but was rejected by conformant DSAs, as the add value
>operations specified non-existent attributes, as the attributes had been
>deleted by the delete value operations (deletion of the last value deletes
>the attribute). My change is to add the new values first, which will work,
>then to delete the old values.
>
>pww
>
>
>
>Peter Whittaker [~~~~~~~~~~~~~~~~~~~~~~] X.500 Specialist
>pww@entrust.com [http://www.entrust.com] Nortel Secure Networks
>Ph: +1 613 765 2064 [ ] P.O. Box 3511, Station C
>FAX:+1 613 765 3520 [______________________] Ottawa, Canada, K1Y 4H7
>
>

begin 600 modify.c.statTracker.diffs
M*BHJ(&UO9&EF>2YC+D5N="TR+C$)5'5E($UA>2 R,2 Q-3HP-SHQ,R Q.3DV
M"BTM+2!M;V1I9GDN8PE-;VX@3V-T(" W(#$U.C Q.C Y(#$Y.38**BHJ*BHJ
M*BHJ*BHJ*BHJ"BHJ*B R-2PS," J*BHJ"BTM+2 R-2PU.2 M+2TM"B @(VEN
M8VQU9&4@(FQD87 N:"(*(" C:6YC;'5D92 B8V]M;6]N+F@B"B @"BL@+RH@
M5')A8VMI;F<@=VAA="!A;B!E;G1R>2!W:6QL(&QO;VL@;&EK92!A9G1E<B!A
M;B!O<&5R871I;VX@8V]M<&QE=&5S("HO"BL@='EP961E9B!I;G0)0D]/3$5!
M3CL**R C9&5F:6YE($9!3%-%"3 **R C9&5F:6YE(%12544),0HK( HK('1Y
M<&5D968@<W1R=6-T('-T8714<F%C:V5R('L**R @(" @071T<FEB=71E5'EP
M90E!='1R5&]4<F%C:SL**R @(" @0D]/3$5!3@D)2&%S5F%L=65S.PHK(" @
M("!"3T],14%."0E$96QE=&5D.PHK(" @("!S=')U8W0@<W1A=%1R86-K97()
M*E-T871.97AT.PHK( HK('T@<W1A=%1R86-K97(L("I3=&%T5')A8VME<CL*
M*R **R C9&5F:6YE(%-T871.=6QL("A3=&%T5')A8VME<BD@3E5,3 HK( HK
M(%-T8714<F%C:V5R"5-T871(96%D(#T@4W1A=$YU;&P["BL@4W1A=%1R86-K
M97()4W1A=%1A:6P@/2!3=&%T3G5L;#L**R **R!3=&%T5')A8VME<@ES=&%T
M5')A8VM);FET:6%L:7IE*"D["BL@=F]I9 D)<W1A=%1R86-K1&5S=')O>2@I
M.PHK(%-T8714<F%C:V5R"7-T8714<F%C:TEN<V5R="@I.PHK('9O:60)"7-T
M8714<F%C:T%D9"@I.PHK("\J(&YE8V5S<V%R>3\**R!V;VED"0ES=&%T5')A
M8VM!9&1686QU97,H*3L**R J+PHK('9O:60)"7-T8714<F%C:T1E;&5T92@I
M.PHK($)/3TQ%04X)"7-T8714<F%C:TAA<U9A;'5E<R@I.PHK($)/3TQ%04X)
M"7-T8714<F%C:T1E;&5T960H*3L**R!3=&%T5')A8VME<@ES=&%T5')A8VM&
M:6YD*"D["B @<W1A=&EC($-O;6UO;D%R9W,)8V]M;6]N(#T@9&5F875L=%]C
M;VUM;VY?87)G<SL*(" *("!E>'1E<FX@<VAO<G0);&1A<%]P:&]T;U]S>6YT
M87@["BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@,34W+#$V,B J*BHJ"BTM+2 Q.#8L
M,C P("TM+2T*(" *(" )1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")D;U]M
M;V1I9GDR7&XB+" P+" P+" P("D["B @"BL@"2\J"BL@"2 @26YI=&EA;&EZ
M92!T:&4@<W1A='5S('1R86-K97(**R )*B\**R ):68@*"!.54Q,(#T]('-T
M8714<F%C:TEN:71I86QI>F4H*2 I('L**R )(" @('-E;F1?;&1A<%]M<V=R
M97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL"BL@"0E,1$%07T]015)!5$E/
M3E-?15)23U(L($Y53$PL(")#86YN;W0@:6YI=&EA;&EZ92!M;V0@=')A8VME
M<BXB("D["BL@"2 @("!R971U<FXH(# @*3L**R )?0HK( H@( EM82YM96%?
M8VAA;F=E<R ]($Y53$Q-3T0["B @"69O<B H(&UO9',@/2!M+3YM7VUO9',[
M(&UO9',@(3T@3E5,3#L@;6]D<R ](&UO9',M/FUO9%]N97AT("D@>PH@( D)
M<W1R=6-T(&5N=')Y;6]D"2IE;3L**BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B Q-C8L
M,3@P("HJ*BH*(" )"2 @("!S:7IE;V8H<W1R=6-T(&5N=')Y;6]D*2 I*2 ]
M/2!.54Q,34]$("D@>PH@( D)"7-E;F1?;&1A<%]M<V=R97-U;'0H(&-L:65N
M='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?3U!%4D%424].4U]%4E)/
M4BP@3E5,3"P@(DUA;&QO8R!E<G)O<B(@*3L*(" )"0ER971U<FXH(# @*3L*
M(" )"7T*(" )"65M+3YE;5]N97AT(#T@3E5,3$U/1#L*(" *(" )"6EF("@@
M*&YE=R ](&=E=%]A<R@@8VQI96YT<V(L($U/1%1!1RP@;2P*(2 )"2 @("!M
M;V1S+3YM;V1?='EP92P@;6]D<RT^;6]D7V)V86QU97,@*2D@/3T@3E5,3$%4
M5%(@*0H@( D)"7)E='5R;B@@," I.PH@( D)96TM/F5M7W=H870@/2!N97<[
M"B @"B @"0EF;W(@*"!A<R ](')R+3YR9')?96YT<GDN96YT7V%T='([(&%S
M("$]($Y53$Q!5%12.PH@( D)(" @(&%S(#T@87,M/F%T=')?;&EN:R I('L*
M(" )"0EI9B H($%T=')47V-M<"@@;F5W+3YA='1R7W1Y<&4L(&%S+3YA='1R
M7W1Y<&4@*2 ]/2 P("D*+2TM(#(P-"PR,S,@+2TM+0H@( D)(" @('-I>F5O
M9BAS=')U8W0@96YT<GEM;V0I("DI(#T]($Y53$Q-3T0@*2!["B @"0D)<V5N
M9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/1%1!1RP@;2P*(" )"0D@
M(" @3$1!4%]/4$52051)3TY37T524D]2+"!.54Q,+" B36%L;&]C(&5R<F]R
M(B I.PHK( D)"7-T8714<F%C:T1E<W1R;WDH*3L*(" )"0ER971U<FXH(# @
M*3L*(" )"7T*(" )"65M+3YE;5]N97AT(#T@3E5,3$U/1#L*(" *(" )"6EF
M("@@*&YE=R ](&=E=%]A<R@@8VQI96YT<V(L($U/1%1!1RP@;2P*(2 )"2 @
M("!M;V1S+3YM;V1?='EP92P@;6]D<RT^;6]D7V)V86QU97,@*2D@/3T@3E5,
M3$%45%(@*2!["B$@"0D)<W1A=%1R86-K1&5S=')O>2@I.PH@( D)"7)E='5R
M;B@@," I.PHK( D)?0H@( D)96TM/F5M7W=H870@/2!N97<["B @"BL@"0DO
M*@HK( D)("!);G-E<G0@=&AI<R!A='1R:6)U=&4@:6YT;R!T:&4@=')A8VMI
M;F<@8VAA:6X["BL@"0D@(&]P97)A=&EO;B!I<R!I9&5M<&]T96YT.B @9&]I
M;F<@:70@82!S96-O;F0@=&EM90HK( D)("!H87,@;F\@969F96-T+"!C=7)R
M96YT('-T871U<R!I<R!P<F5S97)V960N"BL@"0DJ+PHK( D):68@*"!.54Q,
M(#T]('-T8714<F%C:TEN<V5R="AN97<M/F%T=')?='EP92D@*2!["BL@"0D@
M(" @<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/1%1!1RP@;2P*
M*R )"0E,1$%07T]015)!5$E/3E-?15)23U(L($Y53$PL"BL@"0D)(D-A;FYO
M="!U<&1A=&4@;6]D('1R86-K97(N(B I.PHK( D)(" @(')E='5R;B@@," I
M.PHK( D)?0HK( H@( D)9F]R("@@87,@/2!R<BT^<F1R7V5N=')Y+F5N=%]A
M='1R.R!A<R A/2!.54Q,05144CL*(" )"2 @("!A<R ](&%S+3YA='1R7VQI
M;FL@*2!["B @"0D):68@*"!!='1R5%]C;7 H(&YE=RT^871T<E]T>7!E+"!A
M<RT^871T<E]T>7!E("D@/3T@," I"BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@,3@U
M+#$Y," J*BHJ"BTM+2 R,S@L,C0T("TM+2T*(" )"2 @("!M;V1S+3YM;V1?
M;W @(3T@3$1!4%]-3T1?1$5,151%("D@>PH@( D)"7-E;F1?;&1A<%]M<V=R
M97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?24Y6
M04Q)1%]364Y405@L($Y53$PL(").;R!V86QU97,@<W!E8VEF:65D(B I.PHK
M( D)"7-T8714<F%C:T1E<W1R;WDH*3L*(" )"0ER971U<FXH(# @*3L*(" )
M"7T*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B Q.3(L,C T("HJ*BH*(" )"6-A
M<V4@3$1!4%]-3T1?041$.@H@( D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L
M(")!1$0Z7&XB+" P+" P+" P("D["B @"B$@"0D):68@*"!A<R ]/2!.54Q,
M05144B I('L*(" )"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP@(EQT871T
M<FEB=71E7&XB+" P+" P+ H@( D)"0D@(" @," I.PH@( D)"0EE;2T^96U?
M='EP92 ]($5-7T%$1$%45%))0E5413L*(" )"0E](&5L<V4@>PH@( D)"0E$
M96)U9R@@3$1!4%]$14)51U]!4D=3+" B7'1V86QU97-<;B(L(# L(# L(# @
M*3L*(" )"0D)96TM/F5M7W1Y<&4@/2!%35]!1$1604Q515,["B @"0D)?0H@
M( D)"6)R96%K.PH@( HM+2T@,C0V+#(W-" M+2TM"B @"0EC87-E($Q$05!?
M34]$7T%$1#H*(" )"0E$96)U9R@@3$1!4%]$14)51U]!4D=3+" B041$.EQN
M(BP@,"P@,"P@," I.PH@( HA( D)"6EF("@@87,@/3T@3E5,3$%45%(@)B8*
M(2 )"0D@(" @(7-T8714<F%C:TAA<U9A;'5E<RAN97<M/F%T=')?='EP92D@
M*2!["B$@"0D)(" @("\J"4EF(&ET(&ES;B=T(&EN('1H92!E;G1R>2!A;F0@
M=V4@:&%V96XG="!Y970*(2 )"0D)861D960@=F%L=65S+"!T:&5N(&%D9"!T
M:&4@871T<FEB=71E("HO"B @"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L
M(")<=&%T=')I8G5T95QN(BP@,"P@,"P*(" )"0D)(" @(# @*3L*(" )"0D)
M96TM/F5M7W1Y<&4@/2!%35]!1$1!5%1224)55$4["BL@"0D)"7-T8714<F%C
M:T%D9"AN97<M/F%T=')?='EP92D["B @"0D)?2!E;'-E('L**R )"0D@(" @
M+RH)5&AI<R!A='1R:6)U=&4@97AI<W1S(&EN('1H92!E;G1R>2P@8G5T('=H
M870**R )"0D):&%V92!W92!D;VYE('1O(&ET/R @268@=V4@9&5L971E9"!I
M="P@=&AE;@HK( D)"0ET:&ES(&)E8V]M97,@86X@861D(&%T=')I8G5T92!O
M<&5R871I;VX@*B\**R )"0D@(" @:68@*"!S=&%T5')A8VM$96QE=&5D*&YE
M=RT^871T<E]T>7!E*2 I('L**R )"0D)1&5B=6<H($Q$05!?1$5"54=?05)'
M4RP@(EQT871T<FEB=71E7&XB+" P+" P+ HK( D)"0D@(" @," I.PHK( D)
M"0EE;2T^96U?='EP92 ]($5-7T%$1$%45%))0E5413L**R )"0D)<W1A=%1R
M86-K061D*&YE=RT^871T<E]T>7!E*3L**R )"0D@(" @?2!E;'-E('L**R )
M"0D)+RH@3W1H97)W:7-E+"!W92!A<F4@861D:6YG(&UO<F4@=F%L=65S("HO
M"B @"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L(")<='9A;'5E<UQN(BP@
M,"P@,"P@," I.PH@( D)"0EE;2T^96U?='EP92 ]($5-7T%$1%9!3%5%4SL*
M*R )"0D)<W1A=%1R86-K061D*&YE=RT^871T<E]T>7!E*3L**R )"0D@(" @
M?0H@( D)"7T*(" )"0EB<F5A:SL*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B R
M,#4L,C,P("HJ*BH*(" )"6-A<V4@3$1!4%]-3T1?1$5,151%.@H@( D)"41E
M8G5G*"!,1$%07T1%0E5'7T%21U,L(")$14Q%5$4Z7&XB+" P+" P+" P("D[
M"B @"B$@"0D):68@*"!A<R ]/2!.54Q,05144B I('L*(" )"0D)1&5B=6<H
M($Q$05!?1$5"54=?05)'4RP@(EQT;F5X(&%T=')I8G5T95QN(BP@,"P*(" )
M"0D)(" @(# L(# @*3L*(" )"0D)<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI
M96YT<V(L($U/1%1!1RP*(" )"0D)(" @(&TL($Q$05!?3D]?4U5#2%]!5%12
M24)55$4L($Y53$PL("(B("D["B @"0D)"65M<U]F<F5E*"!E;2 I.PH@( D)
M"0ER971U<FXH(# @*3L*(" )"0E](&5L<V4@>PH@( D)"0EI9B H(&YE=RT^
M871T<E]V86QU92 ]/2!.54Q,058@*2!["B @"0D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B @"0D)"0D@(" @,"P@,"P@
M," I.PH@( D)"0D)96TM/F5M7W1Y<&4@/2!%35]214U/5D5!5%1224)55$4[
M"B @"0D)"7T@96QS92!["B @"0D)"0EI9B H(&%V<U]C;7 H(&YE=RT^871T
M<E]V86QU92P*(" )"0D)"2 @("!A<RT^871T<E]V86QU92 I(#T](# @*2![
M"B @"0D)"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP*(" )"0D)"0D@(" @
M(EQT871T<FEB=71E7&XB+" P+" P+" P("D["B @"0D)"0D)96TM/F5M7W1Y
M<&4@/0H@( D)"0D)"2 @("!%35]214U/5D5!5%1224)55$4["B @"0D)"0E]
M(&5L<V4@>PH@( D)"0D)"41E8G5G*"!,1$%07T1%0E5'7T%21U,L"B @"0D)
M"0D)(" @(")<='9A;'5E<UQN(BP@,"P@,"P@," I.PH@( D)"0D)"65M+3YE
M;5]T>7!E(#T@14U?4D5-3U9%5D%,5453.PHM+2T@,C<U+#,T," M+2TM"B @
M"0EC87-E($Q$05!?34]$7T1%3$5413H*(" )"0E$96)U9R@@3$1!4%]$14)5
M1U]!4D=3+" B1$5,151%.EQN(BP@,"P@,"P@," I.PH@( HA( D)"6EF("@@
M87,@/3T@3E5,3$%45%(@)B8*(2 )"0D@(" @(7-T8714<F%C:TAA<U9A;'5E
M<RAN97<M/F%T=')?='EP92D@*2!["B$@"0D)"2\J("!4:&4@=7-E<B!W86YT
M<R!T;R!D96QE=&4@<V]M971H:6YG('1H870*(2 )"0D)(" @(&1O97-N)W0@
M97AI<W0@86YD('=O;B=T(&)E(&-R96%T960@8GD*(2 )"0D)(" @('1H:7,@
M;W!E<F%T:6]N.R @=&AA="=S(&%N(&5R<F]R("HO"B @"0D)"41E8G5G*"!,
M1$%07T1%0E5'7T%21U,L(")<=&YE>"!A='1R:6)U=&5<;B(L(# L"B @"0D)
M"2 @(" P+" P("D["B @"0D)"7-E;F1?;&1A<%]M<V=R97-U;'0H(&-L:65N
M='-B+"!-3T1404<L"B @"0D)"2 @("!M+"!,1$%07TY/7U-50TA?05144DE"
M551%+"!.54Q,+" B(B I.PH@( D)"0EE;7-?9G)E92@@96T@*3L**R )"0D)
M<W1A=%1R86-K1&5S=')O>2@I.PH@( D)"0ER971U<FXH(# @*3L*(" )"0E]
M(&5L<V4@>PH@( D)"0EI9B H(&YE=RT^871T<E]V86QU92 ]/2!.54Q,058@
M*2!["BL@"0D)"2 @(" O*@E4:&4@=7-E<B!W86YT<R!T;R!D96QE=&4@=&AE
M(&%T=')I8G5T93H**R )"0D)"6QE="!T:&5M.R @=&AI<R!I;F-L=61E<R!A
M;GD@=F%L=65S"BL@"0D)"0ET:&5Y(&%D9&5D('5P('1O('1H:7,@<&]I;G0@
M=VET:"!T:&ES"BL@"0D)"0EO<&5R871I;VXN("HO"B @"0D)"0E$96)U9R@@
M3$1!4%]$14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B @"0D)"0D@(" @
M,"P@,"P@," I.PH@( D)"0D)96TM/F5M7W1Y<&4@/2!%35]214U/5D5!5%12
M24)55$4["BL@"0D)"0ES=&%T5')A8VM$96QE=&4H;F5W+3YA='1R7W1Y<&4I
M.PH@( D)"0E](&5L<V4@>PHK( D)"0D)+RH@(%1H92!U<V5R('=A;G1S('1O
M(&1E;&5T92!P87)T:6-U;&%R"BL@"0D)"0D@(" @=F%L=65S("HO"B @"0D)
M"0EI9B H(&%V<U]C;7 H(&YE=RT^871T<E]V86QU92P*(" )"0D)"2 @("!A
M<RT^871T<E]V86QU92 I(#T](# @*2!["BL@"0D)"0D@(" @+RH)5&AE('5S
M97(@:6YD:6-A=&5S('1H870@86QL"BL@"0D)"0D)97AI<W1I;F<@=F%L=65S
M('-H;W5L9"!B90HK( D)"0D)"61E;&5T960Z($EF('=E(&AA=F4@861D960*
M*R )"0D)"0EV86QU97,L('1H96X@9&5L971E(&]N;'D@=&AE"BL@"0D)"0D)
M<W!E8VEF:65D('9A;'5E<SL@(&]T:&5R=VES92P**R )"0D)"0EA;&QO=R!T
M:&4@96YT:7)E(&%T=')I8G5T90HK( D)"0D)"71O(&)E(&1E;&5T960N("HO
M"BL@"0D)"0D@(" @:68@*"!S=&%T5')A8VM(87-686QU97,H"BL@"0D)"0D)
M;F5W+3YA='1R7W1Y<&4I("D@>PH@( D)"0D)"41E8G5G*"!,1$%07T1%0E5'
M7T%21U,L"BL@"0D)"0D)(" @(")<='9A;'5E<UQN(BP@,"P@,"P@," I.PHK
M( D)"0D)"65M+3YE;5]T>7!E(#T@14U?4D5-3U9%5D%,5453.PHK( D)"0D)
M(" @('T@96QS92!["BL@"0D)"0D)1&5B=6<H($Q$05!?1$5"54=?05)'4RP*
M(" )"0D)"0D@(" @(EQT871T<FEB=71E7&XB+" P+" P+" P("D["B @"0D)
M"0D)96TM/F5M7W1Y<&4@/0H@( D)"0D)"2 @("!%35]214U/5D5!5%1224)5
M5$4["BL@"0D)"0D)<W1A=%1R86-K1&5L971E* HK( D)"0D)"2 @("!N97<M
M/F%T=')?='EP92D["BL@"0D)"0D@(" @?0H@( D)"0D)?2!E;'-E('L**R )
M"0D)"2 @(" O*@E$96QE=&4@=&AE(&EN9&EC871E9"!V86QU92X**R )"0D)
M"0E792!D;R!T:&4@8F5S="!W92!C86XL('=H:6-H"BL@"0D)"0D):7-N)W0@
M;75C:#H@('=E(&%S<W5M92!T:&%T"BL@"0D)"0D):&%D('1H92!U<V5R('=I
M<VAE9"!T;R!D96QE=&4**R )"0D)"0EA;&P@=F%L=65S+"!T:&5Y('=O=6QD
M(&AA=F4**R )"0D)"0ES<&5C:69I960@82!D96QE=&4@871T<FEB=71E"BL@
M"0D)"0D);W!E<F%T:6]N+"!O<B!A(&1E;&5T92!A;&P@"BL@"0D)"0D)=F%L
M=65S("T@=&AE(&]N92!A8F]V92X@(%1H97D**R )"0D)"0EC;W5L9"!N:6)B
M;&4@=&AE(&%T=')I8G5T92!O=70**R )"0D)"0EO9B!E>&ES=&5N8V4@;VYE
M('9A;'5E(&%T(&$@"BL@"0D)"0D)=&EM92P@8G5T('1H:7,@:7,@9&EF9FEC
M=6QT('1O"BL@"0D)"0D)=')A8VL@*B\*(" )"0D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+ H@( D)"0D)"2 @(" B7'1V86QU97-<;B(L(# L(# L(# @
M*3L*(" )"0D)"0EE;2T^96U?='EP92 ]($5-7U)%34]6159!3%5%4SL**BHJ
M*BHJ*BHJ*BHJ*BHJ"BHJ*B R,S<L,C0Y("HJ*BH*(" )"0E$96)U9R@@3$1!
M4%]$14)51U]!4D=3+" B4D503$%#13I<;B(L(# L(# L(# @*3L*(" *(" )
M"0EI9B H(&%S(#T]($Y53$Q!5%12("D@>PHA( D)"0E$96)U9R@@3$1!4%]$
M14)51U]!4D=3+" B7'1A='1R:6)U=&5<;B(L(# L(# L"B$@"0D)"2 @(" P
M("D["B$@"0D)"65M+3YE;5]T>7!E(#T@14U?041$05144DE"551%.PH@( D)
M"7T@96QS92!["B @"0D)"6EF("@@<F5P;&%C95]M;V0H(&5M+"!A<RP@;F5W
M("D@/" P("D@>PH@( D)"0D)<F5T=7)N*" P("D["B @"0D)"7T*(" )"0E]
M"B @"0D)8G)E86L["B @"BTM+2 S-#<L,S<Y("TM+2T*(" )"0E$96)U9R@@
M3$1!4%]$14)51U]!4D=3+" B4D503$%#13I<;B(L(# L(# L(# @*3L*(" *
M(" )"0EI9B H(&%S(#T]($Y53$Q!5%12("D@>PHA( D)"2 @(" O*@E4:&ES
M(&%T=')I8G5T92!D;V5S(&YO="!E>&ES="!I;B!T:&4@96YT<GD["B$@"0D)
M"6AA=F4@=V4@861D960@:70_("HO"B$@"0D)"6EF("@@<W1A=%1R86-K2&%S
M5F%L=65S*&YE=RT^871T<E]T>7!E*2 I('L*(2 )"0D)(" @("\J(%EE<RP@
M=V4@:&%V92$*(2 )"0D)(" @($1E8G5G*"!,1$%07T1%0E5'7T%21U,L(")<
M='9A;'5E<UQN(BP*(2 )"0D)"3 L(# L(# @*3L*(2 )"0D)(" @(&5M+3YE
M;5]T>7!E(#T@14U?041$5D%,5453.PHA( D)"0D@(" @<W1A=%1R86-K061D
M*&YE=RT^871T<E]T>7!E*3L*(2 )"0D)?2!E;'-E('L*(2 )"0D)(" @("\J
M($YO+"!W92!H879E;B=T("HO"B$@"0D)"2 @("!$96)U9R@@3$1!4%]$14)5
M1U]!4D=3+" B7'1A='1R:6)U=&5<;B(L"B$@"0D)"0DP+" P+" P("D["B$@
M"0D)"2 @("!E;2T^96U?='EP92 ]($5-7T%$1$%45%))0E5413L*(2 )"0D)
M(" @('-T8714<F%C:T%D9"AN97<M/F%T=')?='EP92D["B$@"0D)"7T*(" )
M"0E](&5L<V4@>PHK( D)"2 @(" O*@E4:&ES(&%T=')I8G5T92!D;V5S(&5X
M:7-T(&EN('1H92!E;G1R>3L@<&5R9F]R;0HK( D)"0ET:&4@;W!T:6UI>F5D
M(')E<&QA8V4@<F]U=&EN92X@56YF;W)T=6YA=&5L>2P**R )"0D)=V4@8V%N
M)W0@<F5A;&QY(&1O(&UU8V@@;6]R92P@=6YL97-S('=E(&=E="!I;G1O"BL@
M"0D)"71H92!H96%R="!O9B!T:&ES(')O=71I;F4@86YD('1R86-K(&5X86-T
M;'D@=VAA= HK( D)"0EI="!D:60N("!3;R!W92!A<W-U;64@=&AA="!T:&4@
M=7-E<B!K;F]W<R!W:&%T"BL@"0D)"71H97D@=V%N="!T;R!D;RP@86YD('=E
M('1R86-K(&YO=&AI;F<N+BXN("HO"B @"0D)"6EF("@@<F5P;&%C95]M;V0H
M(&5M+"!A<RP@;F5W("D@/" P("D@>PHK( D)"0D)<W1A=%1R86-K1&5S=')O
M>2@I.PH@( D)"0D)<F5T=7)N*" P("D["B @"0D)"7T**R )"0D)+RH@<W1A
M=%1R86-K061D5F%L=65S*&YE=RT^871T<E]T>7!E*3LJ+PH@( D)"7T*(" )
M"0EB<F5A:SL*(" **BHJ*BHJ*BHJ*BHJ*BHJ"BHJ*B R-3(L,C4W("HJ*BH*
M+2TM(#,X,BPS.#@@+2TM+0H@( H@( D)"7-E;F1?;&1A<%]M<V=R97-U;'0H
M(&-L:65N='-B+"!-3T1404<L(&TL"B @"0D)(" @($Q$05!?4%)/5$]#3TQ?
M15)23U(L($Y53$PL("(B("D["BL@"0D)<W1A=%1R86-K1&5S=')O>2@I.PH@
M( D)"7)E='5R;B@@," I.PH@( D)"6)R96%K.PH@( D)?0HJ*BHJ*BHJ*BHJ
M*BHJ*BH**BHJ(#,S-RPS-#(@*BHJ*@HM+2T@-#8X+#0W-" M+2TM"B @"6EF
M("@@;6$N;65A7V-H86YG97,@/3T@3E5,3$U/1" I('L)+RH@;F]T:&EN9R!T
M;R!D;R J+PH@( D)<V5N9%]L9&%P7VUS9W)E<W5L="@@8VQI96YT<V(L($U/
M1%1!1RP@;2P*(" )"2 @("!,1$%07U-50T-%4U,L($Y53$PL("(B("D["BL@
M"0ES=&%T5')A8VM$97-T<F]Y*"D["B @"0ER971U<FXH(# @*3L*(" )?0H@
M( HJ*BHJ*BHJ*BHJ*BHJ*BH**BHJ(#,T.2PS-3<@*BHJ*@HM+2T@-#@Q+#0Y
M,2 M+2TM"B @"B @"6EF("@@<F,@(3T@," I('L*(" )"7-E;F1?;&1A<%]M
M<V=R97-U;'0H(&-L:65N='-B+"!-3T1404<L(&TL(')C+"!.54Q,+" B(B I
M.PHK( D)<W1A=%1R86-K1&5S=')O>2@I.PH@( D)<F5T=7)N*" P("D["B @
M"7T*(" **R )<W1A=%1R86-K1&5S=')O>2@I.PH@( ER971U<FXH(#$@*3L*
M("!]"B @"BHJ*BHJ*BHJ*BHJ*BHJ*@HJ*BH@-S,P+#<S,R J*BHJ"BTM+2 X
M-C0L,3 R," M+2TM"B @"7T*(" *(" )<F5T=7)N*" P("D["BL@?0HK( HK
M('-T871I8R!3=&%T5')A8VME<B!S=&%T5')A8VM);FET:6%L:7IE*"D**R![
M"BL@(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K26YI
M=&EA;&EZ95QN(BP@,"P@,"P@," I.PHK( HK(" @("!3=&%T2&5A9" ]("A3
M=&%T5')A8VME<BD@;6%L;&]C*'-I>F5O9BAS=')U8W0@<W1A=%1R86-K97(I
M*3L**R @(" @:68@*$Y53$P@/3T@4W1A=$AE860I('L**R )1&5B=6<H($Q$
M05!?1$5"54=?5%)!0T4L(")S=&%T5')A8VM);FET:6%L:7IE(&9A:6QE9%QN
M(BP@,"P@,"P@," I.PHK(" @("!]"BL@(" @(%-T871486EL(#T@4W1A=$AE
M860["BL@(" @(')E='5R;B!3=&%T2&5A9#L**R!]"BL@"BL@<W1A=&EC(%-T
M8714<F%C:V5R('-T8714<F%C:TEN<V5R="A!='1R5&]4<F%C:RD**R!!='1R
M:6)U=&54>7!E"4%T=')4;U1R86-K.PHK('L**R @(" @4W1A=%1R86-K97()
M<W1A=%=A;&ME<CL**R **R @(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L
M(")S=&%T5')A8VM);G-E<G1<;B(L(# L(# L(# @*3L**R **R @(" @+RH@
M8G5L;&5T('!R;V]F:6YG("HO"BL@(" @(&EF("@@3E5,3" ]/2!3=&%T2&5A
M9"!\?"!.54Q,(#T](%-T871486EL("D@>PHK( E$96)U9R@@3$1!4%]$14)5
M1U]44D%#12P@(G-T8714<F%C:TEN<V5R="!F86EL961<;B(L(# L(# L(# @
M*3L**R )<F5T=7)N(%-T871.=6QL.PHK(" @("!]"BL@"BL@(" @("\J($AA
M=F4@=V4@861D960@=&AI<R!O;F4@>65T/R J+PHK(" @("!S=&%T5V%L:V5R
M(#T@<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD["BL@(" @(&EF("@@3E5,
M3" ]/2!S=&%T5V%L:V5R("D@>PHK( DO*B!.;W!E.B @06QL;V-A=&4@82!N
M97<@4W1A=%1R86-K97(@*B\**R )<W1A=%=A;&ME<B ]("A3=&%T5')A8VME
M<BD@;6%L;&]C*'-I>F5O9BAS=')U8W0@<W1A=%1R86-K97(I*3L**R ):68@
M*"!.54Q,("$]('-T871786QK97(@*2!["BL@"2 @(" O*B!3;R!F87(@<V\@
M9V]O9"P@=7!D871E(&5V97)Y=&AI;F<@*B\**R )(" @('-T871786QK97(M
M/D%T=')4;U1R86-K(#T@071T<E1O5')A8VL["BL@"2 @("!S=&%T5V%L:V5R
M+3Y3=&%T3F5X=" ](%-T871.=6QL.PHK( D@(" @<W1A=%=A;&ME<BT^2&%S
M5F%L=65S(#T@1D%,4T4["BL@"2 @("!S=&%T5V%L:V5R+3Y$96QE=&5D(#T@
M1D%,4T4["BL@"2 @("!3=&%T5&%I;"T^4W1A=$YE>'0@/2!S=&%T5V%L:V5R
M.PHK( D@(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")S=&%T5')A8VM)
M;G-E<G0@<W5C8V5E9&5D7&XB+" P+" P+" P("D["BL@"7T@96QS92!["BL@
M"2 @("!$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T8714<F%C:TEN<V5R
M="!F86EL961<;B(L(# L(# L(# @*3L**R )?0HK(" @("!]"BL@(" @("\J
M($YO(&UA='1E<B!W:&%T+"!T:&ES(&ES('1H92!R:6=H="!T:&EN9R!T;R!D
M;R J+PHK(" @("!R971U<FX@<W1A=%=A;&ME<CL**R!]"BL@"BL@<W1A=&EC
M('9O:60@<W1A=%1R86-K061D*$%T=')4;U1R86-K*0HK($%T=')I8G5T951Y
M<&4)071T<E1O5')A8VL["BL@>PHK(" @("!3=&%T5')A8VME<@ES=&%T5V%L
M:V5R.PHK( HK(" @("!$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T8714
M<F%C:T%D9%QN(BP@,"P@,"P@," I.PHK( HK(" @("!S=&%T5V%L:V5R(#T@
M<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD["BL@(" @("\J(%1H:7,@:7,@
M=VAE<F4@22!R96%L;'D@=VES:"!T:&ES('=A<R!#*RL@*B\**R **R @(" @
M<W1A=%=A;&ME<BT^2&%S5F%L=65S(#T@5%)513L**R @(" @<W1A=%=A;&ME
M<BT^1&5L971E9" ]($9!3%-%.PHK('T**R **R C:68@, HK("\J(&YE8V5S
M<V%R>3\**R!S=&%T:6,@=F]I9"!S=&%T5')A8VM!9&1686QU97,H071T<E1O
M5')A8VLI"BL@071T<FEB=71E5'EP90E!='1R5&]4<F%C:SL**R!["BL@(" @
M(%-T8714<F%C:V5R"7-T871786QK97(["BL@"BL@(" @($1E8G5G*"!,1$%0
M7T1%0E5'7U1204-%+" B<W1A=%1R86-K061D5F%L=65S7&XB+" P+" P+" P
M("D["BL@"BL@(" @('-T871786QK97(@/2!S=&%T5')A8VM&:6YD*$%T=')4
M;U1R86-K*3L**R @(" @+RH@(%1H:7,@:7,@=VAE<F4@22!R96%L;'D@=VES
M:"!T:&ES('=A<R!#*RL@*B\**R **R @(" @<W1A=%=A;&ME<BT^2&%S5F%L
M=65S(#T@5%)513L**R!]"BL@*B\**R C96YD:68**R **R!S=&%T:6,@=F]I
M9"!S=&%T5')A8VM$96QE=&4H071T<E1O5')A8VLI"BL@071T<FEB=71E5'EP
M90E!='1R5&]4<F%C:SL**R!["BL@(" @(%-T8714<F%C:V5R"7-T871786QK
M97(["BL@"BL@(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R
M86-K1&5L971E7&XB+" P+" P+" P("D["BL@"BL@(" @('-T871786QK97(@
M/2!S=&%T5')A8VM&:6YD*$%T=')4;U1R86-K*3L**R @(" @+RH@5&AI<R!I
M<R!W:&5R92!)(')E86QL>2!W:7-H('1H:7,@=V%S($,K*R J+PHK( HK(" @
M("!S=&%T5V%L:V5R+3Y(87-686QU97,@/2!&04Q313L**R @(" @<W1A=%=A
M;&ME<BT^1&5L971E9" ](%12544["BL@?0HK( HK('-T871I8R!"3T],14%.
M('-T8714<F%C:TAA<U9A;'5E<RA!='1R5&]4<F%C:RD**R!!='1R:6)U=&54
M>7!E"4%T=')4;U1R86-K.PHK('L**R @(" @4W1A=%1R86-K97()<W1A=%=A
M;&ME<CL**R **R @(" @1&5B=6<H($Q$05!?1$5"54=?5%)!0T4L(")S=&%T
M5')A8VM(87-686QU97-<;B(L(# L(# L(# @*3L**R **R @(" @<W1A=%=A
M;&ME<B ]('-T8714<F%C:T9I;F0H071T<E1O5')A8VLI.PHK(" @(" O*B!4
M:&ES(&ES('=H97)E($D@<F5A;&QY('=I<V@@=&AI<R!W87,@0RLK("HO"BL@
M"BL@(" @(')E='5R;B!S=&%T5V%L:V5R+3Y(87-686QU97,["BL@?0HK( HK
M('-T871I8R!"3T],14%.('-T8714<F%C:T1E;&5T960H071T<E1O5')A8VLI
M"BL@071T<FEB=71E5'EP90E!='1R5&]4<F%C:SL**R!["BL@(" @(%-T8714
M<F%C:V5R"7-T871786QK97(["BL@"BL@(" @($1E8G5G*"!,1$%07T1%0E5'
M7U1204-%+" B<W1A=%1R86-K1&5L971E9%QN(BP@,"P@,"P@," I.PHK( HK
M(" @("!S=&%T5V%L:V5R(#T@<W1A=%1R86-K1FEN9"A!='1R5&]4<F%C:RD[
M"BL@(" @("\J(%1H:7,@:7,@=VAE<F4@22!R96%L;'D@=VES:"!T:&ES('=A
M<R!#*RL@*B\**R **R @(" @<F5T=7)N('-T871786QK97(M/D1E;&5T960[
M"BL@?0HK( HK('-T871I8R!3=&%T5')A8VME<B!S=&%T5')A8VM&:6YD*$%T
M=')4;U1R86-K*0HK($%T=')I8G5T951Y<&4)071T<E1O5')A8VL["BL@>PHK
M(" @("!3=&%T5')A8VME<@ES=&%T5V%L:V5R.PHK( HK(" @("!$96)U9R@@
M3$1!4%]$14)51U]44D%#12P@(G-T8714<F%C:T9I;F1<;B(L(# L(# L(# @
M*3L**R **R @(" @9F]R("AS=&%T5V%L:V5R(#T@4W1A=$AE860[('-T8717
M86QK97(@/2!S=&%T5V%L:V5R+3Y3=&%T3F5X=" [('-T871786QK97(@(3T@
M4W1A=$YU;&P@*2!["BL@"6EF("@@," ]/2!!='1R5%]C;7 H<W1A=%=A;&ME
M<BT^071T<E1O5')A8VLL($%T=')4;U1R86-K*2 I('L**R )(" @(&)R96%K
M.PHK( E]"BL@(" @('T**R @(" @:68@*"!.54Q,(#T]('-T871786QK97(@
M*2!["BL@"41E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K1FEN
M9"!D:60@;F]T(&9I;F0@=&AE(&%T=')I8G5T95QN(BP@,"P@,"P@," I.PHK
M(" @("!](&5L<V4@>PHK( E$96)U9R@@3$1!4%]$14)51U]44D%#12P@(G-T
M8714<F%C:T9I;F0@9F]U;F0@=&AE(&%T=')I8G5T95QN(BP@,"P@,"P@," I
M.PHK(" @("!]"BL@(" @(')E='5R;B!S=&%T5V%L:V5R.PHK('T**R **R!V
M;VED"7-T8714<F%C:T1E<W1R;WDH*0HK('L**R @(" @4W1A=%1R86-K97(@
M<W1A=%=A;&ME<CL**R @(" @4W1A=%1R86-K97(@<W1A=$YE>'0["BL@"BL@
M(" @($1E8G5G*"!,1$%07T1%0E5'7U1204-%+" B<W1A=%1R86-K1&5S=')O
M>5QN(BP@,"P@,"P@," I.PHK( HK(" @("!F;W(@*'-T871786QK97(@/2!3
M=&%T2&5A9#L@<W1A=%=A;&ME<B A/2!.54Q,.R I('L**R )<W1A=$YE>'0@
M/2!S=&%T5V%L:V5R+3Y3=&%T3F5X=#L**R )9G)E92AS=&%T5V%L:V5R*3L*
M*R )<W1A=%=A;&ME<B ]('-T871.97AT.PHK(" @("!]"BL@(" @(%-T871(
M96%D(#T@4W1A=$YU;&P["BL@(" @(%-T871486EL(#T@4W1A=$YU;&P["B @
"?0ID
`
end