[reportlab-users] Re: Plotting with logarithmic axes

Berthold Höllmann reportlab-users@reportlab.com
Wed, 23 Jul 2003 16:47:04 +0200


--=-=-=
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit

"Andy Robinson" <andy@reportlab.com> writes:

>> Hello,
>> 
>> Is there any support for plotting Data with one or both axes divided
>> logarithmic in ReportLab graphics?
>> 
>> Thanks
>> Berthold
> Not yet, but it should be quite easy to subclass
> the ValueAxis class and add a new scaling function...
> Surprisingly we have never had to do a log plot yet.

OK, it involved a little more than just the scale function. I'll
attach my first version.

Regards
Berthold
-- 
Dipl.-Ing. Berthold Höllmann   __   Address:
hoel@GL-Group.com           G /  \ L Germanischer Lloyd
phone: +49-40-36149-7374    -+----+- Vorsetzen 32/35    P.O.Box 111606
fax  : +49-40-36149-7320      \__/   D-20459 Hamburg    D-20416 Hamburg

--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=logplot.py
Content-Transfer-Encoding: base64

IyEgL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogaXNvLWxhdGluLTEgLSotCgojIENvcHly
aWdodCAoQykgMjAwMyBieSBHZXJtYW5pc2NoZXIgTGxveWQKCiMgJEhlYWRlciQKIwojIFRpbWUt
c3RhbXA6IDwyMDAzLTA3LTIzIDE2OjQ2OjM2IGhvZWw+CiMKIyA9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTW9k
dWxlICAgIGxvZ3Bsb3QKIyBUYXNrICAgICAgcGxvdHMgd2l0aCBsb2dhcml0aG1pYyBheGVzIGZv
ciBSZXBvcnRsYWIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQXV0aG9yICAgIEJlcnRob2xkIEj2bGxtYW5u
CiMgUHJvamVjdAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTdGF0dXMgICAgJFN0YXRlJAojIERhdGUgICAg
ICAkRGF0ZSQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09CiMKCiIiIgpwbG90cyB3aXRoIGxvZ2FyaXRobWljIGF4
ZXMgZm9yIFJlcG9ydGxhYgoiIiIKCiMgQ1ZTSUQ6ICRJZCQKX19hdXRob3JfXyAgICAgICA9ICgi
MjAwMyBHZXJtYW5pc2NoZXIgTGxveWQgKGF1dGhvcjogJEF1dGhvciQpICIgKwogICAgICAgICAg
ICAgICAgICAgICJob2VsQGdlcm1hbmxsb3lkLm9yZyIpCl9fZGF0ZV9fICAgICAgICAgPSAiJERh
dGUkIgpfX3ZlcnNpb25fXyAgICAgID0gIiRSZXZpc2lvbiQiWzEwOi0xXQpfX3BhY2thZ2VfaW5m
b19fID0gIiIiICIiIgoKaW1wb3J0IG1hdGgKCmZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUK
ZnJvbSByZXBvcnRsYWIubGliLnZhbGlkYXRvcnMgaW1wb3J0ICAgIGlzTnVtYmVyLCBPbmVPZiwg
aXNOdW1iZXJPck5vbmUKZnJvbSByZXBvcnRsYWIuZ3JhcGhpY3Muc2hhcGVzIGltcG9ydCBEcmF3
aW5nLCBHcm91cApmcm9tIHJlcG9ydGxhYi5ncmFwaGljcy5jaGFydHMubGluZXBsb3RzIGltcG9y
dCBMaW5lUGxvdApmcm9tIHJlcG9ydGxhYi5ncmFwaGljcy5jaGFydHMuYXhlcyBpbXBvcnQgVmFs
dWVBeGlzLCBYVmFsdWVBeGlzLCBZVmFsdWVBeGlzCmZyb20gcmVwb3J0bGFiLmdyYXBoaWNzIGlt
cG9ydCByZW5kZXJQREYKZnJvbSByZXBvcnRsYWIubGliLmF0dHJtYXAgaW1wb3J0ICoKZnJvbSBy
ZXBvcnRsYWIuZ3JhcGhpY3MuY2hhcnRzLnV0aWxzIGltcG9ydCBuZXh0Um91bmROdW1iZXIKCmNs
YXNzIExvZ1ZhbHVlQXhpcyhWYWx1ZUF4aXMpOgogICAgX2F0dHJNYXAgPSBBdHRyTWFwKEJBU0U9
VmFsdWVBeGlzKQogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIFZhbHVlQXhpcy5fX2lu
aXRfXyhzZWxmKQogICAgICAgIHNlbGYubGFiZWxUZXh0Rm9ybWF0ID0gIiUuMGUiCgogICAgZGVm
IF9jYWxjU2NhbGVGYWN0b3Ioc2VsZik6CiAgICAgICAgIiIiQ2FsY3VsYXRlIHRoZSBheGlzJyBz
Y2FsZSBmYWN0b3IuCiAgICAgICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgKmFmdGVyKiB0
aGUgYXhpcycgcmFuZ2UgaXMgc2V0LgogICAgICAgIFJldHVybnMgYSBudW1iZXIuCiAgICAgICAg
IiIiCiAgICAgICAgc2VsZi5fc2NhbGVGYWN0b3IgPSBzZWxmLl9sZW5ndGggLyBmbG9hdCgKICAg
ICAgICAgICAgbWF0aC5sb2cxMChzZWxmLl92YWx1ZU1heCkgLSBtYXRoLmxvZzEwKHNlbGYuX3Zh
bHVlTWluKSkKICAgICAgICByZXR1cm4gc2VsZi5fc2NhbGVGYWN0b3IKCiAgICBkZWYgX2NhbGNU
aWNrUG9zaXRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuX2NhbGNWYWx1ZVN0ZXAoKQogICAgICAg
IFAgPSBbXQogICAgICAgIHZhbHVlTWluLCB2YWx1ZU1heCA9IG1hdGgubG9nMTAoc2VsZi5fdmFs
dWVNaW4pLCBtYXRoLmxvZzEwKHNlbGYuX3ZhbHVlTWF4KQogICAgICAgIHZhbHVlU3RlcCA9IHJv
dW5kKHZhbHVlTWluKQogICAgICAgIFAuYXBwZW5kKDEwKip2YWx1ZVN0ZXApCiAgICAgICAgdmFs
dWVTdGVwICs9IDEKICAgICAgICB3aGlsZSB2YWx1ZVN0ZXAgPD0gdmFsdWVNYXg6CiAgICAgICAg
ICAgIFAuYXBwZW5kKDEwKip2YWx1ZVN0ZXApCiAgICAgICAgICAgIHZhbHVlU3RlcCArPSAxCiAg
ICAgICAgcmV0dXJuIFAKCiAgICBkZWYgX2NhbGNWYWx1ZVN0ZXAoc2VsZik6CiAgICAgICAgJycn
Q2FsY3VsYXRlIF92YWx1ZVN0ZXAgZm9yIHRoZSBheGlzIG9yIGdldCBmcm9tIHZhbHVlU3RlcC4n
JycKICAgICAgICBpZiBzZWxmLnZhbHVlU3RlcCBpcyBOb25lOgogICAgICAgICAgICByYXdSYW5n
ZSA9IHNlbGYuX3ZhbHVlTWF4IC0gc2VsZi5fdmFsdWVNaW4KICAgICAgICAgICAgcmF3SW50ZXJ2
YWwgPSByYXdSYW5nZSAvIG1pbihmbG9hdChzZWxmLm1heGltdW1UaWNrcy0xKSwoZmxvYXQoc2Vs
Zi5fbGVuZ3RoKS9zZWxmLm1pbmltdW1UaWNrU3BhY2luZykpCiAgICAgICAgICAgIHNlbGYuX3Zh
bHVlU3RlcCA9IG5leHRSb3VuZE51bWJlcihyYXdJbnRlcnZhbCkKICAgICAgICBlbHNlOgogICAg
ICAgICAgICBzZWxmLl92YWx1ZVN0ZXAgPSBzZWxmLnZhbHVlU3RlcAoKICAgIGRlZiBtYWtlVGlj
a0xhYmVscyhzZWxmKToKICAgICAgICBnID0gR3JvdXAoKQoKICAgICAgICBmID0gc2VsZi5fbGFi
ZWxUZXh0Rm9ybWF0ICAgICAgICMgcGVyaGFwcyBzb21lb25lIGFscmVhZHkgc2V0IGl0CiAgICAg
ICAgaWYgZiBpcyBOb25lOgogICAgICAgICAgICBmID0gc2VsZi5sYWJlbFRleHRGb3JtYXQgb3Ig
KHNlbGYuX2FsbEludFRpY2tzKCkgYW5kICclLjBlJyBvciBzdHIpCiAgICAgICAgZWxpZiBmIGlz
IHN0ciBhbmQgc2VsZi5fYWxsSW50VGlja3MoKTogZiA9ICclLjBlJwogICAgICAgIHBvcyA9IFtz
ZWxmLl94LCBzZWxmLl95XQogICAgICAgIGQgPSBzZWxmLl9kYXRhSW5kZXgKICAgICAgICBsYWJl
bHMgPSBzZWxmLmxhYmVscwoKICAgICAgICBpID0gMAogICAgICAgIGZvciB0aWNrIGluIHNlbGYu
X3RpY2tWYWx1ZXM6CiAgICAgICAgICAgIGlmIGYgYW5kIGxhYmVsc1tpXS52aXNpYmxlOgogICAg
ICAgICAgICAgICAgdiA9IHNlbGYuc2NhbGUodGljaykKICAgICAgICAgICAgICAgIGlmIHR5cGUo
ZikgaXMgU3RyaW5nVHlwZTogdHh0ID0gZiAlIHRpY2sKICAgICAgICAgICAgICAgIGVsaWYgdHlw
ZShmKSBpbiAoVHVwbGVUeXBlLExpc3RUeXBlKToKICAgICAgICAgICAgICAgICAgICAjaXQncyBh
IGxpc3QsIHVzZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGdldAogICAgICAgICAgICAgICAgICAgIGlm
IGkgPCBsZW4oZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHR4dCA9IGZbaV0KICAgICAgICAg
ICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB0eHQgPSAnJwogICAgICAg
ICAgICAgICAgZWxpZiBjYWxsYWJsZShmKToKICAgICAgICAgICAgICAgICAgICB0eHQgPSBmKHRp
Y2sqKjEwLikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2Ug
VmFsdWVFcnJvciwgJ0ludmFsaWQgbGFiZWxUZXh0Rm9ybWF0ICVzJyAlIGYKICAgICAgICAgICAg
ICAgIGxhYmVsID0gbGFiZWxzW2ldCiAgICAgICAgICAgICAgICBwb3NbZF0gPSB2CiAgICAgICAg
ICAgICAgICBhcHBseShsYWJlbC5zZXRPcmlnaW4scG9zKQogICAgICAgICAgICAgICAgbGFiZWwu
c2V0VGV4dCh0eHQpCiAgICAgICAgICAgICAgICBnLmFkZChsYWJlbCkKICAgICAgICAgICAgaSA9
IGkgKyAxCgogICAgICAgIHJldHVybiBnCgoKY2xhc3MgTG9nWFZhbHVlQXhpcyhMb2dWYWx1ZUF4
aXMsWFZhbHVlQXhpcyk6CiAgICBfYXR0ck1hcCA9IEF0dHJNYXAoCiAgICAgICAgQkFTRT1Mb2dW
YWx1ZUF4aXMsCiAgICAgICAgdGlja1VwID0gQXR0ck1hcFZhbHVlKGlzTnVtYmVyLAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkZXNjPSdUaWNrIGxlbmd0aCB1cCB0aGUgYXhpcy4nKSwK
ICAgICAgICB0aWNrRG93biA9IEF0dHJNYXBWYWx1ZShpc051bWJlciwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkZXNjPSdUaWNrIGxlbmd0aCBkb3duIHRoZSBheGlzLicpLAogICAg
ICAgIGpvaW5BeGlzID0gQXR0ck1hcFZhbHVlKE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGVzYz0nSm9pbiBib3RoIGF4ZXMgaWYgdHJ1ZS4nKSwKICAgICAgICBqb2luQXhp
c01vZGUgPSBBdHRyTWFwVmFsdWUoT25lT2YoJ2JvdHRvbScsICd0b3AnLCAndmFsdWUnLCAncG9p
bnRzJywgTm9uZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M9Ik1v
ZGUgdXNlZCBmb3IgY29ubmVjdGluZyBheGlzICgnYm90dG9tJywgJ3RvcCcsICd2YWx1ZScsICdw
b2ludHMnLCBOb25lKS4iKSwKICAgICAgICBqb2luQXhpc1BvcyA9IEF0dHJNYXBWYWx1ZShpc051
bWJlck9yTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjPSdQb3Np
dGlvbiBhdCB3aGljaCB0byBqb2luIHdpdGggb3RoZXIgYXhpcy4nKSwKICAgICAgICApCiAgICBk
ZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgTG9nVmFsdWVBeGlzLl9faW5pdF9fKHNlbGYpCiAg
ICAgICAgc2VsZi5sYWJlbHMuYm94QW5jaG9yID0gJ24nCiAgICAgICAgc2VsZi5sYWJlbHMuZHgg
PSAwCiAgICAgICAgc2VsZi5sYWJlbHMuZHkgPSAtNQoKICAgICAgICBzZWxmLnRpY2tVcCA9IDAK
ICAgICAgICBzZWxmLnRpY2tEb3duID0gNQoKICAgICAgICBzZWxmLmpvaW5BeGlzID0gTm9uZQog
ICAgICAgIHNlbGYuam9pbkF4aXNNb2RlID0gTm9uZQogICAgICAgIHNlbGYuam9pbkF4aXNQb3Mg
PSBOb25lCgogICAgZGVmIHNjYWxlKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJDb252ZXJ0cyBh
IG51bWVyaWMgdmFsdWUgdG8gYSBZIHBvc2l0aW9uLgoKICAgICAgICBUaGUgY2hhcnQgZmlyc3Qg
Y29uZmlndXJlcyB0aGUgYXhpcywgdGhlbiBhc2tzIGl0IHRvCiAgICAgICAgd29yayBvdXQgdGhl
IHggdmFsdWUgZm9yIGVhY2ggcG9pbnQgd2hlbiBwbG90dGluZwogICAgICAgIGxpbmVzIG9yIGJh
cnMuICBZb3UgY291bGQgb3ZlcnJpZGUgdGhpcyB0byBkbwogICAgICAgIGxvZ2FyaXRobWljIGF4
ZXMuCiAgICAgICAgIiIiCgogICAgICAgIG1zZyA9ICJBeGlzIGNhbm5vdCBzY2FsZSBudW1iZXJz
IGJlZm9yZSBpdCBpcyBjb25maWd1cmVkIgogICAgICAgIGFzc2VydCBzZWxmLl9jb25maWd1cmVk
LCBtc2cKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICB2YWx1ZSA9IDAKICAg
ICAgICBpZiB2YWx1ZSA9PSAwLjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ggLSBzZWxmLl9z
Y2FsZUZhY3RvciAqIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pCiAgICAgICAgcmV0dXJuIHNl
bGYuX3ggKyBzZWxmLl9zY2FsZUZhY3RvciAqIChtYXRoLmxvZzEwKHZhbHVlKSAtIG1hdGgubG9n
MTAoc2VsZi5fdmFsdWVNaW4pKQoKICAgIGRlZiBkZW1vKHNlbGYpOgogICAgICAgICJTYW1wbGUg
ZHJhd2luZyB3aXRoIG9uZSB4bG9nIGF4aXMiCiAgICAgICAgZGF0YSA9IFtOdW1lcmljLmFyYW5n
ZSgxMC4sMTAxLikqKjEwLl0KICAgICAgICB4QXhpcy5jb25maWd1cmUoZGF0YSkKCiAgICAgICAg
ZHJhd2luZyA9IERyYXdpbmcoNDAwLDIwMCkKICAgICAgICBkcmF3aW5nLmFkZCh4QXhpcykKCiAg
ICAgICAgcmV0dXJuIGRyYXdpbmcKCmNsYXNzIExvZ1lWYWx1ZUF4aXMoTG9nVmFsdWVBeGlzLFlW
YWx1ZUF4aXMpOgogICAgX2F0dHJNYXAgPSBBdHRyTWFwKAogICAgICAgIEJBU0U9TG9nVmFsdWVB
eGlzLAogICAgICAgIHRpY2tMZWZ0ID0gQXR0ck1hcFZhbHVlKGlzTnVtYmVyLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRlc2M9J1RpY2sgbGVuZ3RoIGxlZnQgb2YgdGhlIGF4aXMu
JyksCiAgICAgICAgdGlja1JpZ2h0ID0gQXR0ck1hcFZhbHVlKGlzTnVtYmVyLAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkZXNjPSdUaWNrIGxlbmd0aCByaWdodCBvZiB0aGUgYXhp
cy4nKSwKICAgICAgICBqb2luQXhpcyA9IEF0dHJNYXBWYWx1ZShOb25lLAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRlc2M9J0pvaW4gYm90aCBheGVzIGlmIHRydWUuJyksCiAgICAg
ICAgam9pbkF4aXNNb2RlID0gQXR0ck1hcFZhbHVlKE9uZU9mKCgnbGVmdCcsICdyaWdodCcsICd2
YWx1ZScsICdwb2ludHMnLCBOb25lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlc2M9Ik1vZGUgdXNlZCBmb3IgY29ubmVjdGluZyBheGlzICgnbGVmdCcsICdyaWdodCcs
ICd2YWx1ZScsICdwb2ludHMnLCBOb25lKS4iKSwKICAgICAgICBqb2luQXhpc1BvcyA9IEF0dHJN
YXBWYWx1ZShpc051bWJlck9yTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkZXNjPSdQb3NpdGlvbiBhdCB3aGljaCB0byBqb2luIHdpdGggb3RoZXIgYXhpcy4nKSwKICAg
ICAgICApCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgTG9nVmFsdWVBeGlzLl9faW5p
dF9fKHNlbGYpCiAgICAgICAgc2VsZi5sYWJlbHMuYm94QW5jaG9yID0gJ2UnCiAgICAgICAgc2Vs
Zi5sYWJlbHMuZHggPSAtNQogICAgICAgIHNlbGYubGFiZWxzLmR5ID0gMAoKICAgICAgICBzZWxm
LnRpY2tSaWdodCA9IDAKICAgICAgICBzZWxmLnRpY2tMZWZ0ID0gNQoKICAgICAgICBzZWxmLmpv
aW5BeGlzID0gTm9uZQogICAgICAgIHNlbGYuam9pbkF4aXNNb2RlID0gTm9uZQogICAgICAgIHNl
bGYuam9pbkF4aXNQb3MgPSBOb25lCgogICAgZGVmIHNjYWxlKHNlbGYsIHZhbHVlKToKICAgICAg
ICAiIiJDb252ZXJ0cyBhIG51bWVyaWMgdmFsdWUgdG8gYSBZIHBvc2l0aW9uLgoKICAgICAgICBU
aGUgY2hhcnQgZmlyc3QgY29uZmlndXJlcyB0aGUgYXhpcywgdGhlbiBhc2tzIGl0IHRvCiAgICAg
ICAgd29yayBvdXQgdGhlIHggdmFsdWUgZm9yIGVhY2ggcG9pbnQgd2hlbiBwbG90dGluZwogICAg
ICAgIGxpbmVzIG9yIGJhcnMuICBZb3UgY291bGQgb3ZlcnJpZGUgdGhpcyB0byBkbwogICAgICAg
IGxvZ2FyaXRobWljIGF4ZXMuCiAgICAgICAgIiIiCgogICAgICAgIG1zZyA9ICJBeGlzIGNhbm5v
dCBzY2FsZSBudW1iZXJzIGJlZm9yZSBpdCBpcyBjb25maWd1cmVkIgogICAgICAgIGFzc2VydCBz
ZWxmLl9jb25maWd1cmVkLCBtc2cKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAg
ICB2YWx1ZSA9IDAKICAgICAgICBpZiB2YWx1ZSA9PSAwLjoKICAgICAgICAgICAgcmV0dXJuIHNl
bGYuX3kgLSBzZWxmLl9zY2FsZUZhY3RvciAqIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pCiAg
ICAgICAgcmV0dXJuIHNlbGYuX3kgKyBzZWxmLl9zY2FsZUZhY3RvciAqIChtYXRoLmxvZzEwKHZh
bHVlKSAtIG1hdGgubG9nMTAoc2VsZi5fdmFsdWVNaW4pKQoKICAgIGRlZiBkZW1vKHNlbGYpOgog
ICAgICAgICJTYW1wbGUgZHJhd2luZyB3aXRoIG9uZSB4bG9nIGF4aXMiCiAgICAgICAgZGF0YSA9
IFtOdW1lcmljLmFyYW5nZSgxMC4sMTAxLikqKjEwLl0KICAgICAgICB5QXhpcy5jb25maWd1cmUo
ZGF0YSkKCiAgICAgICAgZHJhd2luZyA9IERyYXdpbmcoNDAwLDIwMCkKICAgICAgICBkcmF3aW5n
LmFkZCh5QXhpcykKCiAgICAgICAgcmV0dXJuIGRyYXdpbmcKCgpjbGFzcyBMb2dMaW5MaW5lUGxv
dChMaW5lUGxvdCk6CiAgICBwYXNzCgpkZWYgc2FtcGxlOGEoKToKICAgICJTYW1wbGUgZHJhd2lu
ZyB3aXRoIG9uZSB4bG9nIGF4aXMiCiAgICBkcmF3aW5nID0gRHJhd2luZyg0MDAsMjAwKQoKICAg
IGRhdGEgPSBbW2Zsb2F0KGkpKioyLiBmb3IgaSBpbiByYW5nZSgxMCwgMTAwMSwgMTApXSwgXQoK
ICAgIHhBeGlzID0gTG9nWFZhbHVlQXhpcygpCiAgICB4QXhpcy5jb25maWd1cmUoZGF0YSkKCiAg
ICBkcmF3aW5nLmFkZCh4QXhpcykKCiAgICByZXR1cm4gZHJhd2luZwoKZGVmIHNhbXBsZThiKCk6
CiAgICAiU2FtcGxlIGRyYXdpbmcgd2l0aCBvbmUgeGxvZyBheGlzIgogICAgZHJhd2luZyA9IERy
YXdpbmcoNDAwLDIwMCkKCiAgICBkYXRhID0gW1tmbG9hdChpKSoqMi4gZm9yIGkgaW4gcmFuZ2Uo
MTAsIDEwMDEsIDEwKV0sIF0KCiAgICB5QXhpcyA9IExvZ1lWYWx1ZUF4aXMoKQogICAgeUF4aXMu
Y29uZmlndXJlKGRhdGEpCgogICAgZHJhd2luZy5hZGQoeUF4aXMpCgogICAgcmV0dXJuIGRyYXdp
bmcKCmRlZiBzYW1wbGU5YSgpOgogICAgbHAgPSBMaW5lUGxvdCgpCiAgICBscC55VmFsdWVBeGlz
ID0gTG9nWVZhbHVlQXhpcygpCiAgICBscC54ICs9IDIwCiAgICBscC55ICs9IDIwCiAgICBkYXRh
ID0gW1soaSwgZmxvYXQoaSkqKjIuKSBmb3IgaSBpbiByYW5nZSgxMCwgMTAwMSwgMTApXSwgXQog
ICAgZGF0YS5hcHBlbmQoWyhpLCBmbG9hdChpKSoqMy4pIGZvciBpIGluIHJhbmdlKDEwLCAxMDAx
LCAxMCldKQogICAgZGF0YS5hcHBlbmQoWyhpLCBmbG9hdChpKSoqMS42KSBmb3IgaSBpbiByYW5n
ZSgxMCwgMTAwMSwgMTApXSkKICAgIGxwLmRhdGEgPSBkYXRhCgogICAgZHJhd2luZyA9IERyYXdp
bmcoNDAwLDIwMCkKICAgIGRyYXdpbmcuYWRkKGxwKQoKICAgIHJldHVybiBkcmF3aW5nCgppZiBf
X25hbWVfXyA9PSAiX19tYWluX18iOgogICAgczhhID0gc2FtcGxlOGEoKQogICAgcmVuZGVyUERG
LmRyYXdUb0ZpbGUoczhhLCAic2FtcGxlOGEucGRmIiwgIkxvZ1hWYWx1ZUF4aXMgc2FtcGxlIikK
ICAgIHM4YiA9IHNhbXBsZThiKCkKICAgIHJlbmRlclBERi5kcmF3VG9GaWxlKHM4YiwgInNhbXBs
ZThiLnBkZiIsICJMb2dYVmFsdWVBeGlzIHNhbXBsZSIpCiAgICBzOWEgPSBzYW1wbGU5YSgpCiAg
ICByZW5kZXJQREYuZHJhd1RvRmlsZShzOWEsICJsb2dzYW1wbGUucGRmIiwgIkxvZ1lWYWx1ZUF4
aXMgc2FtcGxlIikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBVcGRhdGUgSW5mb3JtYXRpb25zCiMgJExv
ZyQKCiMgTG9jYWwgVmFyaWFibGVzOjsKIyBjb21waWxlLWNvbW1hbmQ6InB5dGhvbiBzZXR1cC5w
eSBidWlsZCI7CiMgRW5kOjsK
--=-=-=--