[Edu-sig] graphics.py: simplified graphics for beginners

Daniel Yoo dyoo@hkn.eecs.berkeley.edu
Wed, 9 May 2001 17:55:09 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--545289610-2072271115-989456109=:29220
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hiya everyone,

Here's an updated copy of the small graphics module I cooked up, with a
small circle-drawing demonstration that uses it.  What do people think?  
Would this module make graphics programming more accessible to beginning
students?

--545289610-2072271115-989456109=:29220
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="circle.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0105091755090.29220@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="circle.py"

IyMgVGhpcyBwaWVjZSBvZiBjb2RlIGdpdmVzIHVzIG9uZSB3YXkgdG8gZHJh
dyBhIGNpcmNsZSBpbiBQeXRob24uDQojIyBJdCdzIG5vdCBwYXJ0aWN1bGFy
bHkgZWZmaWNpZW50LCBidXQgaXQncyBjdXRlLg0KIyMNCiMjIGR5b29AaGtu
LmVlY3MuYmVya2VsZXkuZWR1DQojIw0KIyMgTGV0J3Mgc2F5IHRoYXQgd2Ug
d3JpdGUgYSBwcm9ncmFtIHRvIGRyYXcgcmVndWxhciBwb2x5Z29ucyBvZiBu
DQojIyBwb2ludHMuICBGb3IgZXhhbXBsZSwgZm9yIG49Mywgd2UgZ2V0IGEg
dHJpYW5nbGUuICBGb3Igbj00LCB3ZSBoYXZlDQojIyBhIHNxdWFyZSwgYW5k
IHNvIG9uLiAgV2hhdCBoYXBwZW5zIHdoZW4gbiBnZXRzIGxhcmdlciBhbmQg
bGFyZ2VyPw0KIyMNCiMjIE9uZSBpZGVhIGZvciBkcmF3aW5nIGEgY2lyY2xl
IGlzIHRvIGRyYXcgb3VyIHBvbHlnb24gd2l0aCBsYXJnZXINCiMjIGFuZCBs
YXJnZXIgbiwgdW50aWwgd2UgZ2V0IHNvbWV0aGluZyBzYXRpc2ZhY3Rvcnku
ICBUaGlzIHByb2dyYW0NCiMjIHNob3dzIGEgdmlzdWFsIGRlc2NyaXB0aW9u
cyBvZiB0aGlzIHByb2Nlc3MuICBUaGUgbWFpbiBwcm9ncmFtIGlzDQojIyB0
ZXN0LWNpcmNsZXMsIHdoaWNoIGRlbW9uc3RyYXRlcyBob3cgYSBwb2x5Z29u
IG1hZGUgb2Ygc3RyYWlnaHQNCiMjIGxpbmVzIGNhbiBjb252ZXJnZSB0byBh
IGNpcmNsZS4NCg0KZnJvbSBncmFwaGljcyBpbXBvcnQgKg0KZnJvbSB0aW1l
IGltcG9ydCBzbGVlcA0KZnJvbSBtYXRoIGltcG9ydCBwaSwgY29zLCBzaW4N
Cg0KIyMgVHJ5IHJ1bm5pbmcgdGVzdENpcmNsZXMgd2l0aCBuPTQwIGFuZCBk
ZWxheT0uNSBmb3IgYSBuaWNlIGFuaW1hdGluZw0KIyMgZWZmZWN0Lg0KZGVm
IHRlc3RDaXJjbGVzKG4sIGRlbGF5KToNCiAgICBjaXJjbGVfcmFkaXVzID0g
MTcwDQogICAgZm9yIG4gaW4gcmFuZ2UoMywgbiszKToNCiAgICAgICAgY2xl
YXJHcmFwaGljcygpDQogICAgICAgIGRyYXdDbG9zZWRQb2x5Z29uKG1ha2VO
UG9seWdvbihjaXJjbGVfcmFkaXVzLCBuKSkNCiAgICAgICAgc2xlZXAoZGVs
YXkpDQoNCiMjIEhlcmUncyB0aGUgaGVhcnQgb2YgdGhlIHByb2dyYW06IGdp
dmVuIHJhZGl1cyBhbmQgbiwgcmV0dXJucyBiYWNrDQojIyB0byB1cyBhIGxp
c3Qgb2YgcG9pbnRzIHRoYXQgc2hvdWxkIGNvbnN0cnVjdCBhIHJlZ3VsYXIg
bi1wb2x5Z29uDQojIyB3aG9zZSBwb2ludHMgYXJlIGFsbCByZWxhdGl2ZSB0
byAoMCwgMCkuDQpkZWYgbWFrZU5Qb2x5Z29uKHJhZGl1cywgbik6DQogICBk
ZWdyZWVzID0gZGl2aWRlVXAzNjBJbnRvRGVncmVlcyhuKQ0KICAgdGhldGFz
ID0gbWFwKGRlZ1RvUmFkLCBkZWdyZWVzKQ0KICAgcmV0dXJuIFtwb2xhclRv
UmVjdChyYWRpdXMsIHQpIGZvciB0IGluIHRoZXRhc10NCg0KDQojIyBEcmF3
cyBhIGNsb3NlZCBwb2x5Z29uIG9mIHBvaW50cy4gIEZvciBleGFtcGxlOg0K
IyMgICAgZHJhd0Nsb3NlZFBvbHlnb24oWygxMDAgMCksICgxMDAgMTAwKSwg
KDAgMCldKQ0KIyMgc2hvdWxkIGRyYXcgYSBzbWFsbCB0cmlhbmdsZS4NCmRl
ZiBkcmF3Q2xvc2VkUG9seWdvbihwb2ludHMpOg0KICAgIHBvaW50cyA9IHBv
aW50cyArIFtwb2ludHNbMF1dDQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHBv
aW50cykgLSAxKToNCiAgICAgICAgKCh4MSwgeTEpLCAoeDIsIHkyKSkgPSAo
cG9pbnRzW2ldLCBwb2ludHNbaSsxXSkNCiAgICAgICAgZHJhd0xpbmUoeDEs
IHkxLCB4MiwgeTIpDQoNCg0KIyMgVGFrZXMgaW4gYSByYWRpdXMgYW5kIGFu
IHRoZXRhIGluIHJhZGlhbnMsIGdpdmVzIGJhY2sgdG8gdXMgdGhlDQojIyBw
YXJ0aWN1bGFyICh4LHkpIGNvb3JkaW5hdGUgdGhhdCBtYXRjaGVzIHRoaXMg
ZGVzY3JpcHRpb24uDQpkZWYgcG9sYXJUb1JlY3QocmFkaXVzLCB0aGV0YSk6
DQogICAgcmV0dXJuIChyYWRpdXMgKiBjb3ModGhldGEpLCByYWRpdXMgKiBz
aW4odGhldGEpKQ0KDQoNCiMjIGRlZ1RvUmFkIGFuZCByYWRUb0RlZyBjb252
ZXJ0IGJldHdlZW4gcmFkaWFucyBhbmQgZGVncmVlcyBhY2NvcmRpbmcNCiMj
IHRvIHRoZSBlcXVhbGl0eTogMSBkZWdyZWUgPSAocGkvMTgwKSByYWRpYW5z
LiAgV2UnbGwgbmVlZCB0aGlzDQojIyBiZWNhdXNlIFB5dGhvbidzIHRyaWdv
bm9tZXRyaWMgZnVuY3Rpb25zIGRlYWwgZW50aXJlbHkgd2l0aA0KIyMgcmFk
aWFucywgd2hpbGUgaHVtYW5zIHVzdWFsbHkgYXJlIG1vcmUgY29tZm9ydGFi
bGUgd2l0aCBkZWdyZWVzLg0KZGVmIGRlZ1RvUmFkKGRlZ3JlZXMpOiByZXR1
cm4gZGVncmVlcyAqIHBpIC8gMTgwDQpkZWYgcmFkVG9EZWcocmFkaWFucyk6
IHJldHVybiAoMTgwICogcmFkaWFucykgLyBwaQ0KDQoNCiMjIEdpdmVuIG4s
IHJldHVybnMgYSBsaXN0IG9mIGRlZ3JlZXMgdGhhdCBlcXVhbGx5IGRpdmlk
ZSAzNjAgZGVncmVlcy4NCiMjIEZvciBleGFtcGxlLCBhIHRyaWFuZ2xlIGNl
bnRlcmVkIGF0IHRoZSBvcmlnaW4gaGFzIHZlcnRpY2VzIG9yaWVudGVkDQoj
IyBhdCAwLCAxMjAsIGFuZCAyNDAgYW5nbGVzLg0KZGVmIGRpdmlkZVVwMzYw
SW50b0RlZ3JlZXMobik6DQogICAgYW5nbGUgPSAzNjAuMCAvIG4NCiAgICBy
ZXR1cm4gW2FuZ2xlICogeCBmb3IgeCBpbiByYW5nZShuKV0NCg0KDQo=
--545289610-2072271115-989456109=:29220
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="graphics.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0105091755091.29220@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="graphics.py"

IiIiVGhpcyBpcyBhIHNtYWxsIGdyYXBoaWNzIG1vZHVsZSB0aGF0IG1pbWlj
cyBzb21lIHRoZSBmdW5jdGlvbmFsaXR5DQpvZiB3aGF0IHRoZSBDUzMgc3R1
ZGVudHMgdXNlIHRvIGRvIGZyYWN0YWwgZ3JhcGhpY3MuICBJdCdzIHNpbXBs
aWZpZWQNCmJlY2F1c2UgdGhlIGNvb3JkaW5hdGVzIGFyZSBjZW50ZXJlZCBh
dCAoMCwgMCkgaW4gdGhlIG1pZGRsZSBvZiB0aGUNCnNjcmVlbiBhbmQgaXQg
dXNlcyBmYW1pbGlhciBjb29yZGluYXRlIG9yaWVudGF0aW9uLiIiIg0KDQoj
IEknbSB0cnlpbmcgdG8gbWFrZSB0aGlzIGltcG9ydCBzYWZlLg0KDQppbXBv
cnQgVGtpbnRlcg0KaW1wb3J0IHN0cmluZw0KDQpjbGFzcyBHcmFwaGljczoN
CiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6DQogICAgICAgIHNlbGYu
X3Jvb3QgPSByb290DQogICAgICAgIHNlbGYuX3hwb3MsIHNlbGYuX3lwb3Mg
PSAwLCAwDQogICAgICAgIHNlbGYuX3dpZHRoID0gNDAwDQogICAgICAgIHNl
bGYuX2hlaWdodCA9IDQwMA0KICAgICAgICBzZWxmLl9yZ2IgPSAnIzAwMDAw
MCcgICMgRGVmYXVsdCBzaG91bGQgYmUgYmxhY2sNCiAgICAgICAgc2VsZi5f
Y2FudmFzID0gVGtpbnRlci5DYW52YXMoc2VsZi5fcm9vdCwgd2lkdGg9c2Vs
Zi5fd2lkdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGhlaWdodD1zZWxmLl9oZWlnaHQsIGJnPSd3aGl0ZScpDQogICAgICAg
IHNlbGYuX2NhbnZhcy5wYWNrKCkNCiAgICAgICAgc2VsZi5jbGVhckdyYXBo
aWNzKCkNCg0KICAgIGRlZiBjbGVhckdyYXBoaWNzKHNlbGYpOg0KICAgICAg
ICAiIiJDbGVhciB0aGUgc2NyZWVuIG9mIGFsbCBkcmF3aW5ncy4iIiINCiAg
ICAgICAgZm9yIGlkIGluIHNlbGYuX2NhbnZhcy5maW5kX2FsbCgpOg0KICAg
ICAgICAgICAgc2VsZi5fY2FudmFzLmRlbGV0ZShpZCkNCg0KICAgIGRlZiBw
b3NpdGlvblBlbihzZWxmLCB4LCB5KToNCiAgICAgICAgIiIiTW92ZSB0aGUg
cGVuIHRvIHRoZSBzcGVjaWZpYyBwb3NpdGlvbi4iIiINCiAgICAgICAgc2Vs
Zi5feHBvcywgc2VsZi5feXBvcyA9IHgsIHkNCg0KICAgIGRlZiBkcmF3TGlu
ZVRvKHNlbGYsIHgsIHkpOg0KICAgICAgICAiIiJEcmF3IHRoZSBsaW5lIGZy
b20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gKHgsIHkpLg0KICAgICAgICBB
cyBhIHNpZGUgZWZmZWN0LCB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVz
ICh4LCB5KS4iIiINCiAgICAgICAgeDEsIHkxID0gc2VsZi5jb252ZXJ0Q29v
cmQoc2VsZi5feHBvcywgc2VsZi5feXBvcykNCiAgICAgICAgeDIsIHkyID0g
c2VsZi5jb252ZXJ0Q29vcmQoeCwgeSkNCiAgICAgICAgc2VsZi5fY2FudmFz
LmNyZWF0ZV9saW5lKHgxLCB5MSwgeDIsIHkyLCBmaWxsPXNlbGYuX3JnYikN
CiAgICAgICAgc2VsZi5fY2FudmFzLnVwZGF0ZSgpDQogICAgICAgIHNlbGYu
cG9zaXRpb25QZW4oeCwgeSkNCg0KICAgIGRlZiBkcmF3TGluZShzZWxmLCB4
MSwgeTEsIHgyLCB5Mik6DQogICAgICAgICIiIkRyYXcgYSBsaW5lIGZyb20g
KHgxLCB5MSkgdG8gKHgyLCB5MikuICBBcyBhIHNpZGUgZWZmZWN0LA0KICAg
ICAgICB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVzICh4MiwgeTIpLiIi
Ig0KICAgICAgICBzZWxmLnBvc2l0aW9uUGVuKHgxLCB5MSkNCiAgICAgICAg
c2VsZi5kcmF3TGluZVRvKHgyLCB5MikNCg0KICAgIGRlZiBkcmF3UG9pbnQo
c2VsZiwgeCwgeSk6DQogICAgICAgICIiIkRyYXcgYSBzaW5nbGUgcG9pbnQg
YXQgKHgsIHkpLiAgQXMgYSBzaWRlIGVmZmVjdCwNCiAgICAgICAgdGhlIGN1
cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQogICAgICAgIHNl
bGYucG9zaXRpb25QZW4oeDEsIHkxKQ0KICAgICAgICB4MSwgeTEgPSBzZWxm
LmNvbnZlcnRDb29yZCh4LCB5KQ0KICAgICAgICBzZWxmLl9jYW52YXMuY3Jl
YXRlX292YWwoeDEsIHkxLCB4MSwgeTEsIG91dGxpbmU9c2VsZi5fcmdiKQ0K
ICAgICAgICBzZWxmLl9jYW52YXMudXBkYXRlKCkNCg0KICAgIGRlZiBjbGVh
clBvaW50KHNlbGYsIHgsIHkpOg0KICAgICAgICAiIiJDbGVhcnMgYSBzaW5n
bGUgcG9pbnQgYXQgKHgsIHkpLiAgQXMgYSBzaWRlIGVmZmVjdCwNCiAgICAg
ICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQog
ICAgICAgIHNlbGYucG9zaXRpb25QZW4oeDEsIHkxKQ0KICAgICAgICBiZ2Nv
bG9yID0gc2VsZi5fY2FudmFzLmNnZXQoJ2JnJykNCiAgICAgICAgeDEsIHkx
ID0gc2VsZi5jb252ZXJ0Q29vcmQoeCwgeSkNCiAgICAgICAgc2VsZi5fY2Fu
dmFzLmNyZWF0ZV9vdmFsKHgxLCB5MSwgeDEsIHkxLCBvdXRsaW5lPWJnY29s
b3IpDQogICAgICAgIHNlbGYuX2NhbnZhcy51cGRhdGUoKQ0KICAgIA0KICAg
IGRlZiBncmFwaGljc1RleHQoc2VsZiwgbXNnLCB4LCB5KToNCiAgICAgICAg
IiIiV3JpdGVzIGEgbGluZSBvZiB0ZXh0LCBsZWZ0IGp1c3RpZmVkIGZyb20g
KHgsIHkpLiIiIg0KICAgICAgICB4MSwgeTEgPSBzZWxmLmNvbnZlcnRDb29y
ZCh4LCB5KQ0KICAgICAgICBzZWxmLl9jYW52YXMuY3JlYXRlX3RleHQoeDEs
IHkxLCB0ZXh0PW1zZywgZmlsbD1zZWxmLl9yZ2IpDQogICAgICAgIHNlbGYu
X2NhbnZhcy51cGRhdGUoKQ0KICAgIA0KICAgIGRlZiBzZXRSR0JDb2xvcihz
ZWxmLCByLCBnLCBiKToNCiAgICAgICAgIiIiQ2hhbmdlcyB0aGUgY3VycmVu
dCBjb2xvciB0byAociwgZywgYiksIHdoZXJlDQogICAgICAgIGVhY2ggY29t
cG9uZW50IGlzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuIiIiDQogICAg
ICAgIHNlbGYuX3JnYiA9ICcjJTAyWCUwMlglMDJYJyAlIChyLCBnLCBiKQ0K
DQogICAgZGVmIGNvbnZlcnRDb29yZChzZWxmLCB4LCB5KToNCiAgICAgICAg
bmV3eCA9IHNlbGYuX3dpZHRoLzIgKyB4DQogICAgICAgIG5ld3kgPSBzZWxm
Ll9oZWlnaHQvMiAtIHkNCiAgICAgICAgcmV0dXJuIG5ld3gsIG5ld3kNCg0K
DQoNCiIiIkhlcmUgYXJlIHNvbWUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdmFy
aWFibGVzIHRvIG1ha2UgdGhpbmdzIGVhc2llcg0KZm9yIGEgYmVnaW5uZXIg
dW5hY2N1c3RvbWVkIHRvIE9PUC4gIE5vdGU6IHRoaXMgaXMgdWdseSBiZWNh
dXNlIHdlDQpuZWVkIGFuIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uIGhl
cmU6IHdlIHdhbnQgdG8gbWFrZSAiZnJvbQ0KZ3JhcGhpY3MgaW1wb3J0ICoi
IHdvcmssIGJ1dCB0aGlzIHRha2VzIHNvbWUgc2lsbGluZXNzIHRvIGdldCBp
dA0Kd29ya2luZyB3ZWxsLiAgTWlzZXJ5IG9mIHRoZSBmZXcgZm9yIHRoZSBq
b3kgb2YgdGhlIG1hbnkuICAqZ3JpbioiIiINCg0KDQoiIiJPdXIgZ2xvYmFs
IGdyYXBoaWNzIG9iamVjdC4iIiINCl9fZ3JhcGhpY3MgPSBOb25lDQoNCg0K
IiIiRm9yIGVhY2ggb2YgdGhlIGludGVyZXN0aW5nIG1lbWJlciBmdW5jdGlv
bnMgd2l0aGluIGEgR3JhcGhpY3MNCm9iamVjdCwgd2UnbGwgbWFrZSBhIGNv
cnJlc3BvbmRpbmcgZ2xvYmFsIGZ1bmN0aW9uIHRoYXQgd29ya3Mgb24gYQ0K
ZGVmYXVsdCB0b3BsZXZlbCB3aW5kb3cuICBUaGUgdHJpY2t5IHBhcnQgaXMg
dG8gYWNjb3VudCBmb3Igd2hhdA0KaGFwcGVucyB3aGVuIHRoZSB1c2VyIGRl
c3Ryb3lzIHRoZSB3aW5kb3c6IHdlIG5lZWQgdG8gZHluYW1pY2FsbHkNCnJl
Y3JlYXRlIGFuZCBob29rIHRoZSBmdW5jdGlvbnMgYmFjayB1cCB0byBhIG5l
dyBpbnN0YW5jZSBvZg0KR3JhcGhpY3MuICBUaGlzIGNvZGUgaXMgc3VidGxl
IGFuZCBuZWVkcyBzb21lIGV4cGxhbmF0aW9uOg0KDQpXZSBleHBvc2UgdG8g
dGhlIHVzZXIgdGhlIGxpc3Qgb2YgX193cmFwcGVkRnVuY3Rpb25zLiAgVW5k
ZXJuZWF0aCwNCnRob3NlIGZ1bmN0aW9uIGFyZSBhY3R1YWxseSB3cmFwcGVy
cyBhcm91bmQgdGhlIGFjdHVhbA0KaW1wbGVtZW50YXRpb25zLiAgRm9yIGV4
YW1wbGUsIHBvc2l0aW9uUGVuKCkgaXMganVzdCBhIHdyYXBwZXIgYXJvdW5k
DQpfX3Bvc2l0aW9uUGVuKCkuDQoNCldoZW5ldmVyIG91ciBHcmFwaGljcyBv
YmplY3QgaXMgZGVzdHJveWVkLCB3ZSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0
aGUNCmltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucyBhdCB0aGUgbWVtYmVycyBv
ZiBfX2dyYXBoaWNzLiAgVGhpcyBpcyB3aGF0DQpfX3Jlc2V0R3JhcGhpY3Mo
KSBkb2VzLiIiIg0KDQoNCg0KX193cmFwcGVkRnVuY3Rpb25zID0gc3RyaW5n
LnNwbGl0KCIiInBvc2l0aW9uUGVuIGRyYXdMaW5lVG8gZHJhd0xpbmUNCmRy
YXdQb2ludCBjbGVhclBvaW50IGdyYXBoaWNzVGV4dCBzZXRSR0JDb2xvciIi
IikNCg0KDQoiIiJUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYWxsIHRoZSBuaWNl
IHdyYXBwZXIgZnVuY3Rpb25zLiIiIg0KX193cmFwcGVyVGVtcGxhdGUgPSAi
IiINCmRlZiAlKGZ1bmN0aW9uX25hbWUpcygqYXJncyk6DQogICAgdHJ5OiBh
cHBseShfXyUoZnVuY3Rpb25fbmFtZSlzLCBhcmdzKQ0KICAgIGV4Y2VwdCBU
a2ludGVyLlRjbEVycm9yOg0KICAgICAgICBjbGVhckdyYXBoaWNzKCkNCiAg
ICAgICAgYXBwbHkoX18lKGZ1bmN0aW9uX25hbWUpcywgYXJncykNCl9fJShm
dW5jdGlvbl9uYW1lKXMgPSBOb25lDQoiIiINCmZvciBmdW5jdGlvbl9uYW1l
IGluIF9fd3JhcHBlZEZ1bmN0aW9uczoNCiAgICBleGVjIF9fd3JhcHBlclRl
bXBsYXRlICUgeydmdW5jdGlvbl9uYW1lJyA6IGZ1bmN0aW9uX25hbWV9DQoN
Cg0KZGVmIGNsZWFyR3JhcGhpY3MoKToNCiAgICBfX3Jlc2V0R3JhcGhpY3Mo
KQ0KICAgIF9fcmVzZXRGdW5jdGlvbnMoKQ0KICAgIF9fZ3JhcGhpY3MuY2xl
YXJHcmFwaGljcygpDQoNCg0KZGVmIF9fcmVzZXRHcmFwaGljcygpOg0KICAg
IGdsb2JhbCBfX2dyYXBoaWNzDQogICAgaWYgVGtpbnRlci5fZGVmYXVsdF9y
b290ID09IE5vbmU6DQogICAgICAgIFRraW50ZXIuX2RlZmF1bHRfcm9vdCA9
IFRraW50ZXIuVGsoKQ0KICAgICAgICBfX2dyYXBoaWNzID0gTm9uZQ0KICAg
IGlmIF9fZ3JhcGhpY3MgPT0gTm9uZToNCiAgICAgICAgX19ncmFwaGljcyA9
IEdyYXBoaWNzKFRraW50ZXIuX2RlZmF1bHRfcm9vdCkNCg0KDQpkZWYgX19y
ZXNldEZ1bmN0aW9ucygpOg0KICAgIHRlbXBsYXRlID0gJycnDQpnbG9iYWwg
X18lKGZ1bmN0aW9uX25hbWUpcw0KX18lKGZ1bmN0aW9uX25hbWUpcyA9IF9f
Z3JhcGhpY3MuJShmdW5jdGlvbl9uYW1lKXMNCicnJw0KICAgIGZvciBmdW5j
dGlvbl9uYW1lIGluIF9fd3JhcHBlZEZ1bmN0aW9uczoNCiAgICAgICAgZXhl
YyB0ZW1wbGF0ZSAlIHsnZnVuY3Rpb25fbmFtZScgOiBmdW5jdGlvbl9uYW1l
fQ0KDQoNCiMjIExldCdzIHN0YXJ0IHRoZSBtYWdpYy4NCmNsZWFyR3JhcGhp
Y3MoKQ0KDQo=
--545289610-2072271115-989456109=:29220--