delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2023/01/24/18:40:00

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
X-Recipient: djgpp AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20210112;
h=to:subject:message-id:date:from:references:in-reply-to:mime-version
:from:to:cc:subject:date:message-id:reply-to;
bh=W4EV0FgwfvhDJtJv6qP2S0QDn9mvqjwAWE7kpYUFCLs=;
b=Z2ya6B6Wncvg9rKkWOsLuK2MHYYdCjvv3ALZP+MB24TDSWgTQLzBE4lPE1LOK1Zd1I
hYwKZ50db+kCzEvS/1i4ui+UXmpsC6XBx+t65qiM7gxnSSE6HP98KXNjd7MeKQmJx+xI
hQobwRgfkezgIXYgE8JQImCzcdrY4vajZjG6lyAFMSe6iOKYRMWHNgRizUomHcPyCGss
Wk6QH2TENqAJxqCHBE9RkJyQ/hIc0Srb5UpMsJPzlCdqynwTDrlOGvdyTji+0mO/XD71
qygEqF1JoTluuc4v1a+F2B+cg4psOaUIDFEAUYr1nkr/ikPSV/kNddNEogDHTzadiXwG
jhRQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20210112;
h=to:subject:message-id:date:from:references:in-reply-to:mime-version
:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
bh=W4EV0FgwfvhDJtJv6qP2S0QDn9mvqjwAWE7kpYUFCLs=;
b=0qxOkDoLMkk9vss7qkGic2025zFWqvBOOhfXPHYCaX0qnW+/kOnk4kGVOH55cQvLRB
xZIZiXcNIqjtEsgyrSHVP9IvF/gCAI0Zlb+SwR0iwwsI1N0VdyneQQjzJyB+XTZCLqM4
nfIyHnGoFTWjjPgMMyy4QGRrkMrU6FTzJsbfOeJYZWt1uqCYAQdoWe5htC2A889jqE9W
+cDr002m9iYioas4nyypu//ukL4vnJnQmOlCNN/AnN9kO2ICpXjSr4LaNMQGnYT+QMkH
udamweLxoTV4PBwDR30R4QDNC4nUwReZI/A/9amZRQth1MGuBkvk+f3xyekobNRwfmSo
/lnw==
X-Gm-Message-State: AFqh2kqmbwrtjiUrnzxipv6R399O1cKZGQWmWRG4vX7RNTwq4ODwQ7QT
u8t55cKTN3LnniuQO3CRjJyqahBh9gLo4oA8j9G45Vyg
X-Google-Smtp-Source: AMrXdXv5TsWlTycouKjJdj5A7PPulbu/unrNXWErt6FnEKE9mwQcTGfKuRHOfwmKXz9C2BDYDaz9nlnj47H2zuxoU2U=
X-Received: by 2002:a17:902:e5ce:b0:189:9a36:accf with SMTP id
u14-20020a170902e5ce00b001899a36accfmr2944193plf.19.1674603396947; Tue, 24
Jan 2023 15:36:36 -0800 (PST)
MIME-Version: 1.0
In-Reply-To: <5de28b44-10f2-c824-def1-d451035ecaad@gmail.com>
References: <744f054f-9682-4a05-91ad-684b18c0122b AT gmail DOT com>
<21e1aa0b-1511-0071-84c0-b20c6a3d1dae AT gmail DOT com> <5de28b44-10f2-c824-def1-d451035ecaad AT gmail DOT com>
From: "Frank H. Sapone (emoaddict15 AT gmail DOT com) [via djgpp AT delorie DOT com]" <djgpp AT delorie DOT com>
Date: Tue, 24 Jan 2023 18:36:35 -0500
Message-ID: <CACuL_+D9jQtMvFx4-thuLjrjbO+etmdipOdwJJJXCiWB3s6t2w@mail.gmail.com>
Subject: Re: [PATCH] stub: ignore host exit status
To: "djgpp AT delorie DOT com" <djgpp AT delorie DOT com>
Reply-To: djgpp AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

--0000000000009d663005f30afc82
Content-Type: text/plain; charset="UTF-8"

I know you're looking for feedback but I dont use hdpmi32 and don't know of
too many others that do except to run some windows console apps under dos.
Cwsdpmi works just fine for djgpp.

In any case, someone who knows what they're looking at can hopefully chime
in.  Just wanted to let you know we're receiving your messages. :)

On Tuesday, January 24, 2023, J.W. Jagersma (jwjagersma AT gmail DOT com) [via
djgpp AT delorie DOT com] <djgpp AT delorie DOT com> wrote:

> Would appreciate any feedback on this.  I know there's a small mistake in
> one
> comment, but the code works.
>
> On 2022-11-25 00:26, J.W. Jagersma wrote:
> > On 2022-11-23 20:47, J.W. Jagersma wrote:
> >> Hi all,
> >>
> >> If you've ever tried using hdpmi32 with a djgpp program, you may have
> >> noticed some strange behavior.  The program first fails to run with
> >> "Load error: no DPMI", but on the second try, it suddenly works.  Then
> >> a third invocation fails again, the fourth runs fine, etc.
> >>
> >> When you rename 'hdpmi32.exe' to 'cwsdpmi.exe', your program seems to
> >> run consistently.  But this is only because there is a second (real)
> >> cwsdpmi in your PATH somewhere.  What really happens, is that your
> >> program alternates between running under hdpmi and cwsdpmi.
> >>
> >> I finally figured out why this happens, and it's very simple: hdpmi uses
> >> the exit status to indicate if it was loaded via xms, vcpi, or int15.
> >> And the djgpp stub considers any non-zero exit status to be a failure,
> >> so it keeps searching PATH until cwsdpmi is found, which always returns
> >> zero.
> >>
> >> For a possible solution, I would suggest to ignore the return status
> >> from the host, and just check int 2f/1687 after every exec.  As an added
> >> bonus, this saves 13 bytes of stub space.
> >
> > Amended patch follows - it no longer skips the last iteration (exec
> > with no path).
> >
> > It's a bit larger, but still saves 6 bytes in total.
> >
> > --- a/src/stub/stub.asm
> > +++ b/src/stub/stub.asm
> > @@ -199,38 +199,49 @@ not_path:
> >  ;-----------------------------------------------------------
> ------------------
> >  ;  Get DPMI information before doing anything 386-specific
> >
> > -     push    es
> >       push    di
> > -     xor     cx, cx                  ; flag for load attempt set cx = 0
> > -     jz      @f2                     ; We always jump, shorter than jmp
> > +                                     ; Set up loadname in case of no
> DPMI.
> > +                                     ; First try current dir.
> > +     xor     ah, ah                  ; Copy until this character (=0)
> > +     call    store_env_string        ; copy stub image to "loadname"
> > +     mov     si, bx                  ; remove name so we can add DPMI
> name
> > +     mov     di, [path_off]          ; Pointer to path contents (next
> try)
> >  @b1:
> > +     xor     cx, cx                  ; flag to signal end of loop
> > +@b2:
> > +     call    check_dpmi              ; int 2f, ax=1687
> > +     jz      @f3
> > +     call    do_exec                 ; copy our name to string and try
> load
> > +     jcxz    @f1                     ; cx=0 while we have more paths to
> try
> > +     call    check_dpmi              ; last chance...
> > +     jz      @f3
> >       mov     al, 110
> >       mov     dx, msg_no_dpmi
> >       jmpl    error
> > -@b2:
> > -     or      cx, cx
> > -     jnz     @b1                     ; we already tried load once before
> > -     inc     cx
> > -     call    load_dpmi
> > -     jc      @b1
> > +@f1:
> > +                                     ; Set up loadname for next attempt.
> > +     mov     ah, ';'                 ; Copy until this character
> > +     call    store_env_string        ; to "loadname"
> > +     or      al, al                  ; Check terminating character
> > +     jne     @f2                     ; If ';', continue
> > +     dec     di                      ; else point at null for next pass.
> >  @f2:
> > -     mov     ax, 0x1687              ; get DPMI entry point
> > -     int     0x2f
> > -     or      ax, ax
> > -     jnz     @b2                     ; if 0 then it's there
> > -     and     bl, 1                   ; 32 bit capable?
> > -     jz      @b2
> > +     inc     cx
> > +     cmp     si, loadname            ; anything there?
> > +     je      @b2                     ; final try (no path)
> > +     mov     al, [si-1]
> > +     call    test_delim              ; is final character a path
> delimiter
> > +     je      @b1
> > +     movb    [si], '\\'              ; no, add separator between path &
> name
> > +     inc     si
> > +     jmp     @b1
> >  @f3:
> > -     mov     [modesw], di            ; store the DPMI entry point
> > -     mov     [modesw+2], es
> > -     mov     [modesw_mem], si
> >       pop     di
> > -     pop     es
> >
> >  ;-----------------------------------------------------------
> ------------------
> >  ;  Now, find the name of the program file we are supposed to load.
> >
> > -;    xor     ah, ah                  ; termination character (set
> above!)
> > +;    xor     ah, ah                  ; termination char (set by
> check_dpmi)
> >       call    store_env_string        ; copy it to loadname, set bx
> >
> >       mov     [stubinfo_env_size], di
> > @@ -700,36 +711,29 @@ pm_dos:
> >       ret
> >
> >  ;-----------------------------------------------------------
> ------------------
> > -;  load DPMI server if not present
> > -;   First check directory from which stub is loaded, then path, then
> default
> > -;   On entry di points to image name
> > +; Check for presence of a DPMI host, and save the mode switch address.
> > +; Zero flag is clear on success.  Clobbers ax/bx/dx.
> >
> > -path_off:
> > -     .dw     0                       ; If stays zero, no path
> > -
> > -load_dpmi:
> > -     xor     ah, ah                  ; Copy until this character (=0)
> > -     call    store_env_string        ; copy stub image to "loadname"
> > -     mov     si, bx                  ; remove name so we can add DPMI
> name
> > -     mov     di, [path_off]          ; Pointer to path contents (next
> try)
> > -     jmp     @f2
> > -loadloop:
> > -     mov     ah, ';'                 ; Copy until this character
> > -     call    store_env_string        ; to "loadname"
> > -     or      al,al                   ; Check terminating character
> > -     jne     @f1                     ; If ';', continue
> > -     dec     di                      ; else point at null for next pass.
> > -@f1:
> > -     cmp     si, loadname            ; anything there?
> > -     je      do_exec                 ; final try (no path) let it return
> > -     mov     al, [si-1]
> > -     call    test_delim              ; is final character a path
> delimiter
> > -     je      @f2
> > -     movb    [si], '\\'              ; no, add separator between path &
> name
> > -     inc     si
> > -@f2:
> > -     call    do_exec                 ; copy our name to string and try
> load
> > -     jc      loadloop
> > +check_dpmi:
> > +     push    es
> > +     push    cx
> > +     push    di
> > +     push    si
> > +     mov     ax, 0x1687              ; get DPMI entry point
> > +     int     0x2f
> > +     mov     dx, bx
> > +     or      dl, 1                   ; bx bit 0: 32-bit capable
> > +     xor     bx, dx
> > +     or      ax, bx                  ; DPMI present if ax = 0
> > +     jnz     @f1
> > +     mov     [modesw], di            ; store the DPMI entry point
> > +     mov     [modesw+2], es
> > +     mov     [modesw_mem], si
> > +@f1:
> > +     pop     si
> > +     pop     di
> > +     pop     cx
> > +     pop     es
> >       ret
> >
> >  ;-----------------------------------------------------------
> ------------------
> > @@ -766,13 +770,6 @@ do_exec:
> >       int     0x21
> >       pop     di
> >       pop     es
> > -     jc      @f1                     ;carry set if exec failed
> > -
> > -     mov     ah, 0x4d                ;get return code
> > -     int     0x21
> > -     sub     ax, 0x300               ;ah=3 TSR, al=code (success)
> > -     neg     ax                      ;CY, if not originally 0x300
> > -@f1:
> >       jmp     restore_umb             ;called func. return for us.
> >
> >  ;-----------------------------------------------------------
> ------------------
> > @@ -796,10 +793,9 @@ include_umb:
> >  @f1:
> >       ret
> >
> > -; Restore upper memory status.  All registers and flags preserved.
> > +; Restore upper memory status.  All registers preserved.
> >
> >  restore_umb:
> > -     pushf
> >       cmpb    [dos_major], 5          ; Won't work before dos 5
> >       jb      @f1
> >       push    ax
> > @@ -815,7 +811,6 @@ restore_umb:
> >       pop     bx
> >       pop     ax
> >  @f1:
> > -     popf
> >       ret
> >
> >  ;-----------------------------------------------------------
> ------------------
> > @@ -840,6 +835,8 @@ msg_no_selectors:
> >       .db     "no DPMI selectors$"
> >  msg_no_dpmi_memory:
> >       .db     "no DPMI memory$"
> > +path_off:
> > +     .dw     0                       ; Points to PATH, stays zero if
> none.
> >
> >  ;-----------------------------------------------------------
> ------------------
> >  ;  Unstored Data, available during and after mode switch
> >
>
>

--0000000000009d663005f30afc82
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

SSBrbm93IHlvdSYjMzk7cmUgbG9va2luZyBmb3IgZmVlZGJhY2sgYnV0IEkgZG9udCB1c2UgaGRw
bWkzMiBhbmQgZG9uJiMzOTt0IGtub3cgb2YgdG9vIG1hbnkgb3RoZXJzIHRoYXQgZG8gZXhjZXB0
IHRvIHJ1biBzb21lIHdpbmRvd3MgY29uc29sZSBhcHBzIHVuZGVyIGRvcy7CoCBDd3NkcG1pIHdv
cmtzIGp1c3QgZmluZSBmb3IgZGpncHAuPGRpdj48YnI+PC9kaXY+PGRpdj5JbiBhbnkgY2FzZSwg
c29tZW9uZSB3aG8ga25vd3Mgd2hhdCB0aGV5JiMzOTtyZSBsb29raW5nIGF0IGNhbiBob3BlZnVs
bHkgY2hpbWUgaW4uwqAgSnVzdCB3YW50ZWQgdG8gbGV0IHlvdSBrbm93IHdlJiMzOTtyZSByZWNl
aXZpbmcgeW91ciBtZXNzYWdlcy4gOik8YnI+PGJyPk9uIFR1ZXNkYXksIEphbnVhcnkgMjQsIDIw
MjMsIEouVy4gSmFnZXJzbWEgKDxhIGhyZWY9Im1haWx0bzpqd2phZ2Vyc21hQGdtYWlsLmNvbSI+
andqYWdlcnNtYUBnbWFpbC5jb208L2E+KSBbdmlhIDxhIGhyZWY9Im1haWx0bzpkamdwcEBkZWxv
cmllLmNvbSI+ZGpncHBAZGVsb3JpZS5jb208L2E+XSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmRqZ3Bw
QGRlbG9yaWUuY29tIj5kamdwcEBkZWxvcmllLmNvbTwvYT4mZ3Q7IHdyb3RlOjxicj48YmxvY2tx
dW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhleDtib3JkZXIt
bGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij5Xb3VsZCBhcHByZWNpYXRlIGFu
eSBmZWVkYmFjayBvbiB0aGlzLsKgIEkga25vdyB0aGVyZSYjMzk7cyBhIHNtYWxsIG1pc3Rha2Ug
aW4gb25lPGJyPg0KY29tbWVudCwgYnV0IHRoZSBjb2RlIHdvcmtzLjxicj4NCjxicj4NCk9uIDIw
MjItMTEtMjUgMDA6MjYsIEouVy4gSmFnZXJzbWEgd3JvdGU6PGJyPg0KJmd0OyBPbiAyMDIyLTEx
LTIzIDIwOjQ3LCBKLlcuIEphZ2Vyc21hIHdyb3RlOjxicj4NCiZndDsmZ3Q7IEhpIGFsbCw8YnI+
DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IElmIHlvdSYjMzk7dmUgZXZlciB0cmllZCB1c2luZyBo
ZHBtaTMyIHdpdGggYSBkamdwcCBwcm9ncmFtLCB5b3UgbWF5IGhhdmU8YnI+DQomZ3Q7Jmd0OyBu
b3RpY2VkIHNvbWUgc3RyYW5nZSBiZWhhdmlvci7CoCBUaGUgcHJvZ3JhbSBmaXJzdCBmYWlscyB0
byBydW4gd2l0aDxicj4NCiZndDsmZ3Q7ICZxdW90O0xvYWQgZXJyb3I6IG5vIERQTUkmcXVvdDss
IGJ1dCBvbiB0aGUgc2Vjb25kIHRyeSwgaXQgc3VkZGVubHkgd29ya3MuwqAgVGhlbjxicj4NCiZn
dDsmZ3Q7IGEgdGhpcmQgaW52b2NhdGlvbiBmYWlscyBhZ2FpbiwgdGhlIGZvdXJ0aCBydW5zIGZp
bmUsIGV0Yy48YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IFdoZW4geW91IHJlbmFtZSAmIzM5
O2hkcG1pMzIuZXhlJiMzOTsgdG8gJiMzOTtjd3NkcG1pLmV4ZSYjMzk7LCB5b3VyIHByb2dyYW0g
c2VlbXMgdG88YnI+DQomZ3Q7Jmd0OyBydW4gY29uc2lzdGVudGx5LsKgIEJ1dCB0aGlzIGlzIG9u
bHkgYmVjYXVzZSB0aGVyZSBpcyBhIHNlY29uZCAocmVhbCk8YnI+DQomZ3Q7Jmd0OyBjd3NkcG1p
IGluIHlvdXIgUEFUSCBzb21ld2hlcmUuwqAgV2hhdCByZWFsbHkgaGFwcGVucywgaXMgdGhhdCB5
b3VyPGJyPg0KJmd0OyZndDsgcHJvZ3JhbSBhbHRlcm5hdGVzIGJldHdlZW4gcnVubmluZyB1bmRl
ciBoZHBtaSBhbmQgY3dzZHBtaS48YnI+DQomZ3Q7Jmd0Ozxicj4NCiZndDsmZ3Q7IEkgZmluYWxs
eSBmaWd1cmVkIG91dCB3aHkgdGhpcyBoYXBwZW5zLCBhbmQgaXQmIzM5O3MgdmVyeSBzaW1wbGU6
IGhkcG1pIHVzZXM8YnI+DQomZ3Q7Jmd0OyB0aGUgZXhpdCBzdGF0dXMgdG8gaW5kaWNhdGUgaWYg
aXQgd2FzIGxvYWRlZCB2aWEgeG1zLCB2Y3BpLCBvciBpbnQxNS48YnI+DQomZ3Q7Jmd0OyBBbmQg
dGhlIGRqZ3BwIHN0dWIgY29uc2lkZXJzIGFueSBub24temVybyBleGl0IHN0YXR1cyB0byBiZSBh
IGZhaWx1cmUsPGJyPg0KJmd0OyZndDsgc28gaXQga2VlcHMgc2VhcmNoaW5nIFBBVEggdW50aWwg
Y3dzZHBtaSBpcyBmb3VuZCwgd2hpY2ggYWx3YXlzIHJldHVybnM8YnI+DQomZ3Q7Jmd0OyB6ZXJv
Ljxicj4NCiZndDsmZ3Q7PGJyPg0KJmd0OyZndDsgRm9yIGEgcG9zc2libGUgc29sdXRpb24sIEkg
d291bGQgc3VnZ2VzdCB0byBpZ25vcmUgdGhlIHJldHVybiBzdGF0dXM8YnI+DQomZ3Q7Jmd0OyBm
cm9tIHRoZSBob3N0LCBhbmQganVzdCBjaGVjayBpbnQgMmYvMTY4NyBhZnRlciBldmVyeSBleGVj
LsKgIEFzIGFuIGFkZGVkPGJyPg0KJmd0OyZndDsgYm9udXMsIHRoaXMgc2F2ZXMgMTMgYnl0ZXMg
b2Ygc3R1YiBzcGFjZS48YnI+DQomZ3Q7IDxicj4NCiZndDsgQW1lbmRlZCBwYXRjaCBmb2xsb3dz
IC0gaXQgbm8gbG9uZ2VyIHNraXBzIHRoZSBsYXN0IGl0ZXJhdGlvbiAoZXhlYzxicj4NCiZndDsg
d2l0aCBubyBwYXRoKS48YnI+DQomZ3Q7IDxicj4NCiZndDsgSXQmIzM5O3MgYSBiaXQgbGFyZ2Vy
LCBidXQgc3RpbGwgc2F2ZXMgNiBieXRlcyBpbiB0b3RhbC48YnI+DQomZ3Q7IDxicj4NCiZndDsg
LS0tIGEvc3JjL3N0dWIvc3R1Yi5hc208YnI+DQomZ3Q7ICsrKyBiL3NyYy9zdHViL3N0dWIuYXNt
PGJyPg0KJmd0OyBAQCAtMTk5LDM4ICsxOTksNDkgQEAgbm90X3BhdGg6PGJyPg0KJmd0O8KgIDst
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7wqAgO8KgIEdldCBEUE1JIGlu
Zm9ybWF0aW9uIGJlZm9yZSBkb2luZyBhbnl0aGluZyAzODYtc3BlY2lmaWM8YnI+DQomZ3Q7wqAg
PGJyPg0KJmd0OyAtwqAgwqAgwqBwdXNowqAgwqAgZXM8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwdXNo
wqAgwqAgZGk8YnI+DQomZ3Q7IC3CoCDCoCDCoHhvcsKgIMKgIMKgY3gsIGN4wqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgOyBmbGFnIGZvciBsb2FkIGF0dGVtcHQgc2V0IGN4ID0gMDxicj4NCiZn
dDsgLcKgIMKgIMKganrCoCDCoCDCoCBAZjLCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oDsgV2UgYWx3YXlzIGp1bXAsIHNob3J0ZXIgdGhhbiBqbXA8YnI+DQomZ3Q7ICvCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgU2V0IHVwIGxv
YWRuYW1lIGluIGNhc2Ugb2Ygbm8gRFBNSS48YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgRmlyc3QgdHJ5IGN1cnJlbnQg
ZGlyLjxicj4NCiZndDsgK8KgIMKgIMKgeG9ywqAgwqAgwqBhaCwgYWjCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXIgKD0wKTxicj4NCiZndDsgK8Kg
IMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfCoCDCoCDCoCDCoCA7IGNvcHkgc3R1YiBp
bWFnZSB0byAmcXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgK8KgIMKgIMKgbW92wqAgwqAg
wqBzaSwgYnjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IHJlbW92ZSBuYW1lIHNvIHdlIGNh
biBhZGQgRFBNSSBuYW1lPGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoGRpLCBbcGF0aF9v
ZmZdwqAgwqAgwqAgwqAgwqAgOyBQb2ludGVyIHRvIHBhdGggY29udGVudHMgKG5leHQgdHJ5KTxi
cj4NCiZndDvCoCBAYjE6PGJyPg0KJmd0OyArwqAgwqAgwqB4b3LCoCDCoCDCoGN4LCBjeMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgZmxhZyB0byBzaWduYWwgZW5kIG9mIGxvb3A8YnI+DQom
Z3Q7ICtAYjI6PGJyPg0KJmd0OyArwqAgwqAgwqBjYWxswqAgwqAgY2hlY2tfZHBtacKgIMKgIMKg
IMKgIMKgIMKgIMKgIDsgaW50IDJmLCBheD0xNjg3PGJyPg0KJmd0OyArwqAgwqAgwqBqesKgIMKg
IMKgIEBmMzxicj4NCiZndDsgK8KgIMKgIMKgY2FsbMKgIMKgIGRvX2V4ZWPCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoDsgY29weSBvdXIgbmFtZSB0byBzdHJpbmcgYW5kIHRyeSBsb2FkPGJyPg0K
Jmd0OyArwqAgwqAgwqBqY3h6wqAgwqAgQGYxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqA7IGN4PTAgd2hpbGUgd2UgaGF2ZSBtb3JlIHBhdGhzIHRvIHRyeTxicj4NCiZndDsgK8KgIMKg
IMKgY2FsbMKgIMKgIGNoZWNrX2RwbWnCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGxhc3QgY2hhbmNl
Li4uPGJyPg0KJmd0OyArwqAgwqAgwqBqesKgIMKgIMKgIEBmMzxicj4NCiZndDvCoCDCoCDCoCDC
oG1vdsKgIMKgIMKgYWwsIDExMDxicj4NCiZndDvCoCDCoCDCoCDCoG1vdsKgIMKgIMKgZHgsIG1z
Z19ub19kcG1pPGJyPg0KJmd0O8KgIMKgIMKgIMKgam1wbMKgIMKgIGVycm9yPGJyPg0KJmd0OyAt
QGIyOjxicj4NCiZndDsgLcKgIMKgIMKgb3LCoCDCoCDCoCBjeCwgY3g8YnI+DQomZ3Q7IC3CoCDC
oCDCoGpuesKgIMKgIMKgQGIxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IHdlIGFs
cmVhZHkgdHJpZWQgbG9hZCBvbmNlIGJlZm9yZTxicj4NCiZndDsgLcKgIMKgIMKgaW5jwqAgwqAg
wqBjeDxicj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKgIGxvYWRfZHBtaTxicj4NCiZndDsgLcKg
IMKgIMKgamPCoCDCoCDCoCBAYjE8YnI+DQomZ3Q7ICtAZjE6PGJyPg0KJmd0OyArwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IFNldCB1cCBs
b2FkbmFtZSBmb3IgbmV4dCBhdHRlbXB0Ljxicj4NCiZndDsgK8KgIMKgIMKgbW92wqAgwqAgwqBh
aCwgJiMzOTs7JiMzOTvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgQ29weSB1bnRpbCB0aGlz
IGNoYXJhY3Rlcjxicj4NCiZndDsgK8KgIMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfC
oCDCoCDCoCDCoCA7IHRvICZxdW90O2xvYWRuYW1lJnF1b3Q7PGJyPg0KJmd0OyArwqAgwqAgwqBv
csKgIMKgIMKgIGFsLCBhbMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgQ2hlY2sgdGVybWlu
YXRpbmcgY2hhcmFjdGVyPGJyPg0KJmd0OyArwqAgwqAgwqBqbmXCoCDCoCDCoEBmMsKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBJZiAmIzM5OzsmIzM5OywgY29udGludWU8YnI+DQom
Z3Q7ICvCoCDCoCDCoGRlY8KgIMKgIMKgZGnCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCA7IGVsc2UgcG9pbnQgYXQgbnVsbCBmb3IgbmV4dCBwYXNzLjxicj4NCiZndDvCoCBAZjI6PGJy
Pg0KJmd0OyAtwqAgwqAgwqBtb3bCoCDCoCDCoGF4LCAweDE2ODfCoCDCoCDCoCDCoCDCoCDCoCDC
oCA7IGdldCBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0OyAtwqAgwqAgwqBpbnTCoCDCoCDCoDB4
MmY8YnI+DQomZ3Q7IC3CoCDCoCDCoG9ywqAgwqAgwqAgYXgsIGF4PGJyPg0KJmd0OyAtwqAgwqAg
wqBqbnrCoCDCoCDCoEBiMsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBpZiAwIHRo
ZW4gaXQmIzM5O3MgdGhlcmU8YnI+DQomZ3Q7IC3CoCDCoCDCoGFuZMKgIMKgIMKgYmwsIDHCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgMzIgYml0IGNhcGFibGU/PGJyPg0KJmd0OyAtwqAg
wqAgwqBqesKgIMKgIMKgIEBiMjxicj4NCiZndDsgK8KgIMKgIMKgaW5jwqAgwqAgwqBjeDxicj4N
CiZndDsgK8KgIMKgIMKgY21wwqAgwqAgwqBzaSwgbG9hZG5hbWXCoCDCoCDCoCDCoCDCoCDCoCA7
IGFueXRoaW5nIHRoZXJlPzxicj4NCiZndDsgK8KgIMKgIMKgamXCoCDCoCDCoCBAYjLCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDsgZmluYWwgdHJ5IChubyBwYXRoKTxicj4NCiZndDsg
K8KgIMKgIMKgbW92wqAgwqAgwqBhbCwgW3NpLTFdPGJyPg0KJmd0OyArwqAgwqAgwqBjYWxswqAg
wqAgdGVzdF9kZWxpbcKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgaXMgZmluYWwgY2hhcmFjdGVyIGEg
cGF0aCBkZWxpbWl0ZXI8YnI+DQomZ3Q7ICvCoCDCoCDCoGplwqAgwqAgwqAgQGIxPGJyPg0KJmd0
OyArwqAgwqAgwqBtb3ZiwqAgwqAgW3NpXSwgJiMzOTtcXCYjMzk7wqAgwqAgwqAgwqAgwqAgwqAg
wqAgOyBubywgYWRkIHNlcGFyYXRvciBiZXR3ZWVuIHBhdGggJmFtcDsgbmFtZTxicj4NCiZndDsg
K8KgIMKgIMKgaW5jwqAgwqAgwqBzaTxicj4NCiZndDsgK8KgIMKgIMKgam1wwqAgwqAgwqBAYjE8
YnI+DQomZ3Q7wqAgQGYzOjxicj4NCiZndDsgLcKgIMKgIMKgbW92wqAgwqAgwqBbbW9kZXN3XSwg
ZGnCoCDCoCDCoCDCoCDCoCDCoCA7IHN0b3JlIHRoZSBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0
OyAtwqAgwqAgwqBtb3bCoCDCoCDCoFttb2Rlc3crMl0sIGVzPGJyPg0KJmd0OyAtwqAgwqAgwqBt
b3bCoCDCoCDCoFttb2Rlc3dfbWVtXSwgc2k8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDC
oGRpPGJyPg0KJmd0OyAtwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0O8KgIDxicj4NCiZn
dDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJmd0O8KgIDvCoCBOb3cs
IGZpbmQgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gZmlsZSB3ZSBhcmUgc3VwcG9zZWQgdG8gbG9h
ZC48YnI+DQomZ3Q7wqAgPGJyPg0KJmd0OyAtO8KgIMKgIHhvcsKgIMKgIMKgYWgsIGFowqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgOyB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgKHNldCBhYm92ZSEp
PGJyPg0KJmd0OyArO8KgIMKgIHhvcsKgIMKgIMKgYWgsIGFowqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgOyB0ZXJtaW5hdGlvbiBjaGFyIChzZXQgYnkgY2hlY2tfZHBtaSk8YnI+DQomZ3Q7wqAg
wqAgwqAgwqBjYWxswqAgwqAgc3RvcmVfZW52X3N0cmluZ8KgIMKgIMKgIMKgIDsgY29weSBpdCB0
byBsb2FkbmFtZSwgc2V0IGJ4PGJyPg0KJmd0O8KgIDxicj4NCiZndDvCoCDCoCDCoCDCoG1vdsKg
IMKgIMKgW3N0dWJpbmZvX2Vudl9zaXplXSwgZGk8YnI+DQomZ3Q7IEBAIC03MDAsMzYgKzcxMSwy
OSBAQCBwbV9kb3M6PGJyPg0KJmd0O8KgIMKgIMKgIMKgcmV0PGJyPg0KJmd0O8KgIDxicj4NCiZn
dDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KJmd0OyAtO8KgIGxvYWQg
RFBNSSBzZXJ2ZXIgaWYgbm90IHByZXNlbnQ8YnI+DQomZ3Q7IC07wqAgwqBGaXJzdCBjaGVjayBk
aXJlY3RvcnkgZnJvbSB3aGljaCBzdHViIGlzIGxvYWRlZCwgdGhlbiBwYXRoLCB0aGVuIGRlZmF1
bHQ8YnI+DQomZ3Q7IC07wqAgwqBPbiBlbnRyeSBkaSBwb2ludHMgdG8gaW1hZ2UgbmFtZTxicj4N
CiZndDsgKzsgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIGEgRFBNSSBob3N0LCBhbmQgc2F2ZSB0aGUg
bW9kZSBzd2l0Y2ggYWRkcmVzcy48YnI+DQomZ3Q7ICs7IFplcm8gZmxhZyBpcyBjbGVhciBvbiBz
dWNjZXNzLsKgIENsb2JiZXJzIGF4L2J4L2R4Ljxicj4NCiZndDvCoCA8YnI+DQomZ3Q7IC1wYXRo
X29mZjo8YnI+DQomZ3Q7IC3CoCDCoCDCoC5kd8KgIMKgIMKgMMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgOyBJZiBzdGF5cyB6ZXJvLCBubyBwYXRoPGJyPg0KJmd0OyAtPGJyPg0K
Jmd0OyAtbG9hZF9kcG1pOjxicj4NCiZndDsgLcKgIMKgIMKgeG9ywqAgwqAgwqBhaCwgYWjCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXIgKD0wKTxi
cj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKgIHN0b3JlX2Vudl9zdHJpbmfCoCDCoCDCoCDCoCA7
IGNvcHkgc3R1YiBpbWFnZSB0byAmcXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgLcKgIMKg
IMKgbW92wqAgwqAgwqBzaSwgYnjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IHJlbW92ZSBu
YW1lIHNvIHdlIGNhbiBhZGQgRFBNSSBuYW1lPGJyPg0KJmd0OyAtwqAgwqAgwqBtb3bCoCDCoCDC
oGRpLCBbcGF0aF9vZmZdwqAgwqAgwqAgwqAgwqAgOyBQb2ludGVyIHRvIHBhdGggY29udGVudHMg
KG5leHQgdHJ5KTxicj4NCiZndDsgLcKgIMKgIMKgam1wwqAgwqAgwqBAZjI8YnI+DQomZ3Q7IC1s
b2FkbG9vcDo8YnI+DQomZ3Q7IC3CoCDCoCDCoG1vdsKgIMKgIMKgYWgsICYjMzk7OyYjMzk7wqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IENvcHkgdW50aWwgdGhpcyBjaGFyYWN0ZXI8YnI+DQom
Z3Q7IC3CoCDCoCDCoGNhbGzCoCDCoCBzdG9yZV9lbnZfc3RyaW5nwqAgwqAgwqAgwqAgOyB0byAm
cXVvdDtsb2FkbmFtZSZxdW90Ozxicj4NCiZndDsgLcKgIMKgIMKgb3LCoCDCoCDCoCBhbCxhbMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBDaGVjayB0ZXJtaW5hdGluZyBjaGFyYWN0ZXI8
YnI+DQomZ3Q7IC3CoCDCoCDCoGpuZcKgIMKgIMKgQGYxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqA7IElmICYjMzk7OyYjMzk7LCBjb250aW51ZTxicj4NCiZndDsgLcKgIMKgIMKgZGVj
wqAgwqAgwqBkacKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDsgZWxzZSBwb2ludCBh
dCBudWxsIGZvciBuZXh0IHBhc3MuPGJyPg0KJmd0OyAtQGYxOiA8YnI+DQomZ3Q7IC3CoCDCoCDC
oGNtcMKgIMKgIMKgc2ksIGxvYWRuYW1lwqAgwqAgwqAgwqAgwqAgwqAgOyBhbnl0aGluZyB0aGVy
ZT88YnI+DQomZ3Q7IC3CoCDCoCDCoGplwqAgwqAgwqAgZG9fZXhlY8KgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgOyBmaW5hbCB0cnkgKG5vIHBhdGgpIGxldCBpdCByZXR1cm48YnI+DQomZ3Q7IC3C
oCDCoCDCoG1vdsKgIMKgIMKgYWwsIFtzaS0xXTxicj4NCiZndDsgLcKgIMKgIMKgY2FsbMKgIMKg
IHRlc3RfZGVsaW3CoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGlzIGZpbmFsIGNoYXJhY3RlciBhIHBh
dGggZGVsaW1pdGVyPGJyPg0KJmd0OyAtwqAgwqAgwqBqZcKgIMKgIMKgIEBmMjxicj4NCiZndDsg
LcKgIMKgIMKgbW92YsKgIMKgIFtzaV0sICYjMzk7XFwmIzM5O8KgIMKgIMKgIMKgIMKgIMKgIMKg
IDsgbm8sIGFkZCBzZXBhcmF0b3IgYmV0d2VlbiBwYXRoICZhbXA7IG5hbWU8YnI+DQomZ3Q7IC3C
oCDCoCDCoGluY8KgIMKgIMKgc2k8YnI+DQomZ3Q7IC1AZjI6PGJyPg0KJmd0OyAtwqAgwqAgwqBj
YWxswqAgwqAgZG9fZXhlY8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBjb3B5IG91ciBuYW1l
IHRvIHN0cmluZyBhbmQgdHJ5IGxvYWQ8YnI+DQomZ3Q7IC3CoCDCoCDCoGpjwqAgwqAgwqAgbG9h
ZGxvb3A8YnI+DQomZ3Q7ICtjaGVja19kcG1pOjxicj4NCiZndDsgK8KgIMKgIMKgcHVzaMKgIMKg
IGVzPGJyPg0KJmd0OyArwqAgwqAgwqBwdXNowqAgwqAgY3g8YnI+DQomZ3Q7ICvCoCDCoCDCoHB1
c2jCoCDCoCBkaTxicj4NCiZndDsgK8KgIMKgIMKgcHVzaMKgIMKgIHNpPGJyPg0KJmd0OyArwqAg
wqAgwqBtb3bCoCDCoCDCoGF4LCAweDE2ODfCoCDCoCDCoCDCoCDCoCDCoCDCoCA7IGdldCBEUE1J
IGVudHJ5IHBvaW50PGJyPg0KJmd0OyArwqAgwqAgwqBpbnTCoCDCoCDCoDB4MmY8YnI+DQomZ3Q7
ICvCoCDCoCDCoG1vdsKgIMKgIMKgZHgsIGJ4PGJyPg0KJmd0OyArwqAgwqAgwqBvcsKgIMKgIMKg
IGRsLCAxwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA7IGJ4IGJpdCAwOiAzMi1iaXQgY2Fw
YWJsZTxicj4NCiZndDsgK8KgIMKgIMKgeG9ywqAgwqAgwqBieCwgZHg8YnI+DQomZ3Q7ICvCoCDC
oCDCoG9ywqAgwqAgwqAgYXgsIGJ4wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgOyBEUE1JIHBy
ZXNlbnQgaWYgYXggPSAwPGJyPg0KJmd0OyArwqAgwqAgwqBqbnrCoCDCoCDCoEBmMTxicj4NCiZn
dDsgK8KgIMKgIMKgbW92wqAgwqAgwqBbbW9kZXN3XSwgZGnCoCDCoCDCoCDCoCDCoCDCoCA7IHN0
b3JlIHRoZSBEUE1JIGVudHJ5IHBvaW50PGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoFtt
b2Rlc3crMl0sIGVzPGJyPg0KJmd0OyArwqAgwqAgwqBtb3bCoCDCoCDCoFttb2Rlc3dfbWVtXSwg
c2k8YnI+DQomZ3Q7ICtAZjE6PGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoHNpPGJyPg0K
Jmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoGRpPGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDC
oGN4PGJyPg0KJmd0OyArwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0O8KgIMKgIMKgIMKg
cmV0PGJyPg0KJmd0O8KgIDxicj4NCiZndDvCoCA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS08d2JyPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0t
LS0tPGJyPg0KJmd0OyBAQCAtNzY2LDEzICs3NzAsNiBAQCBkb19leGVjOjxicj4NCiZndDvCoCDC
oCDCoCDCoGludMKgIMKgIMKgMHgyMTxicj4NCiZndDvCoCDCoCDCoCDCoHBvcMKgIMKgIMKgZGk8
YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDCoGVzPGJyPg0KJmd0OyAtwqAgwqAgwqBqY8Kg
IMKgIMKgIEBmMcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgO2NhcnJ5IHNldCBpZiBl
eGVjIGZhaWxlZDxicj4NCiZndDsgLTxicj4NCiZndDsgLcKgIMKgIMKgbW92wqAgwqAgwqBhaCwg
MHg0ZMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIDtnZXQgcmV0dXJuIGNvZGU8YnI+DQomZ3Q7IC3C
oCDCoCDCoGludMKgIMKgIMKgMHgyMTxicj4NCiZndDsgLcKgIMKgIMKgc3ViwqAgwqAgwqBheCwg
MHgzMDDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDthaD0zIFRTUiwgYWw9Y29kZSAoc3VjY2Vzcyk8
YnI+DQomZ3Q7IC3CoCDCoCDCoG5lZ8KgIMKgIMKgYXjCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCA7Q1ksIGlmIG5vdCBvcmlnaW5hbGx5IDB4MzAwPGJyPg0KJmd0OyAtQGYxOjxicj4N
CiZndDvCoCDCoCDCoCDCoGptcMKgIMKgIMKgcmVzdG9yZV91bWLCoCDCoCDCoCDCoCDCoCDCoCDC
oDtjYWxsZWQgZnVuYy4gcmV0dXJuIGZvciB1cy48YnI+DQomZ3Q7wqAgPGJyPg0KJmd0O8KgIDst
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7IEBAIC03OTYsMTAgKzc5Myw5
IEBAIGluY2x1ZGVfdW1iOjxicj4NCiZndDvCoCBAZjE6PGJyPg0KJmd0O8KgIMKgIMKgIMKgcmV0
PGJyPg0KJmd0O8KgIDxicj4NCiZndDsgLTsgUmVzdG9yZSB1cHBlciBtZW1vcnkgc3RhdHVzLsKg
IEFsbCByZWdpc3RlcnMgYW5kIGZsYWdzIHByZXNlcnZlZC48YnI+DQomZ3Q7ICs7IFJlc3RvcmUg
dXBwZXIgbWVtb3J5IHN0YXR1cy7CoCBBbGwgcmVnaXN0ZXJzIHByZXNlcnZlZC48YnI+DQomZ3Q7
wqAgPGJyPg0KJmd0O8KgIHJlc3RvcmVfdW1iOjxicj4NCiZndDsgLcKgIMKgIMKgcHVzaGY8YnI+
DQomZ3Q7wqAgwqAgwqAgwqBjbXBiwqAgwqAgW2Rvc19tYWpvcl0sIDXCoCDCoCDCoCDCoCDCoCA7
IFdvbiYjMzk7dCB3b3JrIGJlZm9yZSBkb3MgNTxicj4NCiZndDvCoCDCoCDCoCDCoGpiwqAgwqAg
wqAgQGYxPGJyPg0KJmd0O8KgIMKgIMKgIMKgcHVzaMKgIMKgIGF4PGJyPg0KJmd0OyBAQCAtODE1
LDcgKzgxMSw2IEBAIHJlc3RvcmVfdW1iOjxicj4NCiZndDvCoCDCoCDCoCDCoHBvcMKgIMKgIMKg
Yng8YnI+DQomZ3Q7wqAgwqAgwqAgwqBwb3DCoCDCoCDCoGF4PGJyPg0KJmd0O8KgIEBmMTo8YnI+
DQomZ3Q7IC3CoCDCoCDCoHBvcGY8YnI+DQomZ3Q7wqAgwqAgwqAgwqByZXQ8YnI+DQomZ3Q7wqAg
PGJyPg0KJmd0O8KgIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTx3YnI+LS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7IEBA
IC04NDAsNiArODM1LDggQEAgbXNnX25vX3NlbGVjdG9yczo8YnI+DQomZ3Q7wqAgwqAgwqAgwqAu
ZGLCoCDCoCDCoCZxdW90O25vIERQTUkgc2VsZWN0b3JzJCZxdW90Ozxicj4NCiZndDvCoCBtc2df
bm9fZHBtaV9tZW1vcnk6PGJyPg0KJmd0O8KgIMKgIMKgIMKgLmRiwqAgwqAgwqAmcXVvdDtubyBE
UE1JIG1lbW9yeSQmcXVvdDs8YnI+DQomZ3Q7ICtwYXRoX29mZjo8YnI+DQomZ3Q7ICvCoCDCoCDC
oC5kd8KgIMKgIMKgMMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOyBQb2ludHMg
dG8gUEFUSCwgc3RheXMgemVybyBpZiBub25lLjxicj4NCiZndDvCoCA8YnI+DQomZ3Q7wqAgOy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPHdicj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS08d2JyPi0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCiZndDvCoCA7wqAgVW5zdG9yZWQgRGF0
YSwgYXZhaWxhYmxlIGR1cmluZyBhbmQgYWZ0ZXIgbW9kZSBzd2l0Y2g8YnI+DQomZ3Q7IDxicj4N
Cjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj4NCg==
--0000000000009d663005f30afc82--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019