Subject: Fwd: URGENT: Serious bug in IPFilter
To: None <port-i386@netbsd.org>
From: T@W <lsp93@xs4all.nl>
List: port-i386
Date: 04/07/2001 16:51:44
--============_-1225443604==_============
Content-Type: text/plain; charset="us-ascii"


> A *VERY* serious bug has been brought to my attention in IPFilter.
>
> In 10 words or less, fragment caching with can let through "any" packet.
> Ok, so that's 8.
>
> Cause
> =====
> When matching a fragment, only srcip, dstip and IP ID# are checked and
> the fragment cache is checked *before* any rules are checked.  It does
> not even need to be a fragment.  Even if you block all fragments with
> a rule, fragment cache entries can be created by packets that match
> state information currently held.
>
> How to disable fragment caching
> ===============================
> In realtime, use adb or gdb or kgdb or whatever to change the variable
> named "ipfr_inuse" to 1000000.  1000000 isn't important, it just needs
> to be larger than IPFT_SIZE and an integer.
> NOTE: there are no sysctl's on BSD systems to adjust this if securelevel
>       is > 0.
>
> New version details with fix
> ============================
> IP Filter 3.2.*
> Email me (nobody should be using this now :*)
> IP Filter 3.3.22
> ftp://coombs.anu.edu.au/pub/net/ip-filter/ip_fil3.3.22.tar.gz
> ftp://coombs.anu.edu.au/pub/net/ip-filter/patch-3.3.22.gz
> http://coombs.anu.edu.au/~avalon/ip_fil3.3.22.tar.gz
> http://coombs.anu.edu.au/~avalon/patch-3.3.22.gz
> IP Filter 3.4.17
> ftp://coombs.anu.edu.au/pub/net/ip-filter/ip_fil3.4.17.tar.gz
> ftp://coombs.anu.edu.au/pub/net/ip-filter/patch-3.4.17.gz
> http://coombs.anu.edu.au/~avalon/ip_fil3.4.17.tar.gz
> http://coombs.anu.edu.au/~avalon/patch-3.4.17.gz
>
> Frag Patches
> ============
> One attachment each for 3.3.21 and 3.4.16.  These patches do not contain
> changes for NAT code to make the fragment cache selective (see below),
> just stop packets which aren't meant to match from matching.  You are
> much better off updating the whole rev step if you can.
>
> How to enable it in new versions
> ================================
> Enable a security hole you say ?  You will need to have
> "keep state keep frags" in your rule, not just "keep state".
> That is rules with just "keep state" will no longer create
> fragment cache enties (as happens now).
>
> Remaining Issues
> ================
> 1. There is an automatic frgament cache used by NAT which is now disabled
> by default and requires "frag" to be inserted into a NAT rule in order
> for it to function.
>
> 2. Any and all packets which are fragments and match the required tuple
> (being srcip, dstip, ipid) will be let through so long as the frag cache
> entry remains.
>
> 3. Use of "keep frags" with "keep state" means fragment cache entries
> can be created by packets going in *either* direction.  Nothing will
> get added (now) to the fragment cache without being explicitly allowed
> by a rule (IPF or NAT).
>
> Why not reassemble fragmented packets?
> ======================================
> Because it is *really bad* for a router to do this.  I run TCP/IP over a
> fibre channel interface which has an MTU of 65280.  I *cannot* even send
> full size packets over it without them being fragmented due to buffer size
> problems so I'm not going to even think about defragmentation issues!  I
> don't care who does it, if you've done your networking 101, you know why
> routers (i.e. firewalls) do *NOT* defragment packets.
>
> Darren
>
> How to exploit?  Something will end up on bugtraq but so far, what I've
> seen isn't a complete exploit of the problem.

Aftermath from Darren:

>For those using the patch against 3.4.16, I included too much in the
>patchfile.  Delete these lines from either the patch or those with the
>leading "+" from the patched source.
>
>Darren
>
>***************
>*** 1302,1307 ****
>--- 1307,1317 ----
>                                        if (!fr_tcpstate(is, fin, ip,
>tcp)) {
>                                                continue;
>                                        }
>+                               } if ((pr == IPPROTO_UDP)) {
>+                                       if (fin->fin_rev)
>+                                               is->is_age =
>fr_udpacktimeout;
>+                                       else
>+                                               is->is_age = fr_udptimeout;
>                                }
>                                break;
>                        }

Regards,
T@W
--============_-1225443604==_============
Content-Id: <v04220805b6f4d93eba0d@[192.168.1.1].0.0>
Content-Type: multipart/appledouble; boundary="============_-1225443601==_D============"

--============_-1225443601==_D============
Content-Transfer-Encoding: base64
Content-Type: application/applefile; name="%fragpatch-3-4-16.txt"
Content-Disposition: attachment; filename="%fragpatch-3-4-16.txt"
 ; modification-date="Fri, 6 Apr 2001 22:26:29 +0200"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAPgAAABQAAAAJAAAAUgAAACAA
AAAIAAAAcgAAABBmcmFncGF0Y2gtMy00LTE2LnR4dFRFWFRUQkI2AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAmD/EwJg/xVLbQwAAmJfDw==
--============_-1225443601==_D============
Content-Type: application/octet-stream; name="fragpatch-3-4-16.txt"
Content-Disposition: attachment; filename="fragpatch-3-4-16.txt"
Content-Transfer-Encoding: base64

ZGlmZiAtY3IgaXBfZmlsMy40LjE2L2lwX2ZyYWcuYyBpcF9maWwzLjQuMTcvaXBfZnJh
Zy5jDSoqKiBpcF9maWwzLjQuMTYvaXBfZnJhZy5jCU1vbiBOb3YgMjcgMjE6MjY6NTYg
MjAwMA0tLS0gaXBfZmlsMy40LjE3L2lwX2ZyYWcuYwlGcmkgQXByICA2IDIyOjMxOjIw
IDIwMDENKioqKioqKioqKioqKioqDSoqKiA3LDEzICoqKioNICAgKi8NICAjaWYgIWRl
ZmluZWQobGludCkNICBzdGF0aWMgY29uc3QgY2hhciBzY2NzaWRbXSA9ICJAKCMpaXBf
ZnJhZy5jCTEuMTEgMy8yNC85NiAoQykgMTk5My0yMDAwIERhcnJlbiBSZWVkIjsNISBz
dGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gIkAoIykkSWQ6IGlwX2ZyYWcuYyx2IDIu
MTAuMi43IDIwMDAvMTEvMjcgMTA6MjY6NTYgZGFycmVuciBFeHAgJCI7DSAgI2VuZGlm
DSAgDSAgI2lmIGRlZmluZWQoS0VSTkVMKSAmJiAhZGVmaW5lZChfS0VSTkVMKQ0tLS0g
NywxMyAtLS0tDSAgICovDSAgI2lmICFkZWZpbmVkKGxpbnQpDSAgc3RhdGljIGNvbnN0
IGNoYXIgc2Njc2lkW10gPSAiQCgjKWlwX2ZyYWcuYwkxLjExIDMvMjQvOTYgKEMpIDE5
OTMtMjAwMCBEYXJyZW4gUmVlZCI7DSEgc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9
ICJAKCMpJElkOiBpcF9mcmFnLmMsdiAyLjEwLjIuOCAyMDAxLzA0LzA2IDEyOjMxOjIw
IGRhcnJlbnIgRXhwICQiOw0gICNlbmRpZg0gIA0gICNpZiBkZWZpbmVkKEtFUk5FTCkg
JiYgIWRlZmluZWQoX0tFUk5FTCkNKioqKioqKioqKioqKioqDSoqKiAxNDEsMTUyICoq
KioNICB1X2ludCBwYXNzOw0gIGlwZnJfdCAqdGFibGVbXTsNICB7DSEgCWlwZnJfdAkq
KmZwLCAqZnJhLCBmcmFnOw0hIAl1X2ludAlpZHg7DSAgDSAgCWlmIChpcGZyX2ludXNl
ID49IElQRlRfU0laRSkNICAJCXJldHVybiBOVUxMOw0gIA0gIAlmcmFnLmlwZnJfcCA9
IGlwLT5pcF9wOw0gIAlpZHggPSBpcC0+aXBfcDsNICAJZnJhZy5pcGZyX2lkID0gaXAt
PmlwX2lkOw0tLS0gMTQxLDE1NSAtLS0tDSAgdV9pbnQgcGFzczsNICBpcGZyX3QgKnRh
YmxlW107DSAgew0hIAlpcGZyX3QgKipmcCwgKmZyYSwgZnJhZzsNISAJdV9pbnQgaWR4
LCBvZmY7DSAgDSAgCWlmIChpcGZyX2ludXNlID49IElQRlRfU0laRSkNICAJCXJldHVy
biBOVUxMOw0gIA0rIAlpZiAoIShmaW4tPmZpbl9maS5maV9mbCAmIEZJX0ZSQUcpKQ0r
IAkJcmV0dXJuIE5VTEw7DSsgDSAgCWZyYWcuaXBmcl9wID0gaXAtPmlwX3A7DSAgCWlk
eCA9IGlwLT5pcF9wOw0gIAlmcmFnLmlwZnJfaWQgPSBpcC0+aXBfaWQ7DSoqKioqKioq
KioqKioqKg0qKiogMjAwLDIwNiAqKioqDSAgCS8qDSAgCSAqIENvbXB1dGUgdGhlIG9m
ZnNldCBvZiB0aGUgZXhwZWN0ZWQgc3RhcnQgb2YgdGhlIG5leHQgcGFja2V0Lg0gIAkg
Ki8NISAJZnJhLT5pcGZyX29mZiA9IChpcC0+aXBfb2ZmICYgSVBfT0ZGTUFTSykgKyAo
ZmluLT5maW5fZGxlbiA+PiAzKTsNICAJQVRPTUlDX0lOQ0woaXBmcl9zdGF0cy5pZnNf
bmV3KTsNICAJQVRPTUlDX0lOQzMyKGlwZnJfaW51c2UpOw0gIAlyZXR1cm4gZnJhOw0t
LS0gMjAzLDIxMiAtLS0tDSAgCS8qDSAgCSAqIENvbXB1dGUgdGhlIG9mZnNldCBvZiB0
aGUgZXhwZWN0ZWQgc3RhcnQgb2YgdGhlIG5leHQgcGFja2V0Lg0gIAkgKi8NISAJb2Zm
ID0gaXAtPmlwX29mZiAmIElQX09GRk1BU0s7DSEgCWlmICghb2ZmKQ0hIAkJZnJhLT5p
cGZyX3NlZW4wID0gMTsNISAJZnJhLT5pcGZyX29mZiA9IG9mZiArIChmaW4tPmZpbl9k
bGVuID4+IDMpOw0gIAlBVE9NSUNfSU5DTChpcGZyX3N0YXRzLmlmc19uZXcpOw0gIAlB
VE9NSUNfSU5DMzIoaXBmcl9pbnVzZSk7DSAgCXJldHVybiBmcmE7DSoqKioqKioqKioq
KioqKg0qKiogMjU2LDI2MSAqKioqDS0tLSAyNjIsMjcwIC0tLS0NICAJaXBmcl90CSpm
LCBmcmFnOw0gIAl1X2ludAlpZHg7DSAgDSsgCWlmICghKGZpbi0+ZmluX2ZpLmZpX2Zs
ICYgRklfRlJBRykpDSsgCQlyZXR1cm4gTlVMTDsNKyANICAJLyoNICAJICogRm9yIGZy
YWdtZW50cywgd2UgcmVjb3JkIHByb3RvY29sLCBwYWNrZXQgaWQsIFRPUyBhbmQgYm90
aCBJUCMncw0gIAkgKiAodGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSBmb3IgYWxs
IGZyYWdtZW50cyBvZiBhIHBhY2tldCkuDSoqKioqKioqKioqKioqKg0qKiogMjgzLDI4
OCAqKioqDS0tLSAyOTIsMzEwIC0tLS0NICAJCQkgIElQRlJfQ01QU1opKSB7DSAgCQkJ
dV9zaG9ydAlhdG9mZiwgb2ZmOw0gIA0rIAkJCS8qDSsgCQkJICogWFhYIC0gV2UgcmVh
bGx5IG5lZWQgdG8gYmUgZ3VhcmRpbmcgYWdhaW5zdCB0aGUNKyAJCQkgKiByZXRyYW5z
bWlzc2lvbiBvZiAoc3JjLGRzdCxpZCxvZmZzZXQtcmFuZ2UpIGhlcmUNKyAJCQkgKiBi
ZWNhdXNlIGEgZnJhZ21lbnRlZCBwYWNrZXQgaXMgbmV2ZXIgcmVzZW50IHdpdGgNKyAJ
CQkgKiB0aGUgc2FtZSBJUCBJRCMuDSsgCQkJICovDSsgCQkJb2ZmID0gaXAtPmlwX29m
ZiAmIElQX09GRk1BU0s7DSsgCQkJaWYgKGYtPmlwZnJfc2VlbjApIHsNKyAJCQkJaWYg
KCFvZmYgfHwgKGZpbi0+ZmluX2ZpLmZpX2ZsICYgRklfU0hPUlQpKQ0rIAkJCQkJY29u
dGludWU7DSsgCQkJfSBlbHNlIGlmICghb2ZmKQ0rIAkJCQlmLT5pcGZyX3NlZW4wID0g
MTsNKyANICAJCQlpZiAoZiAhPSB0YWJsZVtpZHhdKSB7DSAgCQkJCS8qDSAgCQkJCSAq
IG1vdmUgZnJhZ21lbnQgaW5mby4gdG8gdGhlIHRvcCBvZiB0aGUgbGlzdA0qKioqKioq
KioqKioqKioNKioqIDI5NSwzMDEgKioqKg0gIAkJCQlmLT5pcGZyX3ByZXYgPSBOVUxM
Ow0gIAkJCQl0YWJsZVtpZHhdID0gZjsNICAJCQl9DS0gCQkJb2ZmID0gaXAtPmlwX29m
ZiAmIElQX09GRk1BU0s7DSAgCQkJYXRvZmYgPSBvZmYgKyAoZmluLT5maW5fZGxlbiA+
PiAzKTsNICAJCQkvKg0gIAkJCSAqIElmIHdlJ3ZlIGZvbGx3ZWQgdGhlIGZyYWdtZW50
cywgYW5kIHRoaXMgaXMgdGhlDS0tLSAzMTcsMzIyIC0tLS0NZGlmZiAtY3IgaXBfZmls
My40LjE2L2lwX2ZyYWcuaCBpcF9maWwzLjQuMTcvaXBfZnJhZy5oDSoqKiBpcF9maWwz
LjQuMTYvaXBfZnJhZy5oCVNhdCBOb3YgMTEgMDA6MTA6NTQgMjAwMA0tLS0gaXBfZmls
My40LjE3L2lwX2ZyYWcuaAlGcmkgQXByICA2IDIyOjMxOjIwIDIwMDENKioqKioqKioq
KioqKioqDSoqKiA2LDEyICoqKioNICAgKiB0byB0aGUgb3JpZ2luYWwgYXV0aG9yIGFu
ZCB0aGUgY29udHJpYnV0b3JzLg0gICAqDSAgICogQCgjKWlwX2ZyYWcuaAkxLjUgMy8y
NC85Ng0hICAqICRJZDogaXBfZnJhZy5oLHYgMi40LjIuMiAyMDAwLzExLzEwIDEzOjEw
OjU0IGRhcnJlbnIgRXhwICQNICAgKi8NICANICAjaWZuZGVmCV9fSVBfRlJBR19IX18N
LS0tIDYsMTIgLS0tLQ0gICAqIHRvIHRoZSBvcmlnaW5hbCBhdXRob3IgYW5kIHRoZSBj
b250cmlidXRvcnMuDSAgICoNICAgKiBAKCMpaXBfZnJhZy5oCTEuNSAzLzI0Lzk2DSEg
ICogJElkOiBpcF9mcmFnLmgsdiAyLjQuMi4zIDIwMDEvMDQvMDYgMTI6MzE6MjAgZGFy
cmVuciBFeHAgJA0gICAqLw0gIA0gICNpZm5kZWYJX19JUF9GUkFHX0hfXw0qKioqKioq
KioqKioqKioNKioqIDI0LDMwICoqKioNICAJdV9jaGFyCWlwZnJfcDsNICAJdV9jaGFy
CWlwZnJfdG9zOw0gIAl1X3Nob3J0CWlwZnJfb2ZmOw0hIAl1X3Nob3J0CWlwZnJfdHRs
Ow0gIAlmcmVudHJ5X3QgKmlwZnJfcnVsZTsNICB9IGlwZnJfdDsNICANLS0tIDI0LDMx
IC0tLS0NICAJdV9jaGFyCWlwZnJfcDsNICAJdV9jaGFyCWlwZnJfdG9zOw0gIAl1X3No
b3J0CWlwZnJfb2ZmOw0hIAl1X2NoYXIJaXBmcl90dGw7DSEgCXVfY2hhcglpcGZyX3Nl
ZW4wOw0gIAlmcmVudHJ5X3QgKmlwZnJfcnVsZTsNICB9IGlwZnJfdDsNICANKioqKioq
KioqKioqKioqDSoqKiA0MCw0NiAqKioqDSAgCXN0cnVjdAlpcGZyCSoqaWZzX25hdHRh
YjsNICB9IGlwZnJzdGF0X3Q7DSAgDSEgI2RlZmluZQlJUEZSX0NNUFNaCSg0ICsgNCAr
IDIgKyAxICsgMSkNICANICBleHRlcm4JaW50CWZyX2lwZnJ0dGw7DSAgZXh0ZXJuCWlu
dAlmcl9mcmFnX2xvY2s7DS0tLSA0MSw0OCAtLS0tDSAgCXN0cnVjdAlpcGZyCSoqaWZz
X25hdHRhYjsNICB9IGlwZnJzdGF0X3Q7DSAgDSEgI2RlZmluZQlJUEZSX0NNUFNaCShv
ZmZzZXRvZihpcGZyX3QsIGlwZnJfb2ZmKSAtIFwNISAJCQkgb2Zmc2V0b2YoaXBmcl90
LCBpcGZyX3NyYykpDSAgDSAgZXh0ZXJuCWludAlmcl9pcGZydHRsOw0gIGV4dGVybglp
bnQJZnJfZnJhZ19sb2NrOw1kaWZmIC1jciBpcF9maWwzLjQuMTYvaXBfc3RhdGUuYyBp
cF9maWwzLjQuMTcvaXBfc3RhdGUuYw0qKiogaXBfZmlsMy40LjE2L2lwX3N0YXRlLmMJ
VHVlIEphbiAgOSAwMTowNDo0NiAyMDAxDS0tLSBpcF9maWwzLjQuMTcvaXBfc3RhdGUu
YwlGcmkgQXByICA2IDIyOjMxOjIxIDIwMDENKioqKioqKioqKioqKioqDSoqKiAxLDUg
KioqKg0gIC8qDSEgICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgYnkgRGFycmVuIFJl
ZWQuDSAgICoNICAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQNICAgKiBwcm92aWRlZCB0aGF0IHRoaXMg
bm90aWNlIGlzIHByZXNlcnZlZCBhbmQgZHVlIGNyZWRpdCBpcyBnaXZlbg0tLS0gMSw1
IC0tLS0NICAvKg0hICAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAxIGJ5IERhcnJlbiBS
ZWVkLg0gICAqDSAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkDSAgICogcHJvdmlkZWQgdGhhdCB0aGlz
IG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIGR1ZSBjcmVkaXQgaXMgZ2l2ZW4NKioqKioq
KioqKioqKioqDSoqKiA3LDEzICoqKioNICAgKi8NICAjaWYgIWRlZmluZWQobGludCkN
ICBzdGF0aWMgY29uc3QgY2hhciBzY2NzaWRbXSA9ICJAKCMpaXBfc3RhdGUuYwkxLjgg
Ni81Lzk2IChDKSAxOTkzLTIwMDAgRGFycmVuIFJlZWQiOw0hIHN0YXRpYyBjb25zdCBj
aGFyIHJjc2lkW10gPSAiQCgjKSRJZDogaXBfc3RhdGUuYyx2IDIuMzAuMi4yOCAyMDAx
LzAxLzA4IDE0OjA0OjQ2IGRhcnJlbnIgRXhwICQiOw0gICNlbmRpZg0gIA0gICNpbmNs
dWRlIDxzeXMvZXJybm8uaD4NLS0tIDcsMTMgLS0tLQ0gICAqLw0gICNpZiAhZGVmaW5l
ZChsaW50KQ0gIHN0YXRpYyBjb25zdCBjaGFyIHNjY3NpZFtdID0gIkAoIylpcF9zdGF0
ZS5jCTEuOCA2LzUvOTYgKEMpIDE5OTMtMjAwMCBEYXJyZW4gUmVlZCI7DSEgc3RhdGlj
IGNvbnN0IGNoYXIgcmNzaWRbXSA9ICJAKCMpJElkOiBpcF9zdGF0ZS5jLHYgMi4zMC4y
LjMwIDIwMDEvMDQvMDYgMTI6MzE6MjEgZGFycmVuciBFeHAgJCI7DSAgI2VuZGlmDSAg
DSAgI2luY2x1ZGUgPHN5cy9lcnJuby5oPg0qKioqKioqKioqKioqKioNKioqIDY4OCw2
OTQgKioqKg0gICNlbmRpZg0gIAlSV0xPQ0tfRVhJVCgmaXBmX3N0YXRlKTsNICAJZmlu
LT5maW5fcmV2ID0gSVA2TkVRKGlzLT5pc19kc3QsIGZpbi0+ZmluX2ZpLmZpX2RzdCk7
DSEgCWlmIChmaW4tPmZpbl9maS5maV9mbCAmIEZJX0ZSQUcpDSAgCQlpcGZyX25ld2Zy
YWcoaXAsIGZpbiwgcGFzcyBeIEZSX0tFRVBTVEFURSk7DSAgCXJldHVybiBpczsNICB9
DS0tLSA2OTAsNjk2IC0tLS0NICAjZW5kaWYNICAJUldMT0NLX0VYSVQoJmlwZl9zdGF0
ZSk7DSAgCWZpbi0+ZmluX3JldiA9IElQNk5FUShpcy0+aXNfZHN0LCBmaW4tPmZpbl9m
aS5maV9kc3QpOw0hIAlpZiAoKGZpbi0+ZmluX2ZpLmZpX2ZsICYgRklfRlJBRykgJiYg
KHBhc3MgJiBGUl9LRUVQRlJBRykpDSAgCQlpcGZyX25ld2ZyYWcoaXAsIGZpbiwgcGFz
cyBeIEZSX0tFRVBTVEFURSk7DSAgCXJldHVybiBpczsNICB9DSoqKioqKioqKioqKioq
Kg0qKiogMTMwMiwxMzA3ICoqKioNLS0tIDEzMDcsMTMxNyAtLS0tDSAgCQkJCQlpZiAo
IWZyX3RjcHN0YXRlKGlzLCBmaW4sIGlwLCB0Y3ApKSB7DSAgCQkJCQkJY29udGludWU7
DSAgCQkJCQl9DSsgCQkJCX0gaWYgKChwciA9PSBJUFBST1RPX1VEUCkpIHsNKyAJCQkJ
CWlmIChmaW4tPmZpbl9yZXYpDSsgCQkJCQkJaXMtPmlzX2FnZSA9IGZyX3VkcGFja3Rp
bWVvdXQ7DSsgCQkJCQllbHNlDSsgCQkJCQkJaXMtPmlzX2FnZSA9IGZyX3VkcHRpbWVv
dXQ7DSAgCQkJCX0NICAJCQkJYnJlYWs7DSAgCQkJfQ0qKioqKioqKioqKioqKioNKioq
IDEzNDUsMTM1MSAqKioqDSAgCQlmcl9kZWxzdGF0ZShpcyk7DSAgI2VuZGlmDSAgCVJX
TE9DS19FWElUKCZpcGZfc3RhdGUpOw0hIAlpZiAoZmluLT5maW5fZmkuZmlfZmwgJiBG
SV9GUkFHKQ0gIAkJaXBmcl9uZXdmcmFnKGlwLCBmaW4sIHBhc3MgXiBGUl9LRUVQU1RB
VEUpOw0gIAlyZXR1cm4gZnI7DSAgfQ0tLS0gMTM1NSwxMzYxIC0tLS0NICAJCWZyX2Rl
bHN0YXRlKGlzKTsNICAjZW5kaWYNICAJUldMT0NLX0VYSVQoJmlwZl9zdGF0ZSk7DSEg
CWlmICgoZmluLT5maW5fZmkuZmlfZmwgJiBGSV9GUkFHKSAmJiAocGFzcyAmIEZSX0tF
RVBGUkFHKSkNICAJCWlwZnJfbmV3ZnJhZyhpcCwgZmluLCBwYXNzIF4gRlJfS0VFUFNU
QVRFKTsNICAJcmV0dXJuIGZyOw0gIH0NDQ==
--============_-1225443601==_D============--
--============_-1225443604==_============
Content-Id: <v04220805b6f4d93eba0d@[192.168.1.1].0.1>
Content-Type: multipart/appledouble; boundary="============_-1225443601==_D============"

--============_-1225443601==_D============
Content-Transfer-Encoding: base64
Content-Type: application/applefile; name="%fragpatch-3-3-21.txt"
Content-Disposition: attachment; filename="%fragpatch-3-3-21.txt"
 ; modification-date="Fri, 6 Apr 2001 22:26:32 +0200"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAPgAAABQAAAAJAAAAUgAAACAA
AAAIAAAAcgAAABBmcmFncGF0Y2gtMy0zLTIxLnR4dFRFWFRUQkI2AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAmD/FQJg/xhLbQwAAmJfDw==
--============_-1225443601==_D============
Content-Type: application/octet-stream; name="fragpatch-3-3-21.txt"
Content-Disposition: attachment; filename="fragpatch-3-3-21.txt"
Content-Transfer-Encoding: base64

ZGlmZiAtY3IgaXBfZmlsMy4zLjIxL2lwX2ZyYWcuYyBpcF9maWwzLjMuMjIvaXBfZnJh
Zy5jDSoqKiBpcF9maWwzLjMuMjEvaXBfZnJhZy5jCU1vbiBKYW4gMTUgMDA6NTY6MDgg
MjAwMQ0tLS0gaXBfZmlsMy4zLjIyL2lwX2ZyYWcuYwlGcmkgQXByICA2IDIyOjMxOjA1
IDIwMDENKioqKioqKioqKioqKioqDSoqKiAxLDUgKioqKg0gIC8qDSEgICogQ29weXJp
Z2h0IChDKSAxOTkzLTE5OTggYnkgRGFycmVuIFJlZWQuDSAgICoNICAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJt
aXR0ZWQNICAgKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBh
bmQgZHVlIGNyZWRpdCBpcyBnaXZlbg0tLS0gMSw1IC0tLS0NICAvKg0hICAqIENvcHly
aWdodCAoQykgMTk5My0yMDAxIGJ5IERhcnJlbiBSZWVkLg0gICAqDSAgICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVy
bWl0dGVkDSAgICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQg
YW5kIGR1ZSBjcmVkaXQgaXMgZ2l2ZW4NKioqKioqKioqKioqKioqDSoqKiA3LDEzICoq
KioNICAgKi8NICAjaWYgIWRlZmluZWQobGludCkNICBzdGF0aWMgY29uc3QgY2hhciBz
Y2NzaWRbXSA9ICJAKCMpaXBfZnJhZy5jCTEuMTEgMy8yNC85NiAoQykgMTk5My0xOTk1
IERhcnJlbiBSZWVkIjsNISBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gIkAoIykk
SWQ6IGlwX2ZyYWcuYyx2IDIuNC4yLjcgMjAwMS8wMS8xNCAxMzo1NjowOCBkYXJyZW5y
IEV4cCAkIjsNICAjZW5kaWYNICANICAjaWYgZGVmaW5lZChLRVJORUwpICYmICFkZWZp
bmVkKF9LRVJORUwpDS0tLSA3LDEzIC0tLS0NICAgKi8NICAjaWYgIWRlZmluZWQobGlu
dCkNICBzdGF0aWMgY29uc3QgY2hhciBzY2NzaWRbXSA9ICJAKCMpaXBfZnJhZy5jCTEu
MTEgMy8yNC85NiAoQykgMTk5My0xOTk1IERhcnJlbiBSZWVkIjsNISBzdGF0aWMgY29u
c3QgY2hhciByY3NpZFtdID0gIkAoIykkSWQ6IGlwX2ZyYWcuYyx2IDIuNC4yLjggMjAw
MS8wNC8wNiAxMjozMTowNSBkYXJyZW5yIEV4cCAkIjsNICAjZW5kaWYNICANICAjaWYg
ZGVmaW5lZChLRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpDSoqKioqKioqKioqKioq
Kg0qKiogMTM0LDE0NSAqKioqDSAgdV9pbnQgcGFzczsNICBpcGZyX3QgKnRhYmxlW107
DSAgew0hIAlpcGZyX3QJKipmcCwgKmZyYSwgZnJhZzsNISAJdV9pbnQJaWR4Ow0gIA0g
IAlpZiAoaXBmcl9pbnVzZSA+PSBJUEZUX1NJWkUpDSAgCQlyZXR1cm4gTlVMTDsNICAN
ICAJZnJhZy5pcGZyX3AgPSBpcC0+aXBfcDsNICAJaWR4ID0gaXAtPmlwX3A7DSAgCWZy
YWcuaXBmcl9pZCA9IGlwLT5pcF9pZDsNLS0tIDEzNCwxNDggLS0tLQ0gIHVfaW50IHBh
c3M7DSAgaXBmcl90ICp0YWJsZVtdOw0gIHsNISAJaXBmcl90ICoqZnAsICpmcmEsIGZy
YWc7DSEgCXVfaW50IGlkeCwgb2ZmOw0gIA0gIAlpZiAoaXBmcl9pbnVzZSA+PSBJUEZU
X1NJWkUpDSAgCQlyZXR1cm4gTlVMTDsNICANKyAJaWYgKCEoZmluLT5maW5fZmkuZmlf
ZmwgJiBGSV9GUkFHKSkNKyAJCXJldHVybiBOVUxMOw0rIA0gIAlmcmFnLmlwZnJfcCA9
IGlwLT5pcF9wOw0gIAlpZHggPSBpcC0+aXBfcDsNICAJZnJhZy5pcGZyX2lkID0gaXAt
PmlwX2lkOw0qKioqKioqKioqKioqKioNKioqIDE5MywxOTkgKioqKg0gIAkvKg0gIAkg
KiBDb21wdXRlIHRoZSBvZmZzZXQgb2YgdGhlIGV4cGVjdGVkIHN0YXJ0IG9mIHRoZSBu
ZXh0IHBhY2tldC4NICAJICovDSEgCWZyYS0+aXBmcl9vZmYgPSAoaXAtPmlwX29mZiAm
IElQX09GRk1BU0spICsgKGZpbi0+ZmluX2RsZW4gPj4gMyk7DSAgCUFUT01JQ19JTkMo
aXBmcl9zdGF0cy5pZnNfbmV3KTsNICAJQVRPTUlDX0lOQyhpcGZyX2ludXNlKTsNICAJ
cmV0dXJuIGZyYTsNLS0tIDE5NiwyMDUgLS0tLQ0gIAkvKg0gIAkgKiBDb21wdXRlIHRo
ZSBvZmZzZXQgb2YgdGhlIGV4cGVjdGVkIHN0YXJ0IG9mIHRoZSBuZXh0IHBhY2tldC4N
ICAJICovDSEgCW9mZiA9IGlwLT5pcF9vZmYgJiBJUF9PRkZNQVNLOw0hIAlpZiAoIW9m
ZikNISAJCWZyYS0+aXBmcl9zZWVuMCA9IDE7DSEgCWZyYS0+aXBmcl9vZmYgPSBvZmYg
KyAoZmluLT5maW5fZGxlbiA+PiAzKTsNICAJQVRPTUlDX0lOQyhpcGZyX3N0YXRzLmlm
c19uZXcpOw0gIAlBVE9NSUNfSU5DKGlwZnJfaW51c2UpOw0gIAlyZXR1cm4gZnJhOw0q
KioqKioqKioqKioqKioNKioqIDI0NSwyNTAgKioqKg0tLS0gMjUxLDI1OSAtLS0tDSAg
CWlwZnJfdAkqZiwgZnJhZzsNICAJdV9pbnQJaWR4Ow0gIA0rIAlpZiAoIShmaW4tPmZp
bl9maS5maV9mbCAmIEZJX0ZSQUcpKQ0rIAkJcmV0dXJuIE5VTEw7DSsgDSAgCS8qDSAg
CSAqIEZvciBmcmFnbWVudHMsIHdlIHJlY29yZCBwcm90b2NvbCwgcGFja2V0IGlkLCBU
T1MgYW5kIGJvdGggSVAjJ3MNICAJICogKHRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNh
bWUgZm9yIGFsbCBmcmFnbWVudHMgb2YgYSBwYWNrZXQpLg0qKioqKioqKioqKioqKioN
KioqIDI3MiwyNzcgKioqKg0tLS0gMjgxLDI5OSAtLS0tDSAgCQkJICBJUEZSX0NNUFNa
KSkgew0gIAkJCXVfc2hvcnQJYXRvZmYsIG9mZjsNICANKyAJCQkvKg0rIAkJCSAqIFhY
WCAtIFdlIHJlYWxseSBuZWVkIHRvIGJlIGd1YXJkaW5nIGFnYWluc3QgdGhlDSsgCQkJ
ICogcmV0cmFuc21pc3Npb24gb2YgKHNyYyxkc3QsaWQsb2Zmc2V0LXJhbmdlKSBoZXJl
DSsgCQkJICogYmVjYXVzZSBhIGZyYWdtZW50ZWQgcGFja2V0IGlzIG5ldmVyIHJlc2Vu
dCB3aXRoDSsgCQkJICogdGhlIHNhbWUgSVAgSUQjLg0rIAkJCSAqLw0rIAkJCW9mZiA9
IGlwLT5pcF9vZmYgJiBJUF9PRkZNQVNLOw0rIAkJCWlmIChmLT5pcGZyX3NlZW4wKSB7
DSsgCQkJCWlmICghb2ZmIHx8IChmaW4tPmZpbl9maS5maV9mbCAmIEZJX1NIT1JUKSkN
KyAJCQkJCWNvbnRpbnVlOw0rIAkJCX0gZWxzZSBpZiAoIW9mZikNKyAJCQkJZi0+aXBm
cl9zZWVuMCA9IDE7DSsgDSAgCQkJaWYgKGYgIT0gdGFibGVbaWR4XSkgew0gIAkJCQkv
Kg0gIAkJCQkgKiBtb3ZlIGZyYWdtZW50IGluZm8uIHRvIHRoZSB0b3Agb2YgdGhlIGxp
c3QNKioqKioqKioqKioqKioqDSoqKiAyODQsMjkwICoqKioNICAJCQkJZi0+aXBmcl9w
cmV2ID0gTlVMTDsNICAJCQkJdGFibGVbaWR4XSA9IGY7DSAgCQkJfQ0tIAkJCW9mZiA9
IGlwLT5pcF9vZmYgJiBJUF9PRkZNQVNLOw0gIAkJCWF0b2ZmID0gb2ZmICsgKGZpbi0+
ZmluX2RsZW4gPj4gMyk7DSAgCQkJLyoNICAJCQkgKiBJZiB3ZSd2ZSBmb2xsd2VkIHRo
ZSBmcmFnbWVudHMsIGFuZCB0aGlzIGlzIHRoZQ0tLS0gMzA2LDMxMSAtLS0tDWRpZmYg
LWNyIGlwX2ZpbDMuMy4yMS9pcF9mcmFnLmggaXBfZmlsMy4zLjIyL2lwX2ZyYWcuaA0q
KiogaXBfZmlsMy4zLjIxL2lwX2ZyYWcuaAlTYXQgTm92IDExIDAwOjExOjQ1IDIwMDAN
LS0tIGlwX2ZpbDMuMy4yMi9pcF9mcmFnLmgJRnJpIEFwciAgNiAyMjozMTowNiAyMDAx
DSoqKioqKioqKioqKioqKg0qKiogMSwxMiAqKioqDSAgLyoNISAgKiBDb3B5cmlnaHQg
KEMpIDE5OTMtMTk5OCBieSBEYXJyZW4gUmVlZC4NICAgKg0gICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRl
ZA0gICAqIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkIGFuZCBk
dWUgY3JlZGl0IGlzIGdpdmVuDSAgICogdG8gdGhlIG9yaWdpbmFsIGF1dGhvciBhbmQg
dGhlIGNvbnRyaWJ1dG9ycy4NICAgKg0gICAqIEAoIylpcF9mcmFnLmgJMS41IDMvMjQv
OTYNISAgKiAkSWQ6IGlwX2ZyYWcuaCx2IDIuMi4yLjEgMjAwMC8xMS8xMCAxMzoxMTo0
NSBkYXJyZW5yIEV4cCAkDSAgICovDSAgDSAgI2lmbmRlZglfX0lQX0ZSQUdfSF9fDS0t
LSAxLDEyIC0tLS0NICAvKg0hICAqIENvcHlyaWdodCAoQykgMTk5My0yMDAxIGJ5IERh
cnJlbiBSZWVkLg0gICAqDSAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkDSAgICogcHJvdmlkZWQgdGhh
dCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIGR1ZSBjcmVkaXQgaXMgZ2l2ZW4N
ICAgKiB0byB0aGUgb3JpZ2luYWwgYXV0aG9yIGFuZCB0aGUgY29udHJpYnV0b3JzLg0g
ICAqDSAgICogQCgjKWlwX2ZyYWcuaAkxLjUgMy8yNC85Ng0hICAqICRJZDogaXBfZnJh
Zy5oLHYgMi4yLjIuMiAyMDAxLzA0LzA2IDEyOjMxOjA2IGRhcnJlbnIgRXhwICQNICAg
Ki8NICANICAjaWZuZGVmCV9fSVBfRlJBR19IX18NKioqKioqKioqKioqKioqDSoqKiAy
NCwzMCAqKioqDSAgCXVfY2hhcglpcGZyX3A7DSAgCXVfY2hhcglpcGZyX3RvczsNICAJ
dV9zaG9ydAlpcGZyX29mZjsNISAJdV9zaG9ydAlpcGZyX3R0bDsNICAJZnJlbnRyeV90
ICppcGZyX3J1bGU7DSAgfSBpcGZyX3Q7DSAgDS0tLSAyNCwzMSAtLS0tDSAgCXVfY2hh
cglpcGZyX3A7DSAgCXVfY2hhcglpcGZyX3RvczsNICAJdV9zaG9ydAlpcGZyX29mZjsN
ISAJdV9jaGFyCWlwZnJfdHRsOw0hIAl1X2NoYXIJaXBmcl9zZWVuMDsNICAJZnJlbnRy
eV90ICppcGZyX3J1bGU7DSAgfSBpcGZyX3Q7DSAgDSoqKioqKioqKioqKioqKg0qKiog
NDAsNDYgKioqKg0gIAlzdHJ1Y3QJaXBmcgkqKmlmc19uYXR0YWI7DSAgfSBpcGZyc3Rh
dF90Ow0gIA0hICNkZWZpbmUJSVBGUl9DTVBTWgkoNCArIDQgKyAyICsgMSArIDEpDSAg
DSAgZXh0ZXJuCWludAlmcl9pcGZydHRsOw0gIGV4dGVybglpcGZyc3RhdF90CSppcGZy
X2ZyYWdzdGF0cyBfX1AoKHZvaWQpKTsNLS0tIDQxLDQ4IC0tLS0NICAJc3RydWN0CWlw
ZnIJKippZnNfbmF0dGFiOw0gIH0gaXBmcnN0YXRfdDsNICANISAjZGVmaW5lCUlQRlJf
Q01QU1oJKG9mZnNldG9mKGlwZnJfdCwgaXBmcl9vZmYpIC0gXA0hIAkJCSBvZmZzZXRv
ZihpcGZyX3QsIGlwZnJfc3JjKSkNICANICBleHRlcm4JaW50CWZyX2lwZnJ0dGw7DSAg
ZXh0ZXJuCWlwZnJzdGF0X3QJKmlwZnJfZnJhZ3N0YXRzIF9fUCgodm9pZCkpOw1kaWZm
IC1jciBpcF9maWwzLjMuMjEvaXBfc3RhdGUuYyBpcF9maWwzLjMuMjIvaXBfc3RhdGUu
Yw0qKiogaXBfZmlsMy4zLjIxL2lwX3N0YXRlLmMJV2VkIEF1ZyAgOSAwMjowMDozNSAy
MDAwDS0tLSBpcF9maWwzLjMuMjIvaXBfc3RhdGUuYwlGcmkgQXByICA2IDIyOjMxOjA3
IDIwMDENKioqKioqKioqKioqKioqDSoqKiAxLDUgKioqKg0gIC8qDSEgICogQ29weXJp
Z2h0IChDKSAxOTk1LTE5OTggYnkgRGFycmVuIFJlZWQuDSAgICoNICAgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJt
aXR0ZWQNICAgKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBh
bmQgZHVlIGNyZWRpdCBpcyBnaXZlbg0tLS0gMSw1IC0tLS0NICAvKg0hICAqIENvcHly
aWdodCAoQykgMTk5NS0yMDAxIGJ5IERhcnJlbiBSZWVkLg0gICAqDSAgICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVy
bWl0dGVkDSAgICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQg
YW5kIGR1ZSBjcmVkaXQgaXMgZ2l2ZW4NKioqKioqKioqKioqKioqDSoqKiA3LDEzICoq
KioNICAgKi8NICAjaWYgIWRlZmluZWQobGludCkNICBzdGF0aWMgY29uc3QgY2hhciBz
Y2NzaWRbXSA9ICJAKCMpaXBfc3RhdGUuYwkxLjggNi81Lzk2IChDKSAxOTkzLTE5OTUg
RGFycmVuIFJlZWQiOw0hIHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSAiQCgjKSRJ
ZDogaXBfc3RhdGUuYyx2IDIuMy4yLjI4IDIwMDAvMDgvMDggMTY6MDA6MzUgZGFycmVu
ciBFeHAgJCI7DSAgI2VuZGlmDSAgDSAgI2luY2x1ZGUgPHN5cy9lcnJuby5oPg0tLS0g
NywxMyAtLS0tDSAgICovDSAgI2lmICFkZWZpbmVkKGxpbnQpDSAgc3RhdGljIGNvbnN0
IGNoYXIgc2Njc2lkW10gPSAiQCgjKWlwX3N0YXRlLmMJMS44IDYvNS85NiAoQykgMTk5
My0xOTk1IERhcnJlbiBSZWVkIjsNISBzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0g
IkAoIykkSWQ6IGlwX3N0YXRlLmMsdiAyLjMuMi4zMCAyMDAxLzA0LzA2IDEyOjMxOjA3
IGRhcnJlbnIgRXhwICQiOw0gICNlbmRpZg0gIA0gICNpbmNsdWRlIDxzeXMvZXJybm8u
aD4NKioqKioqKioqKioqKioqDSoqKiA0MjcsNDMzICoqKioNICAjZW5kaWYNICAJUldM
T0NLX0VYSVQoJmlwZl9zdGF0ZSk7DSAgCWZpbi0+ZmluX3JldiA9IChpcy0+aXNfZHN0
LnNfYWRkciAhPSBpcC0+aXBfZHN0LnNfYWRkcik7DSEgCWlmIChmaW4tPmZpbl9maS5m
aV9mbCAmIEZJX0ZSQUcpDSAgCQlpcGZyX25ld2ZyYWcoaXAsIGZpbiwgcGFzcyBeIEZS
X0tFRVBTVEFURSk7DSAgCXJldHVybiBpczsNICB9DS0tLSA0MjcsNDMzIC0tLS0NICAj
ZW5kaWYNICAJUldMT0NLX0VYSVQoJmlwZl9zdGF0ZSk7DSAgCWZpbi0+ZmluX3JldiA9
IChpcy0+aXNfZHN0LnNfYWRkciAhPSBpcC0+aXBfZHN0LnNfYWRkcik7DSEgCWlmICgo
ZmluLT5maW5fZmkuZmlfZmwgJiBGSV9GUkFHKSAmJiAocGFzcyAmIEZSX0tFRVBGUkFH
KSkNICAJCWlwZnJfbmV3ZnJhZyhpcCwgZmluLCBwYXNzIF4gRlJfS0VFUFNUQVRFKTsN
ICAJcmV0dXJuIGlzOw0gIH0NKioqKioqKioqKioqKioqDSoqKiA0NzcsNDgzICoqKioN
ICAJaWYgKCEodGNwLT50aF9mbGFncyAmIFRIX0FDSykpIHsgIC8qIFByZXRlbmQgYW4g
YWNrIHdhcyBzZW50ICovDSAgCQlhY2sgPSB0ZGF0YS0+dGRfZW5kOw0gIAkJd2luID0g
MTsNISAJCWlmICgodGNwLT50aF9mbGFncyA9PSBUSF9TWU4pICYmICh0ZGF0YS0+dGRf
bWF4d2luID09IDApKQ0gIAkJCSB0ZGF0YS0+dGRfbWF4d2luID0gMTsNICAJfSBlbHNl
IGlmICgoKHRjcC0+dGhfZmxhZ3MgJiAoVEhfQUNLfFRIX1JTVCkpID09IChUSF9BQ0t8
VEhfUlNUKSkgJiYNICAJCSAgIChhY2sgPT0gMCkpIHsNLS0tIDQ3Nyw0ODQgLS0tLQ0g
IAlpZiAoISh0Y3AtPnRoX2ZsYWdzICYgVEhfQUNLKSkgeyAgLyogUHJldGVuZCBhbiBh
Y2sgd2FzIHNlbnQgKi8NICAJCWFjayA9IHRkYXRhLT50ZF9lbmQ7DSAgCQl3aW4gPSAx
Ow0hIAkJaWYgKCh0Y3AtPnRoX2ZsYWdzICYgVEhfU1lOID09IFRIX1NZTikgJiYNISAJ
CSAgICAodGRhdGEtPnRkX21heHdpbiA9PSAwKSkNICAJCQkgdGRhdGEtPnRkX21heHdp
biA9IDE7DSAgCX0gZWxzZSBpZiAoKCh0Y3AtPnRoX2ZsYWdzICYgKFRIX0FDS3xUSF9S
U1QpKSA9PSAoVEhfQUNLfFRIX1JTVCkpICYmDSAgCQkgICAoYWNrID09IDApKSB7DSoq
KioqKioqKioqKioqKg0qKiogMTAyMSwxMDI3ICoqKioNICAJCWZyX2RlbHN0YXRlKGlz
KTsNICAjZW5kaWYNICAJUldMT0NLX0VYSVQoJmlwZl9zdGF0ZSk7DSEgCWlmIChmaW4t
PmZpbl9maS5maV9mbCAmIEZJX0ZSQUcpDSAgCQlpcGZyX25ld2ZyYWcoaXAsIGZpbiwg
cGFzcyBeIEZSX0tFRVBTVEFURSk7DSAgCXJldHVybiBmcjsNICB9DS0tLSAxMDIyLDEw
MjggLS0tLQ0gIAkJZnJfZGVsc3RhdGUoaXMpOw0gICNlbmRpZg0gIAlSV0xPQ0tfRVhJ
VCgmaXBmX3N0YXRlKTsNISAJaWYgKChmaW4tPmZpbl9maS5maV9mbCAmIEZJX0ZSQUcp
ICYmIChwYXNzICYgRlJfS0VFUEZSQUcpKQ0gIAkJaXBmcl9uZXdmcmFnKGlwLCBmaW4s
IHBhc3MgXiBGUl9LRUVQU1RBVEUpOw0gIAlyZXR1cm4gZnI7DSAgfQ0N
--============_-1225443601==_D============--
--============_-1225443604==_============--