[Xotcl] Re: [Xotcl] abstract method difference 0.83->0.84

Uwe Zdun uwe.zdun@uni-essen.de
Wed, 9 May 2001 09:17:31 +0200


--------------Boundary-00=_7942CEQHSZH7Q6OTXC7E
Content-Type: text/plain;
  charset="US-ASCII"
Content-Transfer-Encoding: 8bit

Ok. First: we didn't realize there is a change from 0.83->0.84 ... we thought 
the error message would occur in 0.83 as well.

Second: I agree, the behavior with "next" is undesirable ... I remember, 
we've found this problem before. I wonder why we haven't changed the behavior 
yet. Anyway, I think a good solution is to change the behvaior of "abstract" 
accordingly. In 0.84 (and 0.83?) it was:


Object instproc abstract {methtype methname arglist} {
  if {$methtype  != "proc" && $methtype != "instproc"} {
    error "invalid method type '$methtype', \
	must be either 'proc' or 'instproc'."
  } 
  [self] $methtype $methname $arglist \
    [list error "Abstract method $methname $arglist called"]
}


I would propose to change it to:


Object instproc abstract {methtype methname arglist} {
  if {$methtype  != "proc" && $methtype != "instproc"} {
    error "invalid method type '$methtype', \
	must be either 'proc' or 'instproc'."
  }
  [self] $methtype $methname $arglist "
    if {\[self callingproc\] != \[self proc\] && 
	\[self callingobject\] != \[self\]} {
      error \"Abstract method $methname $arglist called\"
    }
  "
}


That is, when the calling method name equals the current method and the 
calling object is self, then the call is done with next. In this cases we 
omit the error message. An example:


Class Foo
Foo abstract instproc blah {}
Class Bar -superclass Foo
Bar instproc blah {} {
  puts "Bar--blah"
  next
}

puts [Foo info instbody blah]

# here no error occurs:
Bar b
b blah

# here we still get an error:
Foo a
a blah


I'll attach my predefined.xotcl for your convenience (that is, you have to 
recompile XOTcl with it in order to use the change ...)

--Uwe


On Wednesday 09 May 2001 02:13, you wrote:
> Just wanted to note a change I noticed from 0.83->0.84 which doesn't seem
> to be in the changes file? It's to do with abstract methods and code like
> the following:
>
> Class Foo
> Foo abstract instproc blah {}
>
> Class Bar -superclass Foo
> Bar instproc instproc blah {
>   puts "blah"
>   next
> }
>
> With 0.83 this worked but it gives an error about an abstract method
> being called in 0.84. The reason the "next" is there in the first place is
> basically because if someone decides to add a class to the chain after Bar
> then the "next" commands will already be in place. Are there other
> arguments for/against the 0.84 model?
>
>          -     ---------- = = ---------//--+
>
>          |    /     Kristoffer Lawson      |  www.fishpool.fi|.com
>
>          +-> |    setok@fishpool.com       |  - - --+------
>
>              |-- Fishpool Creations Ltd - /         |
>
>              +-------- = - - - = ---------      /~setok/
>
>
> _______________________________________________
> Xotcl mailing list  -  Xotcl@wi.wu-wien.ac.at
> http://wi.wu-wien.ac.at/mailman/listinfo/xotcl

-- 
Uwe Zdun
Specification of Software Systems, University of Essen
Phone: +49 201 81 00 332, Fax: +49 201 81 00 398
zdun@xotcl.org, uwe.zdun@uni-essen.de

--------------Boundary-00=_7942CEQHSZH7Q6OTXC7E
Content-Type: text/plain;
  name="predefined.xotcl"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="predefined.xotcl"

IyAkSWQkCgojIGluaXQgbXVzdCBleGlzdCBvbiBPYmplY3QuIHBlciBkZWZhdWx0IGl0IGlzIGVt
cHR5LgpPYmplY3QgaW5zdHByb2MgaW5pdCBhcmdzIHt9CgojIGRvY3VtZW50YXRpb24gc3R1YiBv
YmplY3QgLT4ganVzdCBpZ25vcmUgCiMgYWxsIGRvY3VtZW50YXRpb25zIGlmIHhvRG9jIGlzIG5v
dCBsb2FkZWQKT2JqZWN0IDo6QAo6OkAgcHJvYyB1bmtub3duIGFyZ3Mge30KCiNPYmplY3QgaW5z
dHByb2MgcmVjcmVhdGUgYXJncyB7CiMgIFtzZWxmXSBjbGVhbnVwCiMgIDo6c2V0IGNsIFtbc2Vs
Zl0gaW5mbyBjbGFzc10KIyAgOjpzZXQgcGNsIFskY2wgaW5mbyBwYXJhbWV0ZXJjbGFzc10KIyAg
JHBjbCBzZWFyY2hEZWZhdWx0cyBbc2VsZl0KIyAgaWYgeyFbZXZhbCBbc2VsZl0gaW5pdG1ldGhv
ZHMgJGFyZ3NdfSB7CiMgICAgZXZhbCBbc2VsZl0gaW5pdCAkYXJncwojICB9CiMgIHJldHVybiBb
c2VsZl0KI30KCkNsYXNzIGluc3Rwcm9jIHBhcmFtZXRlcnMgYXJncyB7CiAgOjp4b3RjbDo6ZGVw
cmVjYXRlZCBwYXJhbWV0ZXJzIHBhcmFtZXRlcgogIDo6ZXZhbCBbc2VsZl0gcGFyYW1ldGVyICRh
cmdzCn0KIyBwcm92aWRlIHNvbWUgVGNsLWNvbW1hbmRzIGFzIG1ldGhvZHMgZm9yIGV2ZXJ5IE9i
amVjdApPYmplY3QgaW5zdHByb2MgYXJyYXkge29wdCBhcnJheSBhcmdzfSB7CiAgOjpldmFsIDo6
YXJyYXkgJG9wdCBbc2VsZl06OiRhcnJheSAkYXJncwp9Ck9iamVjdCBpbnN0cHJvYyB2d2FpdCB7
dmFyTmFtZX0gewogIDo6dndhaXQgW3NlbGZdOjokdmFyTmFtZQp9Ck9iamVjdCBpbnN0cHJvYyBh
cHBlbmQge3Zhck5hbWUgYXJnc30gewogIDo6ZXZhbCA6OmFwcGVuZCBbc2VsZl06OiR2YXJOYW1l
ICRhcmdzCn0KT2JqZWN0IGluc3Rwcm9jIGxhcHBlbmQge3Zhck5hbWUgYXJnc30gewogIDo6ZXZh
bCA6OmxhcHBlbmQgW3NlbGZdOjokdmFyTmFtZSAkYXJncwp9Ck9iamVjdCBpbnN0cHJvYyBjc2V0
IHt2biBhcmd9IHsKICBpZiB7IVtbc2VsZl0gZXhpc3RzICR2bl19IHsKICAgIFtzZWxmXSBzZXQg
JHZuICRhcmcKICB9Cn0KIyBuZXdDaGlsZCBjcmVhdGVzIGEgbmV3IGNoaWxkIHVuZGVyIHRoZSBj
dXJyZW50IG9iamVjdApDbGFzcyBpbnN0cHJvYyBuZXdDaGlsZCBhcmdzIHsKICA6OnNldCBuYW1l
IFtbc2VsZl0gYXV0b25hbWUgLWluc3RhbmNlIFtuYW1lc3BhY2UgdGFpbCBbc2VsZl1dXQogIDo6
ZXZhbCBbc2VsZl0gY3JlYXRlIFtzZWxmIGNhbGxpbmdvYmplY3RdOjokbmFtZSAkYXJncwp9CiMg
bmV3IGNyZWF0ZXMgYSBuZXcgZ2xvYmFsIG9iamVjdApDbGFzcyBpbnN0cHJvYyBuZXcgYXJncyB7
CiAgOjpldmFsIFtzZWxmXSBjcmVhdGUgW1tzZWxmXSBhdXRvbmFtZSAtaW5zdGFuY2UgW3NlbGZd
XSAkYXJncwp9CiMgc3VwcG9ydCBmb3IgWE9UY2wgc3BlY2lmaWNhCk9iamVjdCBpbnN0cHJvYyBm
aWx0ZXJhcHBlbmQgZiB7CiAgW3NlbGZdIGZpbHRlciBbY29uY2F0IFtbc2VsZl0gaW5mbyBmaWx0
ZXJdICRmXQp9Ck9iamVjdCBpbnN0cHJvYyBtaXhpbmFwcGVuZCBtIHsKICA6OnNldCBtaXggW1tz
ZWxmXSBpbmZvIG1peGluXQogIFtzZWxmXSBtaXhpbiBbOjpsYXBwZW5kIG1peCAkbV0KfQoKT2Jq
ZWN0IHByb2MgZ2V0RXhpdEhhbmRsZXIge30gewogIGlmIHtbW3NlbGZdIGV4aXN0cyBfX2V4aXRI
YW5kbGVyXX0gewogICAgcmV0dXJuIFtbc2VsZl0gc2V0IF9fZXhpdEhhbmRsZXJdCiAgfSBlbHNl
IHsKICAgIHJldHVybiAiIgogIH0KfQpPYmplY3QgcHJvYyBzZXRFeGl0SGFuZGxlciBib2R5IHsK
ICByZXR1cm4gW1tzZWxmXSBzZXQgX19leGl0SGFuZGxlciAkYm9keV0KfQpPYmplY3QgcHJvYyB1
bnNldEV4aXRIYW5kbGVyIHt9IHsKICBbc2VsZl0gdW5zZXQgX19leGl0SGFuZGxlcgp9CkNsYXNz
OjpQYXJhbWV0ZXIgaW5zdHByb2MgdmFsdWVzIHtwYXJhbSBhcmdzfSB7CiAgc2V0IGNpIFtbc2Vs
Zl0gaW5mbyBpbnN0aW52YXJdCiAgc2V0IHZhbHVlVGVzdCB7fQogIGZvcmVhY2ggYSAkYXJncyB7
CiAgICA6OmxhcHBlbmQgdmFsdWVUZXN0ICJcW1xbc2VsZlxdIHNldCAkcGFyYW1cXSA9PSBbbGlz
dCAkYV0iCiAgfQogIDo6bGFwcGVuZCBjaSBbam9pbiAkdmFsdWVUZXN0ICIgfHwgIl0KICBbc2Vs
Zl0gaW5zdGludmFyICRjaQp9CgpPYmplY3QgaW5zdHByb2MgYWJzdHJhY3Qge21ldGh0eXBlIG1l
dGhuYW1lIGFyZ2xpc3R9IHsKICBpZiB7JG1ldGh0eXBlICAhPSAicHJvYyIgJiYgJG1ldGh0eXBl
ICE9ICJpbnN0cHJvYyJ9IHsKICAgIGVycm9yICJpbnZhbGlkIG1ldGhvZCB0eXBlICckbWV0aHR5
cGUnLCBcCgltdXN0IGJlIGVpdGhlciAncHJvYycgb3IgJ2luc3Rwcm9jJy4iCiAgfQogIFtzZWxm
XSAkbWV0aHR5cGUgJG1ldGhuYW1lICRhcmdsaXN0ICIKICAgIGlmIHtcW3NlbGYgY2FsbGluZ3By
b2NcXSAhPSBcW3NlbGYgcHJvY1xdICYmIAoJXFtzZWxmIGNhbGxpbmdvYmplY3RcXSAhPSBcW3Nl
bGZcXX0gewogICAgICBlcnJvciBcIkFic3RyYWN0IG1ldGhvZCAkbWV0aG5hbWUgJGFyZ2xpc3Qg
Y2FsbGVkXCIKICAgIH0KICAiCn0KCiMKIyBjb3B5L21vdmUgaW1wbGVtZW50YXRpb24gCiMKQ2xh
c3MgT2JqZWN0OjpDb3B5SGFuZGxlciAtcGFyYW1ldGVyIHsKICB7bnNMaXN0ICIifQogIHtkZXN0
ICIifQogIG9iakxlbmd0aAp9CgpPYmplY3Q6OkNvcHlIYW5kbGVyIGluc3Rwcm9jIG1ha2VOYW1l
c3BhY2VMaXN0IHtuc30gewogIDo6bGFwcGVuZCBbc2VsZl06Om5zTGlzdCAkbnMKICBmb3JlYWNo
IGMgW25hbWVzcGFjZSBjaGlsZHJlbiAkbnNdIHsKICAgIFtzZWxmXSBtYWtlTmFtZXNwYWNlTGlz
dCAkYwogIH0KfQoKT2JqZWN0OjpDb3B5SGFuZGxlciBpbnN0cHJvYyBjb3B5TlNWYXJzQW5kQ21k
cyB7b3JpZyBkZXN0fSB7CiAgOjp4b3RjbDo6bmFtZXNwYWNlX2NvcHl2YXJzICRvcmlnICRkZXN0
CiAgOjp4b3RjbDo6bmFtZXNwYWNlX2NvcHljbWRzICRvcmlnICRkZXN0Cn0KCiMgY29uc3RydWN0
IGRlc3RpbmF0aW9uIG9iaiBuYW1lIGZyb20gb2xkIHF1YWxpZmllZCBucyBuYW1lCk9iamVjdDo6
Q29weUhhbmRsZXIgaW5zdHByb2MgZ2V0TnNEZXN0IHtuc30gewogIHNldCB0YWlsIFtzdHJpbmcg
cmFuZ2UgJG5zIFtbc2VsZl0gc2V0IG9iakxlbmd0aF0gZW5kXQogIHJldHVybiA6OltzdHJpbmcg
dHJpbWxlZnQgW1tzZWxmXSBzZXQgZGVzdF0kdGFpbCA6XQp9CgpPYmplY3Q6OkNvcHlIYW5kbGVy
IGluc3Rwcm9jIGNvcHlOYW1lc3BhY2VzIHt9IHsKICBmb3JlYWNoIG5zIFtbc2VsZl0gc2V0IG5z
TGlzdF0gewogICAgc2V0IG5zRGVzdCBbW3NlbGZdIGdldE5zRGVzdCAkbnNdCiAgICBpZiB7W1tz
ZWxmXSBpc29iamVjdCAkbnNdfSB7CiAgICAgICMgY29weSBjbGFzcyBpbmZvcm1hdGlvbgogICAg
ICBpZiB7W1tzZWxmXSBpc2NsYXNzICRuc119IHsKCXNldCBjbCBbWyRucyBpbmZvIGNsYXNzXSBj
cmVhdGUgJG5zRGVzdF0KCSMgY2xhc3Mgb2JqZWN0CglzZXQgb2JqICRjbAoJJGNsIHN1cGVyY2xh
c3MgWyRucyBpbmZvIHN1cGVyY2xhc3NdCgkkY2wgcGFyYW1ldGVyY2xhc3MgWyRucyBpbmZvIHBh
cmFtZXRlcmNsYXNzXQoJJGNsIHBhcmFtZXRlciBbJG5zIGluZm8gcGFyYW1ldGVyXQoJJGNsIGlu
c3RpbnZhciBbJG5zIGluZm8gaW5zdGludmFyXQoJJGNsIGZpbHRlciBbJG5zIGluZm8gZmlsdGVy
XQoJW3NlbGZdIGNvcHlOU1ZhcnNBbmRDbWRzIDo6WE9UY2xDbGFzc2VzOjokbnMgOjpYT1RjbENs
YXNzZXM6OiRuc0Rlc3QKICAgICAgfSBlbHNlIHsKCSMgY3JlYXRlIG9iagoJc2V0IG9iaiBbWyRu
cyBpbmZvIGNsYXNzXSAkbnNEZXN0XQogICAgICB9CiAgICAgICMgY29weSBvYmplY3QgLT4gbWF5
IGJlIGEgY2xhc3Mgb2JqCiAgICAgICRvYmogaW52YXIgWyRucyBpbmZvIGludmFyXQogICAgICAk
b2JqIGNoZWNrIFskbnMgaW5mbyBjaGVja10KICAgICAgJG9iaiBtaXhpbiBbJG5zIGluZm8gbWl4
aW5dCiAgICAgICMgc2V0IG1kIFskbnMgaW5mbyBtZXRhZGF0YV0KICAgICAgIyAkb2JqIG1ldGFk
YXRhIGFkZCAkbWQKICAgICAgIyBmb3JlYWNoIG0gJG1kIHsgJG9iaiBtZXRhZGF0YSAkbSBbJG5z
IG1ldGFkYXRhICRtXSB9CiAgICB9IGVsc2UgewogICAgICBOYW1lc3BhY2UgW1tzZWxmXSBnZXRO
c0Rlc3QgJG5zRGVzdF0KICAgIH0KICAgIFtzZWxmXSBjb3B5TlNWYXJzQW5kQ21kcyAkbnMgJG5z
RGVzdAogIH0KfQoKT2JqZWN0OjpDb3B5SGFuZGxlciBpbnN0cHJvYyBjb3B5IHtvYmogZGVzdH0g
ewogICNwdXRzIHN0ZGVyciAiW3NlbGZdIGNvcHkgPCRvYmo+IDwkZGVzdD4iCiAgW3NlbGZdIHNl
dCBvYmpMZW5ndGggW3N0cmluZyBsZW5ndGggJG9ial0KICBbc2VsZl0gc2V0IGRlc3QgJGRlc3QK
ICBbc2VsZl0gbWFrZU5hbWVzcGFjZUxpc3QgJG9iagogIFtzZWxmXSBjb3B5TmFtZXNwYWNlcwp9
CgpDbGFzcyB4b3RjbDo6Tm9Jbml0IAp4b3RjbDo6Tm9Jbml0IGluc3Rwcm9jIGluaXQgYXJncyB7
O30KCgpPYmplY3QgaW5zdHByb2MgY29weSBuZXdOYW1lIHsKICA6OnNldCBjaCBbW3NlbGYgY2xh
c3NdOjpDb3B5SGFuZGxlciBjcmVhdGUgW1tzZWxmIGNsYXNzXSBhdXRvbmFtZSB4b3RjbENvcHlI
YW5kbGVyXV0KICAkY2ggY29weSBbc2VsZl0gJG5ld05hbWUKICAkY2ggZGVzdHJveQp9CgpPYmpl
Y3QgaW5zdHByb2MgbW92ZSBuZXdOYW1lIHsKICBpZiB7JG5ld05hbWUgIT0gIiJ9IHsKICAgIFtz
ZWxmXSBjb3B5ICRuZXdOYW1lCiAgfQogIFtzZWxmXSBkZXN0cm95Cn0KCnhvdGNsIHByb2MgbG9h
ZCB7b2JqIGZpbGV9IHsKICBzb3VyY2UgJGZpbGUKICBmb3JlYWNoIGkgW2FycmF5IG5hbWVzIDo6
YXV0b19pbmRleCBbbGlzdCAkb2JqICpwcm9jICpdXSB7CiAgICBzZXQgdHlwZSBbbGluZGV4ICRp
IDFdCiAgICBzZXQgbWV0aCBbbGluZGV4ICRpIDJdCiAgICBpZiB7WyRvYmogaW5mbyAke3R5cGV9
cyAkbWV0aF0gPT0ge319IHsKICAgICAgJG9iaiAkdHlwZSAkbWV0aCBhdXRvICQ6OmF1dG9faW5k
ZXgoJGkpCiAgICB9CiAgfQp9CgoKeG90Y2wgcHJvYyBta2luZGV4IHttZXRhIGRpciBhcmdzfSB7
CiAgOjp4b3RjbDo6ZGVwcmVjYXRlZCA6OnhvdGNsOjpta2luZGV4IHBhY2thZ2UKICBzZXQgc3Ag
e1sgICAgICAgICBdK30KICBzZXQgc3Qge15bICAgICAgICBdKn0KICBzZXQgd2QgeyhbXiAgICAg
ICBdKyl9CiAgZm9yZWFjaCBjcmVhdG9yICRtZXRhIHsKICAgIDo6bGFwcGVuZCBjcCAkc3QkY3Jl
YXRvciR7c3B9Y3JlYXRlJHNwJHdkCiAgICA6OmxhcHBlbmQgYXAgJHN0JGNyZWF0b3Ikc3Akd2QK
ICB9CiAgZm9yZWFjaCBtZXRob2Qge3Byb2MgaW5zdHByb2N9IHsKICAgIDo6bGFwcGVuZCBtcCAk
c3Qkd2Qke3NwfSgkbWV0aG9kKSRzcCR3ZAogIH0KICBmb3JlYWNoIGNsIFtjb25jYXQgQ2xhc3Mg
W0NsYXNzIGluZm8gaGVyaXRhZ2VdXSB7CiAgICBldmFsIDo6bGFwcGVuZCBtZXRocyBbJGNsIGlu
Zm8gaW5zdGNvbW1hbmRzXQogIH0KICBzZXQgb2xkIFtwd2RdCiAgY2QgJGRpcgogIDo6YXBwZW5k
IGlkeCAiIyBUY2wgYXV0b2xvYWQgaW5kZXggZmlsZSwgIgogIDo6YXBwZW5kIGlkeCAidmVyc2lv
biAyLjBcbiIKICA6OmFwcGVuZCBpZHggIiMgeG90Y2wgYWRkaXRpb25zIGdlbmVyYXRlZCB3aXRo
ICIKICA6OmFwcGVuZCBpZHggIlwiOjp4b3RjbDo6bWtpbmRleCBbbGlzdCAkbWV0YV0gIgogIDo6
YXBwZW5kIGlkeCAiW2xpc3QgJGRpcl0gJGFyZ3NcIlxuIgogIHNldCBvYyAwCiAgc2V0IG1jIDAK
ICBmb3JlYWNoIGZpbGUgW2V2YWwgZ2xvYiAtbm9jb21wbGFpbiAtLSAkYXJnc10gewogICAgaWYg
e1tjYXRjaCB7c2V0IGYgW29wZW4gJGZpbGVdfSBtc2ddfSB0aGVuIHsKICAgICAgY2F0Y2gge2Ns
b3NlICRmfQogICAgICBjZCAkb2xkCiAgICAgIGVycm9yICRtc2cKICAgIH0KICAgIHdoaWxlIHtb
Z2V0cyAkZiBsaW5lXSA+PSAwfSB7CiAgICAgIGZvcmVhY2ggYyAkY3AgewoJaWYge1tyZWdleHAg
JGMgJGxpbmUgeCBvYmpdPT0xICYmCgkgICAgW3N0cmluZyBpbmRleCAkb2JqIDBdIT17JH19IHRo
ZW4gewoJICA6OmluY3Igb2MKCSAgOjphcHBlbmQgaWR4ICJzZXQgYXV0b19pbmRleCgkb2JqKSAi
CgkgIDo6YXBwZW5kIGlkeCAiXCI6OnhvdGNsOjpsb2FkICRvYmogIgoJICA6OmFwcGVuZCBpZHgg
IlwkZGlyLyRmaWxlXCJcbiIKCX0KICAgICAgfQogICAgICBmb3JlYWNoIGEgJGFwIHsKCWlmIHtb
cmVnZXhwICRhICRsaW5lIHggb2JqXT09MSAmJgoJICAgIFtzdHJpbmcgaW5kZXggJG9iaiAwXSE9
eyR9ICYmCgkgICAgW2xzZWFyY2ggLWV4YWN0ICRtZXRocyAkb2JqXT09LTF9IHsKCSAgOjppbmNy
IG9jCgkgIDo6YXBwZW5kIGlkeCAic2V0IGF1dG9faW5kZXgoJG9iaikgIgoJICA6OmFwcGVuZCBp
ZHggIlwiOjp4b3RjbDo6bG9hZCAkb2JqICIKCSAgOjphcHBlbmQgaWR4ICJcJGRpci8kZmlsZVwi
XG4iCgl9CiAgICAgIH0KICAgICAgZm9yZWFjaCBtICRtcCB7CglpZiB7W3JlZ2V4cCAkbSAkbGlu
ZSB4IG9iaiB0eSBwcl09PTEgJiYKCSAgICBbc3RyaW5nIGluZGV4ICRvYmogMF0hPXskfSAmJgoJ
ICAgIFtzdHJpbmcgaW5kZXggJHByIDBdIT17JH19IHRoZW4gewoJICA6OmluY3IgbWMKCSAgOjph
cHBlbmQgaWR4ICJzZXQgXHthdXRvX2luZGV4KCRvYmogIgoJICA6OmFwcGVuZCBpZHggIiR0eSAk
cHIpXH0gXCJzb3VyY2UgIgoJICA6OmFwcGVuZCBpZHggIlwkZGlyLyRmaWxlXCJcbiIKCX0KICAg
ICAgfQogICAgfQogICAgY2xvc2UgJGYKICB9CiAgc2V0IHQgW29wZW4gdGNsSW5kZXggYStdCiAg
cHV0cyAkdCAkaWR4IG5vbmV3bGluZQogIGNsb3NlICR0CiAgY2QgJG9sZAogIHJldHVybiAiJG9j
IG9iamVjdHMsICRtYyBtZXRob2RzIgp9CgoKeG90Y2wgcHJvYyBjaGVja19saWJyYXJ5X3BhdGgg
e30gewogIGdsb2JhbCBhdXRvX3BhdGggZW52CiAgI3B1dHMgc3RkZXJyICJpbml0aWFsIGF1dG9f
cGF0aCA8JGF1dG9fcGF0aD4iCiAgaWYge1tpbmZvIGV4aXN0cyBlbnYoWE9UQ0wpXSAmJiBbZmls
ZSBpc2RpcmVjdG9yeSAkZW52KFhPVENMKV19IHsKICAgIHNldCA6OnhvdGNsOjpsaWIgJGVudihY
T1RDTCkKICB9IGVsc2UgewogICAgc2V0IHhsIHhvdGNsLSQ6OnhvdGNsOjp2ZXJzaW9uCiAgICBm
b3JlYWNoIGRpciAkYXV0b19wYXRoIHsKICAgICAgaWYge1tzdHJpbmcgbWF0Y2ggKnhvdGNsKiAk
ZGlyXSAmJiBbZmlsZSBpc2RpcmVjdG9yeSAkZGlyXX0gewoJc2V0IDo6eG90Y2w6OmxpYiAkZGly
CiAgICAgICAgcmV0dXJuIDEKICAgICAgfQogICAgfQogICAgIyBjaGVjayBmb3IgZGlyZWN0b3Jp
ZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBjaGVjayB3aGV0aGVyCiAgICAjIHdlIGFyZSBp
biB0aGUgc291cmNlIGRpcmVjdG9yeQogICAgaWYge1tyZWdleHAge14oLioveG90Y2xbXi9dKikv
Py4qJH0gW3B3ZF0gXyBwXSAmJiAKCVtmaWxlIGlzZGlyZWN0b3J5ICRwL3NyY10gJiYgCglbZmls
ZSBpc2RpcmVjdG9yeSAkcC9saWJdfSB7CiAgICAgIHNldCA6OnhvdGNsOjpsaWIgJHAvbGliCiAg
ICAgIHNldCBzdWNjZXNzIDEKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdWNjZXNzXX0g
ewogICAgICAjIGNoZWNrIG9uIHRoZSBhdXRvIHBhdGggZm9yIGNoaWxkIG9yIG5laWdoYm9yID0g
eG90Y2wKICAgICAgZm9yZWFjaCBkICRhdXRvX3BhdGggewoJZm9yZWFjaCB4IFtsaXN0IFtmaWxl
IGpvaW4gJGQgJHhsXSBbZmlsZSBqb2luICRkIC4uICR4bF1dIHsKCSAgI3B1dHMgc3RkZXJyICJj
aGVjayAkeCIKCSAgaWYge1tmaWxlIGlzZGlyZWN0b3J5ICR4XX0geyAKCSAgICBzZXQgOjp4b3Rj
bDo6bGliICR4CgkgICAgc2V0IHN1Y2Nlc3MgMQoJICAgIGJyZWFrCgkgIH0KCX0KCWlmIHtbaW5m
byBleGlzdHMgc3VjY2Vzc119IHticmVha30KICAgICAgfQogICAgfQoKICAgIGlmIHshW2luZm8g
ZXhpc3RzIHN1Y2Nlc3NdICYmICFbZmlsZSBpc2RpcmVjdG9yeSAkOjp4b3RjbDo6bGliXX0gewog
ICAgICBwdXRzIHN0ZGVyciAiQ2Fubm90IGxvY2F0ZSB0aGUgWE9UY2wgbGlicmFyeSBvbiB5b3Vy
IHN5c3RlbSEiCiAgICAgIHJldHVybiAwCiAgICB9CiAgfQogICNwdXRzIHN0ZGVyciAiW2luZm8g
ZXhpc3RzIHN1Y2Nlc3NdIDwkOjp4b3RjbDo6bGliPiIKICBzZXQgYXV0b19wYXRoIFtsaW5zZXJ0
ICRhdXRvX3BhdGggW2V4cHIge1tsbGVuZ3RoICRhdXRvX3BhdGhdLTJ9XSAkOjp4b3RjbDo6bGli
XQogICNwdXRzIHN0ZGVyciAiZmluYWwgYXV0b19wYXRoIDwkYXV0b19wYXRoPiIKfQoKT2JqZWN0
IDo6eG90Y2w6OnJjcwo6OnhvdGNsOjpyY3MgcHJvYyBkYXRlIHN0cmluZyB7CiAgbHJlcGxhY2Ug
W2xyZXBsYWNlICRzdHJpbmcgMCAwXSBlbmQgZW5kCn0gCjo6eG90Y2w6OnJjcyBwcm9jIHZlcnNp
b24gc3RyaW5nIHsKICBsaW5kZXggJHN0cmluZyAyCn0gCgpzZXQgOjp4b3RjbDo6Y29uZmRpciB+
Ly54b3RjbApzZXQgOjp4b3RjbDo6bG9nZGlyICQ6OnhvdGNsOjpjb25mZGlyL2xvZwo=

--------------Boundary-00=_7942CEQHSZH7Q6OTXC7E--