[Mailman-Developers] Mailman web-archiver

The Dragon De Monsyne dragondm@delta.integral.org
Thu, 27 Aug 1998 01:48:58 -0500 (CDT)


  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.

---1395546950-237318664-904200538=:1550
Content-Type: TEXT/PLAIN; charset=US-ASCII


	Well, it's a bit rough, and there's a few more things i'd like to
do with it, But my free time may be scarse lately & I'm going on vacation
in a week, so I figure I'd better post this & let some folks play with it.

	Anyway, this is the intgrated web-archiver module for Mailman.
For the moment, it still needs bsddb (mebbe after I get back I can try
tackling replacing that) 

To get this working, here is what ye need to do:

    1) Make sure you have the bsddb module compiled :P 
    2) Make sure you have somewhere in your PYTHONPATH
       the following python modules:
         a) The latest pipermail (0.0.5)
         b) Digicool's DocumentTemplate package
           <http://www.digicool.com/releases/bobo/DocumentTemplate-rn.html>
    3) Make sure you get rid of the old pipermail 0.0.2 sitting in 
       the Mailman package.
    4) Put HyperArch.py in the Mailman package directory.
    5) Put the 'arch' script in the ${prefix}/cron directory     
    6) Apply the included patch.
    7) add an entry like this to your crontab:

# Periodically  update the webarchive. 
0 3,9,17,23 * * * /usr/local/bin/python /usr/services/mailman/cron/arch
      
Notes: 
    You can run the arch script as often as you like, depending on how
up-to-date you want your webarchives to be. 

    You also can run the script from the command line to manually add
articles to the archive. (I just ran three years worth of traffic from a
reasonabally high-volume majordomo list I'm moving over thru this system,
and it went thru fine.)

    You can set archives to use yearly, quarterly, or monthly archives
with this.
 
    You will probably want to use the 'Set date to when re-sent' option
on your lists with this module. 

    All the HTML generated by this module is generated from a template.
This makes customizing the output trivial, just edit the template. 
(Right now the templates are static strings. This should be changed soon.)      

    If you do not run the arch cronjob, then this module will do nothing,
and will not interfere with an external archiver. 

	-The Dragon De Monsyne

---1395546950-237318664-904200538=:1550
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=patch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.980827014858.1550B@delta.integral.org>
Content-Description: 

ZGlmZiAtYyAvdXNyL3NyYy9tYWlsbWFuLTEuMGI1L01haWxtYW4vQXJjaGl2
ZXIucHkgTWFpbG1hbi9BcmNoaXZlci5weQ0KKioqIC91c3Ivc3JjL21haWxt
YW4tMS4wYjUvTWFpbG1hbi9BcmNoaXZlci5weQlNb24gSnVsIDI3IDE3OjQ4
OjMxIDE5OTgNCi0tLSBNYWlsbWFuL0FyY2hpdmVyLnB5CVN1biBBdWcgMTYg
MTE6MTE6NTIgMTk5OA0KKioqKioqKioqKioqKioqDQoqKiogNDIsNDkgKioq
Kg0KICAJc2VsZi5hcmNoaXZlX3ByaXZhdGUgPSBtbV9jZmcuREVGQVVMVF9B
UkNISVZFX1BSSVZBVEUNCiAgIyMgCXNlbGYuYXJjaGl2ZV91cGRhdGVfZnJl
cXVlbmN5ID0gXA0KICAjIyAJCSBtbV9jZmcuREVGQVVMVF9BUkNISVZFX1VQ
REFURV9GUkVRVUVOQ1kNCiEgIyMgCXNlbGYuYXJjaGl2ZV92b2x1bWVfZnJl
cXVlbmN5ID0gXA0KISAjIyAJCW1tX2NmZy5ERUZBVUxUX0FSQ0hJVkVfVk9M
VU1FX0ZSRVFVRU5DWQ0KICAjIyAJc2VsZi5hcmNoaXZlX3JldGFpbl90ZXh0
X2NvcHkgPSBcDQogICMjIAkJbW1fY2ZnLkRFRkFVTFRfQVJDSElWRV9SRVRB
SU5fVEVYVF9DT1BZDQogIA0KLS0tIDQyLDQ5IC0tLS0NCiAgCXNlbGYuYXJj
aGl2ZV9wcml2YXRlID0gbW1fY2ZnLkRFRkFVTFRfQVJDSElWRV9QUklWQVRF
DQogICMjIAlzZWxmLmFyY2hpdmVfdXBkYXRlX2ZyZXF1ZW5jeSA9IFwNCiAg
IyMgCQkgbW1fY2ZnLkRFRkFVTFRfQVJDSElWRV9VUERBVEVfRlJFUVVFTkNZ
DQohICAJc2VsZi5hcmNoaXZlX3ZvbHVtZV9mcmVxdWVuY3kgPSBcDQohICAJ
CW1tX2NmZy5ERUZBVUxUX0FSQ0hJVkVfVk9MVU1FX0ZSRVFVRU5DWQ0KICAj
IyAJc2VsZi5hcmNoaXZlX3JldGFpbl90ZXh0X2NvcHkgPSBcDQogICMjIAkJ
bW1fY2ZnLkRFRkFVTFRfQVJDSElWRV9SRVRBSU5fVEVYVF9DT1BZDQogIA0K
KioqKioqKioqKioqKioqDQoqKiogNjIsNzEgKioqKg0KICAgICAgZGVmIEdl
dEJhc2VBcmNoaXZlVVJMKHNlbGYpOg0KICAgICAgICAgIGlmIHNlbGYuYXJj
aGl2ZV9wcml2YXRlOg0KICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5q
b2luKG1tX2NmZy5QUklWQVRFX0FSQ0hJVkVfVVJMLA0KISAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludGVybmFsX25hbWUgKyAi
Lmh0bWwiKQ0KICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgIHJldHVy
biBvcy5wYXRoLmpvaW4obW1fY2ZnLlBVQkxJQ19BUkNISVZFX1VSTCwNCiEg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnRlcm5h
bF9uYW1lICsgIi5odG1sIikNCiAgDQogICAgICBkZWYgR2V0Q29uZmlnSW5m
byhzZWxmKToNCiAgCXJldHVybiBbDQotLS0gNjIsNzEgLS0tLQ0KICAgICAg
ZGVmIEdldEJhc2VBcmNoaXZlVVJMKHNlbGYpOg0KICAgICAgICAgIGlmIHNl
bGYuYXJjaGl2ZV9wcml2YXRlOg0KICAgICAgICAgICAgICByZXR1cm4gb3Mu
cGF0aC5qb2luKG1tX2NmZy5QUklWQVRFX0FSQ0hJVkVfVVJMLA0KISAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludGVybmFsX25h
bWUgKyBtbV9jZmcuUFJJVkFURV9BUkNISVZFX1VSTF9FWFQpDQogICAgICAg
ICAgZWxzZToNCiAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbiht
bV9jZmcuUFVCTElDX0FSQ0hJVkVfVVJMLA0KISAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNlbGYuX2ludGVybmFsX25hbWUgKyBtbV9jZmcu
UFJJVkFURV9BUkNISVZFX1VSTF9FWFQpDQogIA0KICAgICAgZGVmIEdldENv
bmZpZ0luZm8oc2VsZik6DQogIAlyZXR1cm4gWw0KKioqKioqKioqKioqKioq
DQoqKiogODUsOTMgKioqKg0KICAjIyAJICAgICAiSG93IG9mdGVuIHNob3Vs
ZCBuZXcgbWVzc2FnZXMgYmUgaW5jb3Jwb3JhdGVkPyAgIg0KICAjIyAJICAg
ICAiMCBmb3Igbm8gYXJjaGl2YWwsIDEgZm9yIGRhaWx5LCAyIGZvciBob3Vy
bHkiKSwNCiAgDQohICMjIAkgICAgKCdhcmNoaXZlX3ZvbHVtZV9mcmVxdWVu
Y3knLCBtbV9jZmcuUmFkaW8sICgnWWVhcmx5JywgJ01vbnRobHknKSwNCiEg
IyMgCSAgICAgMCwNCiEgIyMgCSAgICAgJ0hvdyBvZnRlbiBzaG91bGQgYSBu
ZXcgYXJjaGl2ZSB2b2x1bWUgYmUgc3RhcnRlZD8nKSwNCiAgDQogICMjIAkg
ICAgKCdhcmNoaXZlX3JldGFpbl90ZXh0X2NvcHknLCBtbV9jZmcuVG9nZ2xl
LCAoJ05vJywgJ1llcycpLA0KICAjIyAJICAgICAwLA0KLS0tIDg1LDkzIC0t
LS0NCiAgIyMgCSAgICAgIkhvdyBvZnRlbiBzaG91bGQgbmV3IG1lc3NhZ2Vz
IGJlIGluY29ycG9yYXRlZD8gICINCiAgIyMgCSAgICAgIjAgZm9yIG5vIGFy
Y2hpdmFsLCAxIGZvciBkYWlseSwgMiBmb3IgaG91cmx5IiksDQogIA0KISAg
CSAgICAoJ2FyY2hpdmVfdm9sdW1lX2ZyZXF1ZW5jeScsIG1tX2NmZy5SYWRp
bywgDQohICAgICAgICAgICAgICAgICgnWWVhcmx5JywgJ01vbnRobHknLCdR
dWFydGVybHknKSwgMCwNCiEgIAkgICAgICdIb3cgb2Z0ZW4gc2hvdWxkIGEg
bmV3IGFyY2hpdmUgdm9sdW1lIGJlIHN0YXJ0ZWQ/JyksDQogIA0KICAjIyAJ
ICAgICgnYXJjaGl2ZV9yZXRhaW5fdGV4dF9jb3B5JywgbW1fY2ZnLlRvZ2ds
ZSwgKCdObycsICdZZXMnKSwNCiAgIyMgCSAgICAgMCwNCmRpZmYgLWMgL3Vz
ci9zcmMvbWFpbG1hbi0xLjBiNS9NYWlsbWFuL0RlZmF1bHRzLnB5IE1haWxt
YW4vRGVmYXVsdHMucHkNCioqKiAvdXNyL3NyYy9tYWlsbWFuLTEuMGI1L01h
aWxtYW4vRGVmYXVsdHMucHkJV2VkIEF1ZyAxOSAwMTo0NjozNyAxOTk4DQot
LS0gTWFpbG1hbi9EZWZhdWx0cy5weQlUaHUgQXVnIDI3IDAwOjIyOjQ2IDE5
OTgNCioqKioqKioqKioqKioqKg0KKioqIDM3LDQyICoqKioNCi0tLSAzNyw0
OCAtLS0tDQogIFBVQkxJQ19BUkNISVZFX1VSTCA9ICdodHRwOi8vd3d3Lk9W
RVJSSURFLldJVEguWU9VUi5QVUJMSUMuQVJDSElWRS5VUkwvJw0KICBQUklW
QVRFX0FSQ0hJVkVfVVJMID0gJ2h0dHA6Ly93d3cuT1ZFUlJJREUuV0lUSC5Z
T1VSLlBSSVZBVEUuQVJDSElWRS5VUkwvJw0KICANCisgREVGQVVMVF9BUkNI
SVZFX1ZPTFVNRV9GUkVRVUVOQ1kgPSAxDQorIA0KKyANCisgUFVCTElDX0FS
Q0hJVkVfVVJMX0VYVCA9ICcnDQorIFBSSVZBVEVfQVJDSElWRV9VUkxfRVhU
ID0gJycNCisgDQogIERFRkFVTFRfQVJDSElWRV9QUklWQVRFICAgID0gMAkJ
IyAwPXB1YmxpYywgMT1wcml2YXRlDQogIEhPTUVfUEFHRSAgICAgICAgID0g
J2luZGV4Lmh0bWwnDQogIE1BSUxNQU5fT1dORVIgICAgID0gJ21haWxtYW4t
b3duZXJAJXMnICUgREVGQVVMVF9IT1NUX05BTUUNCioqKioqKioqKioqKioq
Kg0KKioqIDIxNiwyMTkgKioqKg0KICBWRVJTSU9OICAgICAgICAgICA9ICcx
LjBiNScNCiAgDQogICMgRGF0YSBmaWxlIHZlcnNpb24gbnVtYmVyDQohIERB
VEFfRklMRV9WRVJTSU9OID0gMw0KLS0tIDIyMiwyMjUgLS0tLQ0KICBWRVJT
SU9OICAgICAgICAgICA9ICcxLjBiNScNCiAgDQogICMgRGF0YSBmaWxlIHZl
cnNpb24gbnVtYmVyDQohIERBVEFfRklMRV9WRVJTSU9OID0gNA0KZGlmZiAt
YyAvdXNyL3NyYy9tYWlsbWFuLTEuMGI1L01haWxtYW4vaHRtbGZvcm1hdC5w
eSBNYWlsbWFuL2h0bWxmb3JtYXQucHkNCioqKiAvdXNyL3NyYy9tYWlsbWFu
LTEuMGI1L01haWxtYW4vaHRtbGZvcm1hdC5weQlNb24gSnVsIDI3IDE3OjQ4
OjMxIDE5OTgNCi0tLSBNYWlsbWFuL2h0bWxmb3JtYXQucHkJV2VkIEF1ZyAx
OSAwMjoyNDo0MyAxOTk4DQoqKioqKioqKioqKioqKioNCioqKiAzODMsMzg5
ICoqKioNCiAgCUlucHV0T2JqLl9faW5pdF9fKHNlbGYsIG5hbWUsICJURVhU
IiwgdmFsdWUsIGNoZWNrZWQ9MCwgc2l6ZT1zaXplKQ0KICANCiAgY2xhc3Mg
VGV4dEFyZWE6DQohICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdGV4
dD0nJywgcm93cz1Ob25lLCBjb2xzPU5vbmUsIHdyYXA9J3NvZnQnKToNCiAg
CXNlbGYubmFtZSA9IG5hbWUNCiAgCXNlbGYudGV4dCA9IHRleHQNCiAgCXNl
bGYucm93cyA9IHJvd3MNCi0tLSAzODMsMzg5IC0tLS0NCiAgCUlucHV0T2Jq
Ll9faW5pdF9fKHNlbGYsIG5hbWUsICJURVhUIiwgdmFsdWUsIGNoZWNrZWQ9
MCwgc2l6ZT1zaXplKQ0KICANCiAgY2xhc3MgVGV4dEFyZWE6DQohICAgICBk
ZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdGV4dD0nJywgcm93cz1Ob25lLCBj
b2xzPU5vbmUsIHdyYXA9J29mZicpOg0KICAJc2VsZi5uYW1lID0gbmFtZQ0K
ICAJc2VsZi50ZXh0ID0gdGV4dA0KICAJc2VsZi5yb3dzID0gcm93cw0KZGlm
ZiAtYyAvdXNyL3NyYy9tYWlsbWFuLTEuMGI1L01haWxtYW4vdmVyc2lvbnMu
cHkgTWFpbG1hbi92ZXJzaW9ucy5weQ0KKioqIC91c3Ivc3JjL21haWxtYW4t
MS4wYjUvTWFpbG1hbi92ZXJzaW9ucy5weQlNb24gSnVsIDI3IDE3OjQ4OjMx
IDE5OTgNCi0tLSBNYWlsbWFuL3ZlcnNpb25zLnB5CVdlZCBBdWcgMTkgMDI6
MzE6MDYgMTk5OA0KKioqKioqKioqKioqKioqDQoqKiogNjMsNzAgKioqKg0K
ICAgICAgUHJlZmVyU3RvcmVkKCdhdXRvbWF0aWNhbGx5X3JlbW92ZScsICdh
dXRvbWF0aWNfYm91bmNlX2FjdGlvbicpDQogICAgICAjICAtIGRyb3BwZWQg
dmFyczoNCiAgICAgIGZvciBhIGluIFsnYXJjaGl2ZV9yZXRhaW5fdGV4dF9j
b3B5JywNCiEgICAgICAgICAgICAgICAnYXJjaGl2ZV91cGRhdGVfZnJlcXVl
bmN5JywNCiEgICAgICAgICAgICAgICAnYXJjaGl2ZV92b2x1bWVfZnJlcXVl
bmN5J106DQogICAgICAgICAgaWYgaGFzYXR0cihsLCBhKTogZGVsYXR0cihs
LCBhKQ0KICANCiAgZGVmIFVwZGF0ZU9sZFVzZXJzKGwpOg0KLS0tIDYzLDY5
IC0tLS0NCiAgICAgIFByZWZlclN0b3JlZCgnYXV0b21hdGljYWxseV9yZW1v
dmUnLCAnYXV0b21hdGljX2JvdW5jZV9hY3Rpb24nKQ0KICAgICAgIyAgLSBk
cm9wcGVkIHZhcnM6DQogICAgICBmb3IgYSBpbiBbJ2FyY2hpdmVfcmV0YWlu
X3RleHRfY29weScsDQohICAgICAgICAgICAgICAgJ2FyY2hpdmVfdXBkYXRl
X2ZyZXF1ZW5jeSddOg0KICAgICAgICAgIGlmIGhhc2F0dHIobCwgYSk6IGRl
bGF0dHIobCwgYSkNCiAgDQogIGRlZiBVcGRhdGVPbGRVc2VycyhsKToNCg==
---1395546950-237318664-904200538=:1550
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=arch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.980827014858.1550C@delta.integral.org>
Content-Description: 

IyEvdXNyL2xvY2FsL2Jpbi9weXRob24NCg0KaW1wb3J0IHN5cywgc3RyaW5n
LCBnZXRvcHQsIG9zDQppbXBvcnQgcGF0aHMNCmltcG9ydCBNYWlsbWFuLkh5
cGVyQXJjaA0KaW1wb3J0IE1haWxtYW4uVXRpbHMNCmZyb20gTWFpbG1hbi5I
eXBlckFyY2ggaW1wb3J0IEh5cGVyQXJjaGl2ZQ0KZnJvbSBNYWlsbWFuLk1h
aWxMaXN0IGltcG9ydCBNYWlsTGlzdA0KDQpkZWYgQXJjaExpc3QobGlzdCk6
DQogICAgbD1NYWlsTGlzdChsaXN0KQ0KICAgIGg9SHlwZXJBcmNoaXZlKGwp
DQogICAgaC5wcm9jZXNzTGlzdEFyY2goKQ0KICAgIGguY2xvc2UoKQ0KDQpk
ZWYgUHJpbnRVc2FnZSgpOg0KICAgIHByaW50ICgnICB1c2FnZTogYXJjaCBb
LXYgfCAtLXZlcmJvc2VdIFstbCAibGlzdCIgfCAtLWxpc3QgImxpc3QiXSAn
IA0KICAgICAgICAgICdbbWFpbGJveGZpbGVzXScpDQogICAgaW1wb3J0IHN5
cw0KICAgIHN5cy5leGl0KDEpDQoNCmRlZiBtYWluKCk6DQogICAgaWYgJy1o
JyBpbiBzeXMuYXJndiBvciAnLT8nIGluIHN5cy5hcmd2OiANCglQcmludFVz
YWdlKCkNCiAgICAgICAgcmV0dXJuDQoNCiAgICBjb25maWc9eydWRVJCT1NF
JzowfQ0KICAgIA0KICAgICMgTm93IHdlIHBhcnNlIHRoZSBjb21tYW5kIGxp
bmUgb3B0aW9ucw0KICAgIG9wdHMsIHBhcmFtcyA9IGdldG9wdC5nZXRvcHQo
c3lzLmFyZ3ZbMTpdLCAndmw6JywgWyd2ZXJib3NlJywnbGlzdD0nXSkNCiAg
ICBmb3Igb3B0aW9uLCBhcmcgaW4gb3B0czoNCglpZiBvcHRpb249PSctbCc6
IGNvbmZpZ1snTElTVCddPWFyZw0KCWlmIG9wdGlvbj09Jy12JzogY29uZmln
WydWRVJCT1NFJ109MQ0KCWlmIG9wdGlvbj09Jy0tbGlzdCc6IGNvbmZpZ1sn
TElTVCddPWFyZw0KCWlmIG9wdGlvbj09Jy0tdmVyYm9zZSc6IGNvbmZpZ1sn
VkVSQk9TRSddPTENCg0KICAgIGlmIGNvbmZpZy5oYXNfa2V5KCdMSVNUJyk6
DQogICAgICAgIGlmIHBhcmFtczoNCiAgICAgICAgICAgIGw9TWFpbExpc3Qo
Y29uZmlnWydMSVNUJ10sbG9jaz0wKQ0KICAgICAgICAgICAgaD1IeXBlckFy
Y2hpdmUobCkNCiAgICAgICAgICAgIGlmIGNvbmZpZ1snVkVSQk9TRSddOg0K
ICAgICAgICAgICAgICAgIGguVkVSQk9TRT0xDQogICAgICAgICAgICBmb3Ig
ZWFjaCBpbiBwYXJhbXM6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAg
ICAgICAgICAgICAgICBmPW9wZW4oZWFjaCwncicpDQogICAgICAgICAgICAg
ICAgZXhjZXB0IElPRXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHN5cy5z
dGRlcnIud3JpdGUoIkNhbm5vdCBvcGVuICVzXG4iICUgZWFjaCApDQogICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgaC5w
cm9jZXNzVW5peE1haWxib3goZixNYWlsbWFuLkh5cGVyQXJjaC5BcnRpY2xl
KQ0KICAgICAgICAgICAgICAgIGYuY2xvc2UoKQ0KICAgICAgICAgICAgaC5j
bG9zZSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBsPU1haWxMaXN0
KGNvbmZpZ1snTElTVCddKQ0KICAgICAgICAgICAgaD1IeXBlckFyY2hpdmUo
bCkNCiAgICAgICAgICAgIGlmIGNvbmZpZ1snVkVSQk9TRSddOg0KICAgICAg
ICAgICAgICAgIGguVkVSQk9TRT0xDQogICAgICAgICAgICBoLnByb2Nlc3NM
aXN0QXJjaCgpDQogICAgICAgICAgICBoLmNsb3NlKCkNCiAgICBlbHNlOg0K
ICAgICAgICAjbG9vcCB0aHJ1IGFsbCB0aGUgbGlzdHMsIGRvaW5nIGFyY2hp
dmluZyAtZGRtLiAgICAgDQogICAgICAgIGZvciBlYWNoIGluIE1haWxtYW4u
VXRpbHMubGlzdF9uYW1lcygpOg0KICAgICAgICAgICAgaWYgY29uZmlnWydW
RVJCT1NFJ106DQogICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgi
UHJvY2Vzc2luZyBsaXN0ICVzXG4iICUgZWFjaCkNCiAgICAgICAgICAgIGw9
TWFpbExpc3QoZWFjaCkNCiAgICAgICAgICAgIGlmIG5vdCBsLmFyY2hpdmU6
DQogICAgICAgICAgICAgICAgbC5VbmxvY2soKQ0KICAgICAgICAgICAgICAg
IGRlbCBsDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGg9
SHlwZXJBcmNoaXZlKGwpDQogICAgICAgICAgICAgICAgaWYgY29uZmlnWydW
RVJCT1NFJ106DQogICAgICAgICAgICAgICAgICAgIGguVkVSQk9TRT0xDQog
ICAgICAgICAgICAgICAgaC5wcm9jZXNzTGlzdEFyY2goKQ0KICAgICAgICAg
ICAgICAgIGguY2xvc2UoKQ0KICAgICAgICAgICAgICAgICAgICANCmlmIF9f
bmFtZV9fID09ICdfX21haW5fXyc6DQogICAgbWFpbigpDQo=
---1395546950-237318664-904200538=:1550
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="HyperArch.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.96.980827014858.1550D@delta.integral.org>
Content-Description: 

IiIiSHlwZXJBcmNoOiAgUGlwZXJtYWlsIGFyY2hpdmluZyBmb3IgTWFpbE1h
biwgdXNpbmcgRG9jdW1lbnRUZW1wbGF0ZQ0KICAgdGVtcGxhdGVzIA0KDQog
ICAgICAgLSBUaGUgRHJhZ29uIERlIE1vbnN5bmUgPGRyYWdvbmRtQGludGVn
cmFsLm9yZz4gDQoNCiAgIFNlZSA8aHR0cDovL3d3dy5kaWdpY29vbC5jb20v
c2l0ZS9QcmluY2lwaWEvRFRNTC5odG1sPiBmb3Igc29tZSBleHBsYW5hdGlv
bg0KICAgb2YgRFRNTCAoRG9jdW1lbnRUZW1wbGF0ZSkgU3ludGF4LiANCiAg
ICAoTm90ZTogdGhlIFVSTCBsaXN0ZWQgYWN1YWxseSBkb2N1bWVudHMgYSBz
bGlnaHRseSBleHRlbmRlZCBEVE1MIHN5bnRheCANCiAgICAgdXNlZCBieSBh
IHByb2R1Y3QgY2FsbGVkIFByaW5jaXBpYS4gQnVnIHRoZSBmb2xrcyBhdCBE
aWdpY29vbCBmZXIgJ3BsYWluJw0KICAgICBEVE1MIGRvY3VtZW50YXRpb24g
Oj4gKQ0KDQogICBUT0RPOg0KICAgICAtIFRoZSB0ZW1wbGF0ZXMgc2hvdWxk
IGJlIGJlIGZpbGVzIGluIE1haWxtYW4ncyBUZW1wbGF0ZSBkaXIsIGluc3Rl
YWQNCiAgICAgICBvZiBzdGF0aWMgc3RyaW5ncy4NCiAgICAgLSBFYWNoIGxp
c3Qgc2hvdWxkIGJlIGFibGUgdG8gaGF2ZSBpdCdzIG93biB0ZW1wbGF0ZXMu
DQogICAgICAgQWxzbywgaXQgc2hvdWxkIGF1dG9tYXRpY2FsbHkgZmFsbCBi
YWNrIHRvIGRlZmF1bHQgdGVtcGxhdGUgaW4gY2FzZSANCiAgICAgICBvZiBl
cnJvciBpbiBsaXN0IHNwZWNpZmljIHRlbXBsYXRlLiANCiAgICAgLSBTaG91
bGQgYmUgYWJsZSB0byBmb3JjZSBhbGwgSFRNTCB0byBiZSByZWdlbmVyYXRl
ZCBuZXh0IHRpbWUgdGhlIGFyY2hpdmUNCiAgICAgICBpcyBydW4sIGluY2Fz
ZSBhIHRlbXBsYXRlIGlzIGNoYW5nZWQuIA0KICAgICAtIFJlcGxhY2UgcGlw
ZXJtYWlsLkJTRERCZGF0YWJhc2Ugd2l0aCBzb21ldGhpbmcgdGhhdCBkb3Nl
bid0IHJlcXVpcmUgYSBDDQogICAgICAgZXh0ZW50aW9uIChpLmUuIGJzZGRi
KS4gIA0KICAgICAgIChQZXJoYXBzIEJvYm9QT1MgPGh0dHA6Ly93d3cuZGln
aWNvb2wuY29tL3JlbGVhc2VzL2JvYm8vQm9ib1BPUy1ybi5odG1sPg0KICAg
ICAgIGNvdWxkIGJlIHVzZWQgaGVyZT8pDQogICAgIC0gUnVuIGEgY29tbWFu
ZCB0byBnZW5lcmF0ZSB0YXJiYWxsIG9mIGh0bWwgYXJjaGl2ZXMgZm9yIGRv
d25sb2FkaW5nDQogICAgICAgKHByb2xseSBpbiB0aGUgJ3VwZGF0ZV9kaXJ0
eV9hcmNoaXZlcycgbWV0aG9kICkNCg0KIiIiICAgDQoNCmltcG9ydCByZSwg
Y2dpLCB1cmxsaWIsIHN0cmluZw0KaW1wb3J0IHRpbWUsIHBpY2tsZSwgb3Ms
IHBvc2l4ZmlsZQ0KaW1wb3J0IERvY3VtZW50VGVtcGxhdGUNCmltcG9ydCBw
aXBlcm1haWwNCmltcG9ydCBtbV9jZmcNCg0KYXJ0aWNsZV90ZXh0X3RlbXBs
YXRlPSIiIkZyb20gPCEtLSN2YXIgZW1haWwgLS0+ICA8IS0tI3ZhciBkYXRl
c3RyIC0tPg0KRGF0ZTogPCEtLSN2YXIgZGF0ZXN0ciAtLT4NCkZyb206IDwh
LS0jdmFyIGF1dGhvciAtLT4gPDwhLS0jdmFyIGVtYWlsIC0tPj4NClN1Ympl
Y3Q6IDwhLS0jdmFyIHN1YmplY3QgLS0+DQoNCjwhLS0jaW4gYm9keSAtLT48
IS0tI3ZhciBzZXF1ZW5jZS1pdGVtICAtLT48IS0tIy9pbiAtLT4NCg0KIiIi
DQoNCmFydGljbGVfdGVtcGxhdGU9IiIiPCFET0NUWVBFIEhUTUwgUFVCTElD
ICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPg0KPEhUTUw+DQogPEhFQUQ+
DQogICA8VElUTEU+PCEtLSN2YXIgc3ViamVjdCBodG1sX3F1b3RlIC0tPjwv
VElUTEU+DQogICA8TElOSyBSRUw9IkluZGV4IiBIUkVGPSJpbmRleC5odG1s
IiA+DQogICA8TElOSyBSRUw9Im1hZGUiIEhSRUY9Im1haWx0bzo8IS0tI3Zh
ciBlbWFpbCB1cmxfcXVvdGUgLS0+Ij4NCiAgIDwhLS1saW5rdGhyZWFkcy0t
Pg0KICAgPCEtLSNpZiBwcmV2IC0tPg0KICAgIDxMSU5LIFJFTD0iUHJldmlv
dXMiICBIUkVGPSI8IS0tI3ZhciBleHByPSJwcmV2LmZpbGVuYW1lIiB1cmxf
cXVvdGUgLS0+Ij4gDQogICA8IS0tIy9pZiAtLT4NCiAgIDwhLS0jaWYgbmV4
dCAtLT4NCiAgICA8TElOSyBSRUw9Ik5leHQiICBIUkVGPSI8IS0tI3ZhciBl
eHByPSJuZXh0LmZpbGVuYW1lIiB1cmxfcXVvdGUgLS0+Ij4gDQogICA8IS0t
Iy9pZiAtLT4NCiAgIDwhLS1lbmRsaW5rdGhyZWFkcy0tPg0KIDwvSEVBRD4N
CiA8Qk9EWSBCR0NPTE9SPSIjZmZmZmZmIj4NCiAgIDxIMT48IS0tI3ZhciBz
dWJqZWN0IGh0bWxfcXVvdGUgLS0+PC9IMT4NCiAgICA8Qj48IS0tI3ZhciBh
dXRob3IgaHRtbF9xdW90ZSAtLT48L0I+IA0KICAgIDxBIEhSRUY9Im1haWx0
bzo8IS0tI3ZhciBlbWFpbCB1cmxfcXVvdGUgLS0+IiBUSVRMRT0iPCEtLSN2
YXIgc3ViamVjdCBodG1sX3F1b3RlIC0tPiI+PCEtLSN2YXIgZW1haWwgaHRt
bF9xdW90ZSAtLT48L0E+PEJSPg0KICAgIDxJPjwhLS0jdmFyIGRhdGVzdHIg
aHRtbF9xdW90ZSAtLT48L0k+DQogICAgPFA+PFVMPg0KICAgICAgICAgPCEt
LXRocmVhZHMtLT4NCiAgICAgICAgPCEtLSNpZiBwcmV2IC0tPg0KICAgICAg
ICAgPExJPiBQcmV2aW91cyBtZXNzYWdlOiA8QSBIUkVGPSI8IS0tI3ZhciBl
eHByPSJwcmV2LmZpbGVuYW1lIiB1cmxfcXVvdGUgLS0+Ij48IS0tI3ZhciBl
eHByPSJwcmV2LnN1YmplY3QiIGh0bWxfcXVvdGUtLT48L0E+PC9saT4gDQog
ICAgICAgIDwhLS0jL2lmIC0tPg0KICAgICAgICA8IS0tI2lmIG5leHQgLS0+
DQogICAgICAgICA8TEk+IE5leHQgbWVzc2FnZTogPEEgSFJFRj0iPCEtLSN2
YXIgZXhwcj0ibmV4dC5maWxlbmFtZSIgdXJsX3F1b3RlIC0tPiI+PCEtLSN2
YXIgZXhwcj0ibmV4dC5zdWJqZWN0IiBodG1sX3F1b3RlIC0tPjwvQT48L2xp
PiANCiAgICAgICAgPCEtLSMvaWYgLS0+DQogICAgICAgICA8IS0tZW5kdGhy
ZWFkcy0tPg0KICAgICAgICAgPExJPiA8Qj5NZXNzYWdlcyBzb3J0ZWQgYnk6
PC9CPiANCiAgICAgICAgICAgICAgPGEgaHJlZj0iZGF0ZS5odG1sIzwhLS0j
dmFyIHNlcXVlbmNlIC0tPiI+WyBkYXRlIF08L2E+DQogICAgICAgICAgICAg
IDxhIGhyZWY9InRocmVhZC5odG1sIzwhLS0jdmFyIHNlcXVlbmNlIC0tPiI+
WyB0aHJlYWQgXTwvYT4NCiAgICAgICAgICAgICAgPGEgaHJlZj0ic3ViamVj
dC5odG1sIzwhLS0jdmFyIHNlcXVlbmNlIC0tPiI+WyBzdWJqZWN0IF08L2E+
DQogICAgICAgICAgICAgIDxhIGhyZWY9ImF1dGhvci5odG1sIzwhLS0jdmFy
IHNlcXVlbmNlIC0tPiI+WyBhdXRob3IgXTwvYT4NCiAgICAgICAgIDwvTEk+
DQogICAgICAgPC9VTD4NCiAgICA8SFI+ICANCjwhLS1iZWdpbmFydGljbGUt
LT4NCjwhLS0jaW4gYm9keSAtLT48IS0tI3ZhciBzZXF1ZW5jZS1pdGVtICAt
LT48IS0tIy9pbiAtLT4NCg0KPCEtLWVuZGFydGljbGUtLT4NCiAgICA8SFI+
DQogICAgPFA+PFVMPg0KICAgICAgICAgPCEtLXRocmVhZHMtLT4NCiAgICAg
ICAgPCEtLSNpZiBwcmV2IC0tPg0KICAgICAgICAgPExJPiBQcmV2aW91cyBt
ZXNzYWdlOiA8QSBIUkVGPSI8IS0tI3ZhciBleHByPSJwcmV2LmZpbGVuYW1l
IiB1cmxfcXVvdGUgLS0+Ij48IS0tI3ZhciBleHByPSJwcmV2LnN1YmplY3Qi
IGh0bWxfcXVvdGUtLT48L0E+PC9saT4gDQogICAgICAgIDwhLS0jL2lmIC0t
Pg0KICAgICAgICA8IS0tI2lmIG5leHQgLS0+DQogICAgICAgICA8TEk+IE5l
eHQgbWVzc2FnZTogPEEgSFJFRj0iPCEtLSN2YXIgZXhwcj0ibmV4dC5maWxl
bmFtZSIgdXJsX3F1b3RlIC0tPiI+PCEtLSN2YXIgZXhwcj0ibmV4dC5zdWJq
ZWN0IiBodG1sX3F1b3RlIC0tPjwvQT48L2xpPiANCiAgICAgICAgPCEtLSMv
aWYgLS0+DQogICAgICAgICA8IS0tZW5kdGhyZWFkcy0tPg0KICAgICAgICAg
PExJPiA8Qj5NZXNzYWdlcyBzb3J0ZWQgYnk6PC9CPiANCiAgICAgICAgICAg
ICAgPGEgaHJlZj0iZGF0ZS5odG1sIzwhLS0jdmFyIHNlcXVlbmNlIC0tPiI+
WyBkYXRlIF08L2E+DQogICAgICAgICAgICAgIDxhIGhyZWY9InRocmVhZC5o
dG1sIzwhLS0jdmFyIHNlcXVlbmNlIC0tPiI+WyB0aHJlYWQgXTwvYT4NCiAg
ICAgICAgICAgICAgPGEgaHJlZj0ic3ViamVjdC5odG1sIzwhLS0jdmFyIHNl
cXVlbmNlIC0tPiI+WyBzdWJqZWN0IF08L2E+DQogICAgICAgICAgICAgIDxh
IGhyZWY9ImF1dGhvci5odG1sIzwhLS0jdmFyIHNlcXVlbmNlIC0tPiI+WyBh
dXRob3IgXTwvYT4NCiAgICAgICAgIDwvTEk+DQogICAgICAgPC9VTD4NCjwv
Ym9keT48L2h0bWw+DQoiIiINCg0KaW5kZXhfaGVhZGVyX3RlbXBsYXRlPSIi
IjwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIv
L0VOIj4NCjxIVE1MPg0KICA8SEVBRD4NCiAgICAgPHRpdGxlPlRoZSA8IS0t
I3ZhciBleHByPSJtYWlsbGlzdC5yZWFsX25hbWUiIC0tPiA8IS0tI3ZhciBh
cmNoaXZlIC0tPiBBcmNoaXZlIGJ5IDwhLS0jdmFyIHR5cGUgLS0+PC90aXRs
ZT4NCiAgPC9IRUFEPg0KICA8Qk9EWSBCR0NPTE9SPSIjZmZmZmZmIj4NCiAg
ICAgIDxhIG5hbWU9InN0YXJ0Ij48L0E+DQogICAgICA8aDE+PCEtLSN2YXIg
YXJjaGl2ZSAtLT4gQXJjaGl2ZXMgYnkgPCEtLSN2YXIgdHlwZSAtLT48L2gx
Pg0KICAgICAgPHVsPg0KICAgICAgICAgPGxpPiA8Yj5NZXNzYWdlcyBzb3J0
ZWQgYnk6PC9iPg0KICAgICAgICAgICAgICA8IS0tI2lmIGV4cHI9InR5cGU8
PidUaHJlYWQnICIgLS0+DQoJCTxhIGhyZWY9InRocmVhZC5odG1sI3N0YXJ0
Ij5bIHRocmVhZCBdPC9hPg0KICAgICAgICAgICAgICA8IS0tIy9pZiAtLT4g
DQogICAgICAgICAgICAgIDwhLS0jaWYgZXhwcj0idHlwZTw+J1N1YmplY3Qn
ICIgLS0+DQoJCTxhIGhyZWY9InN1YmplY3QuaHRtbCNzdGFydCI+WyBzdWJq
ZWN0IF08L2E+DQogICAgICAgICAgICAgIDwhLS0jL2lmIC0tPiANCiAgICAg
ICAgICAgICAgPCEtLSNpZiBleHByPSJ0eXBlPD4nQXV0aG9yJyAiIC0tPg0K
CQk8YSBocmVmPSJhdXRob3IuaHRtbCNzdGFydCI+WyBhdXRob3IgXTwvYT4N
CiAgICAgICAgICAgICAgPCEtLSMvaWYgLS0+IA0KICAgICAgICAgICAgICA8
IS0tI2lmIGV4cHI9InR5cGU8PiAnRGF0ZScgIiAtLT4NCgkJPGEgaHJlZj0i
ZGF0ZS5odG1sI3N0YXJ0Ij5bIGRhdGUgXTwvYT4NCiAgICAgICAgICAgICAg
PCEtLSMvaWYgLS0+IDwvbGk+DQoJICAgICA8bGk+PGI+PGEgaHJlZj0iPCEt
LSN2YXIgZXhwcj0ibWFpbGxpc3QuR2V0QWJzb2x1dGVTY3JpcHRVUkwoJ2xp
c3RpbmZvJykiIC0tPiI+TW9yZSBpbmZvIG9uIHRoaXMgbGlzdC4uLjwvYT48
L2I+PC9saT4NCiAJIDwhLS0jaWYgQVJDSElWRVMgLS0+DQoJICAgICA8bGk+
IDxiPjxhIGhyZWY9IjwhLS0jdmFyIEFSQ0hJVkVTIC0tPiI+T3RoZXIgbWFp
bCBhcmNoaXZlczwvYT48L2I+IDwvbGk+DQoJIDwhLS0jL2lmIC0tPg0KICAg
ICAgPC91bD4NCiAgICAgIDxwPjxiPlN0YXJ0aW5nOjwvYj4gPGk+PCEtLSN2
YXIgZmlyc3RkYXRlIC0tPjwvaT48YnI+DQogICAgICAgICA8Yj5FbmRpbmc6
PC9iPiA8aT48IS0tI3ZhciBsYXN0ZGF0ZSAtLT48L2k+PGJyPg0KICAgICAg
ICAgPGI+TWVzc2FnZXM6PC9iPiA8IS0tI3ZhciBzaXplIC0tPjxwPg0KICAg
ICA8dWw+DQoNCiIiIg0KDQppbmRleF9mb290ZXJfdGVtcGxhdGU9IiIiDQog
ICAgPC91bD4NCiAgICA8cD4NCiAgICAgIDxhIG5hbWU9ImVuZCI+PGI+TGFz
dCBtZXNzYWdlIGRhdGU6PC9iPjwvYT4gDQogICAgICAgPGk+PCEtLSN2YXIg
bGFzdGRhdGUgLS0+PC9pPjxicj4NCiAgICA8Yj5BcmNoaXZlZCBvbjo8L2I+
IDxpPjwhLS0jdmFyIGFyY2hpdmVkYXRlIC0tPjwvaT4NCiAgICA8cD4NCiAg
IDx1bD4NCiAgICAgICAgIDxsaT4gPGI+TWVzc2FnZXMgc29ydGVkIGJ5Ojwv
Yj4NCiAgICAgICAgICAgICAgPCEtLSNpZiBleHByPSJ0eXBlPD4nVGhyZWFk
JyAiIC0tPg0KCQk8YSBocmVmPSJ0aHJlYWQuaHRtbCNzdGFydCI+WyB0aHJl
YWQgXTwvYT4NCiAgICAgICAgICAgICAgPCEtLSMvaWYgLS0+IA0KICAgICAg
ICAgICAgICA8IS0tI2lmIGV4cHI9InR5cGU8PidTdWJqZWN0JyAiIC0tPg0K
CQk8YSBocmVmPSJzdWJqZWN0Lmh0bWwjc3RhcnQiPlsgc3ViamVjdCBdPC9h
Pg0KICAgICAgICAgICAgICA8IS0tIy9pZiAtLT4gDQogICAgICAgICAgICAg
IDwhLS0jaWYgZXhwcj0idHlwZTw+J0F1dGhvcicgIiAtLT4NCgkJPGEgaHJl
Zj0iYXV0aG9yLmh0bWwjc3RhcnQiPlsgYXV0aG9yIF08L2E+DQogICAgICAg
ICAgICAgIDwhLS0jL2lmIC0tPiANCiAgICAgICAgICAgICAgPCEtLSNpZiBl
eHByPSJ0eXBlPD4gJ0RhdGUnICIgLS0+DQoJCTxhIGhyZWY9ImRhdGUuaHRt
bCNzdGFydCI+WyBkYXRlIF08L2E+DQogICAgICAgICAgICAgIDwhLS0jL2lm
IC0tPiA8L2xpPg0KCSAgICAgPGxpPjxiPjxhIGhyZWY9IjwhLS0jdmFyIGV4
cHI9Im1haWxsaXN0LkdldEFic29sdXRlU2NyaXB0VVJMKCdsaXN0aW5mbycp
IiAtLT4iPk1vcmUgaW5mbyBvbiB0aGlzIGxpc3QuLi48L2E+PC9iPjwvbGk+
DQogCSA8IS0tI2lmIEFSQ0hJVkVTIC0tPg0KCSAgICAgPGxpPiA8Yj48YSBo
cmVmPSI8IS0tI3ZhciBBUkNISVZFUyAtLT4iPk90aGVyIG1haWwgYXJjaGl2
ZXM8L2E+PC9iPiA8L2xpPg0KCSA8IS0tIy9pZiAtLT4NCiAgICAgPC91bD4N
CiAgICAgPHA+DQogICAgIDxocj4NCiAgICAgPGk+VGhpcyBhcmNoaXZlIHdh
cyBnZW5lcmF0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3N0YXJzaGlwLnNreXBv
cnQubmV0L2NyZXcvYW1rL21haW50YWluZWQvcGlwZXJtYWlsLmh0bWwiPlBp
cGVybWFpbCA8IS0tI3ZhciB2ZXJzaW9uIC0tPjwvYT4uPC9pPg0KICA8L0JP
RFk+DQo8L0hUTUw+IiIiDQoNCg0KVE9DX3RlbXBsYXRlPSIiIjwhRE9DVFlQ
RSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIvL0VOIj4NCjxI
VE1MPg0KICA8SEVBRD4NCiAgICAgPHRpdGxlPlRoZSA8IS0tI3ZhciBleHBy
PSJtYWlsbGlzdC5yZWFsX25hbWUiICAtLT4gQXJjaGl2ZXM8L3RpdGxlPg0K
ICA8L0hFQUQ+DQogIDxCT0RZIEJHQ09MT1I9IiNmZmZmZmYiPg0KICAgICA8
aDE+VGhlIDwhLS0jdmFyIGV4cHI9Im1haWxsaXN0LnJlYWxfbmFtZSIgIC0t
PiBBcmNoaXZlcyA8L2gxPg0KICAgICA8cD4NCiAgICAgIDxhIGhyZWY9Ijwh
LS0jdmFyIGV4cHI9Im1haWxsaXN0LkdldEFic29sdXRlU2NyaXB0VVJMKCds
aXN0aW5mbycpIiAtLT4iPk1vcmUgaW5mbyBvbiB0aGlzIGxpc3QuLi48L2E+
DQogICAgIDwvcD4NCiAgICAgPCEtLSNpZiBhcmNoaXZlcyAtLT4NCiAgICAg
IDwhLS0jaW4gYXJjaGl2ZXMgLS0+DQogICAgICAgIDwhLS0jaWYgc2VxdWVu
Y2Utc3RhcnQgIC0tPg0KICAgICAgICAgPHRhYmxlIGJvcmRlcj0zPg0KICAg
ICAgICAgIDx0cj48dGQ+QXJjaGl2ZTwvdGQ+IDx0ZD5WaWV3IGJ5OjwvdGQ+
IDx0ZD5Eb3dubG9hZGFibGUgdmVyc2lvbjwvdGQ+PC90cj4NCiAgICAgICAg
PCEtLSMvaWYgLS0+DQogICAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRk
PjwhLS0jdmFyIHNlcXVlbmNlLWl0ZW0gIC0tPjo8L3RkPg0KICAgICAgICAg
ICAgPHRkPg0KICAgICAgICAgICAgICA8QSBocmVmPSI8IS0tI3ZhciBzZXF1
ZW5jZS1pdGVtICAtLT4vdGhyZWFkLmh0bWwiPlsgVGhyZWFkIF08L2E+DQog
ICAgICAgICAgICAgIDxBIGhyZWY9IjwhLS0jdmFyIHNlcXVlbmNlLWl0ZW0g
IC0tPi9zdWJqZWN0Lmh0bWwiPlsgU3ViamVjdCBdPC9hPg0KICAgICAgICAg
ICAgICA8QSBocmVmPSI8IS0tI3ZhciBzZXF1ZW5jZS1pdGVtICAtLT4vYXV0
aG9yLmh0bWwiPlsgQXV0aG9yIF08L2E+DQogICAgICAgICAgICAgIDxBIGhy
ZWY9IjwhLS0jdmFyIHNlcXVlbmNlLWl0ZW0gIC0tPi9kYXRlLmh0bWwiPlsg
RGF0ZSBdPC9hPg0KICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgIDx0
ZD48QSBocmVmPSI8IS0tI3ZhciBzZXF1ZW5jZS1pdGVtICAtLT4udHh0Lmd6
Ij5bIFRleHQgXTwvYT48L3RkPiANCiAgICAgICAgICA8L3RyPg0KICAgICAg
ICA8IS0tI2lmIHNlcXVlbmNlLWVuZCAtLT4NCiAgICAgICAgIDwvdGFibGU+
DQogICAgICAgIDwhLS0jL2lmIC0tPg0KICAgICAgPCEtLSMvaW4gLS0+DQoN
CiAgICAgPCEtLSNlbHNlIC0tPg0KICAgICAgIDxQPkN1cnJlbnRseSwgdGhl
cmUgYXJlIG5vIGFyY2hpdmVzLiA8L1A+IA0KICAgICA8IS0tIy9pZiAtLT4N
CiAgPC9CT0RZPg0KPC9IVE1MPiIiIg0KDQpkZWYgQ0dJZXNjYXBlKGFyZyk6
IA0KICAgIHM9Y2dpLmVzY2FwZShzdHIoYXJnKSkNCiAgICBzPXJlLnN1Yign
IicsICcmcXVvdDsnLCBzKQ0KICAgIHJldHVybiBzDQoNCiMgUGFyZW50aGVz
aXplZCBodW1hbiBuYW1lIA0KcGFyZW5fbmFtZV9wYXQ9cmUuY29tcGlsZShy
JyhbKF0uKlspXSknKSANCiMgU3ViamVjdCBsaW5lcyBwcmVjZWRlZCB3aXRo
ICdSZTonIA0KUkVwYXQ9cmUuY29tcGlsZSggciJccypSRVxzKjpccyoiLA0K
CQkgIHJlLklHTk9SRUNBU0UpDQojIEUtbWFpbCBhZGRyZXNzZXMgYW5kIFVS
THMgaW4gdGV4dA0KZW1haWxwYXQ9cmUuY29tcGlsZShyJyhbLSssLlx3XStA
Wy0rLlx3XSspJykgDQojICBBcmdoISAgVGhpcyBwYXR0ZXJuIGlzIGJ1Z2d5
LCBhbmQgd2lsbCBjaG9rZSBvbiBVUkxzIHdpdGggR0VUIHBhcmFtZXRlcnMu
DQp1cmxwYXQ9cmUuY29tcGlsZShyJyhcdys6Ly9bXj4pXHNdKyknKSAjIFVS
THMgaW4gdGV4dA0KIyBCbGFuayBsaW5lcw0KYmxhbmtwYXQ9cmUuY29tcGls
ZShyJ15ccyokJykNCg0KIyANCiMgU3RhcnRpbmcgPGh0bWw+IGRpcmVjdGl2
ZQ0KaHRtbHBhdD1yZS5jb21waWxlKHInXlxzKjxIVE1MPlxzKiQnLCByZS5J
R05PUkVDQVNFKSAgICANCiMgRW5kaW5nIDwvaHRtbD4gZGlyZWN0aXZlDQpu
b2h0bWxwYXQ9cmUuY29tcGlsZShyJ15ccyo8L0hUTUw+XHMqJCcsIHJlLklH
Tk9SRUNBU0UpIA0KIyBNYXRjaCBxdW90ZWQgdGV4dA0KcXVvdGVkcGF0PXJl
LmNvbXBpbGUocideKFs+fDpdfCZndDspKycpDQoNCg0KIyBOb3RlOiBJJ20g
b3ZlcnJpZGluZyBtb3N0LCBpZiBub3QgYWxsIG9mIHRoZSBwaXBlcm1haWwg
QXJ0aWNsZSBjbGFzcyBoZXJlIC1kZG0NCiMgVGhlIEFydGljbGUgY2xhc3Mg
ZW5jYXBzdWxhdGVzIGEgc2luZ2xlIHBvc3RpbmcuICBUaGUgYXR0cmlidXRl
cyANCiMgYXJlOg0KIw0KIyAgc2VxdWVuY2UgOiBTZXF1ZW5jZSBudW1iZXIs
IHVuaXF1ZSBmb3IgZWFjaCBhcnRpY2xlIGluIGEgc2V0IG9mIGFyY2hpdmVz
DQojICBzdWJqZWN0ICA6IFN1YmplY3QNCiMgIGRhdGVzdHIgIDogVGhlIHBv
c3RpbmcgZGF0ZSwgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0DQojICBkYXRl
ICAgICA6IFRoZSBwb3N0aW5nIGRhdGUsIGluIHB1cmVseSBudW1lcmljIGZv
cm1hdA0KIyAgaGVhZGVycyAgOiBBbnkgb3RoZXIgaGVhZGVycyBvZiBpbnRl
cmVzdA0KIyAgYXV0aG9yICAgOiBUaGUgYXV0aG9yJ3MgbmFtZSAoYW5kIHBv
c3NpYmx5IG9yZ2FuaXphdGlvbikNCiMgIGVtYWlsICAgIDogVGhlIGF1dGhv
cidzIGUtbWFpbCBhZGRyZXNzDQojICBtc2dpZCAgICA6IEEgdW5pcXVlIG1l
c3NhZ2UgSUQNCiMgIGluX3JlcGx5X3RvIDogSWYgIT0iIiwgdGhpcyBpcyB0
aGUgbXNnaWQgb2YgdGhlIGFydGljbGUgYmVpbmcgcmVwbGllZCB0bw0KIyAg
cmVmZXJlbmNlczogQSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgbXNnaWQn
cyBvZiBlYXJsaWVyIGFydGljbGVzIGluIHRoZSB0aHJlYWQNCiMgIGJvZHkg
ICAgIDogQSBsaXN0IG9mIHN0cmluZ3MgbWFraW5nIHVwIHRoZSBtZXNzYWdl
IGJvZHkNCg0KY2xhc3MgQXJ0aWNsZShwaXBlcm1haWwuQXJ0aWNsZSk6DQog
ICAgX19sYXN0X2FydGljbGVfdGltZT10aW1lLnRpbWUoKQ0KDQogICAgaHRt
bF90bXBsPURvY3VtZW50VGVtcGxhdGUuSFRNTChhcnRpY2xlX3RlbXBsYXRl
KQ0KICAgIHRleHRfdG1wbD1Eb2N1bWVudFRlbXBsYXRlLkhUTUwoYXJ0aWNs
ZV90ZXh0X3RlbXBsYXRlKQ0KDQogICAgZGVmIGFzX2h0bWwoc2VsZik6DQog
ICAgICAgIHJldHVybiBzZWxmLmh0bWxfdG1wbChzZWxmKQ0KDQogICAgZGVm
IGFzX3RleHQoc2VsZik6DQogICAgICAgIHJldHVybiBzZWxmLnRleHRfdG1w
bChzZWxmKQ0KDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9u
ZSwgc2VxdWVuY2U9MCwga2VlcEhlYWRlcnM9W10pOg0KCWltcG9ydCB0aW1l
DQoJaWYgbWVzc2FnZT09Tm9uZTogcmV0dXJuDQoJc2VsZi5zZXF1ZW5jZT1z
ZXF1ZW5jZQ0KDQoJc2VsZi5wYXJlbnRJRCA9IE5vbmUgDQogICAgICAgIHNl
bGYudGhyZWFkS2V5ID0gTm9uZQ0KICAgICAgICBzZWxmLnByZXY9Tm9uZQ0K
ICAgICAgICBzZWxmLm5leHQ9Tm9uZQ0KCSMgb3RoZXJ3aXNlIHRoZSBjdXJy
ZW50IHNlcXVlbmNlIG51bWJlciBpcyB1c2VkLg0KCWlkPXBpcGVybWFpbC5z
dHJpcF9zZXBhcmF0b3JzKG1lc3NhZ2UuZ2V0aGVhZGVyKCdNZXNzYWdlLUlk
JykpDQoJaWYgaWQ9PSIiOiBzZWxmLm1zZ2lkPXN0cihzZWxmLnNlcXVlbmNl
KQ0KCWVsc2U6IHNlbGYubXNnaWQ9aWQNCg0KCWlmIG1lc3NhZ2UuaGFzX2tl
eSgnU3ViamVjdCcpOiBzZWxmLnN1YmplY3Q9c3RyKG1lc3NhZ2VbJ1N1Ympl
Y3QnXSkNCgllbHNlOiBzZWxmLnN1YmplY3Q9J05vIHN1YmplY3QnDQoJaT0w
DQoJd2hpbGUgKGkhPS0xKToNCgkgICAgcmVzdWx0PVJFcGF0Lm1hdGNoKHNl
bGYuc3ViamVjdCkNCgkgICAgaWYgcmVzdWx0OiANCgkJaSA9IHJlc3VsdC5l
bmQoMCkNCgkJc2VsZi5zdWJqZWN0PXNlbGYuc3ViamVjdFtpOl0NCgkgICAg
ZWxzZTogaT0tMQ0KCWlmIHNlbGYuc3ViamVjdD09IiI6IHNlbGYuc3ViamVj
dD0nTm8gc3ViamVjdCcNCg0KCWlmIG1lc3NhZ2UuaGFzX2tleSgnRGF0ZScp
OiANCgkgICAgc2VsZi5kYXRlc3RyPXN0cihtZXNzYWdlWydEYXRlJ10pDQog
ICAJICAgIGRhdGU9bWVzc2FnZS5nZXRkYXRlX3R6KCdEYXRlJykNCgllbHNl
OiANCgkgICAgc2VsZi5kYXRlc3RyPSdOb25lJyANCgkgICAgZGF0ZT1Ob25l
DQoJaWYgZGF0ZSE9Tm9uZToNCgkgICAgZGF0ZSwgdHpvZmZzZXQ9ZGF0ZVs6
OV0sIGRhdGVbLTFdIA0KICAgICAgICAgICAgaWYgbm90IHR6b2Zmc2V0Og0K
ICAgICAgICAgICAgICAgIHR6b2Zmc2V0ID0gMA0KCSAgICBkYXRlPXRpbWUu
bWt0aW1lKGRhdGUpLXR6b2Zmc2V0DQoJZWxzZToNCgkgICAgZGF0ZT1zZWxm
Ll9fbGFzdF9hcnRpY2xlX3RpbWUrMSANCiMgICAgICAgICAgICBwcmludCAn
QXJ0aWNsZSB3aXRob3V0IGRhdGU6Jywgc2VsZi5tc2dpZA0KCSAgICANCglz
ZWxmLl9fbGFzdF9hcnRpY2xlX3RpbWU9ZGF0ZSANCglzZWxmLmRhdGU9JyUw
MTFpJyAlIChkYXRlLCkNCg0KCSMgRmlndXJlIG91dCB0aGUgZS1tYWlsIGFk
ZHJlc3MgYW5kIHBvc3RlcidzIG5hbWUNCglzZWxmLmF1dGhvciwgc2VsZi5l
bWFpbD1tZXNzYWdlLmdldGFkZHIoJ0Zyb20nKQ0KIwllPW1lc3NhZ2UuZ2V0
aGVhZGVyKCdSZXBseS1UbycpDQojCWlmIGUhPU5vbmU6IHNlbGYuZW1haWw9
ZQ0KCXNlbGYuZW1haWw9cGlwZXJtYWlsLnN0cmlwX3NlcGFyYXRvcnMoc2Vs
Zi5lbWFpbCkNCglzZWxmLmF1dGhvcj1waXBlcm1haWwuc3RyaXBfc2VwYXJh
dG9ycyhzZWxmLmF1dGhvcikNCg0KCWlmIHNlbGYuYXV0aG9yPT0iIjogc2Vs
Zi5hdXRob3I9c2VsZi5lbWFpbA0KDQoJIyBTYXZlIHRoZSAnSW4tUmVwbHkt
VG86JyBhbmQgJ1JlZmVyZW5jZXM6JyBsaW5lcw0KCWlfcl90PW1lc3NhZ2Uu
Z2V0aGVhZGVyKCdJbi1SZXBseS1UbycpDQoJaWYgaV9yX3Q9PU5vbmU6IHNl
bGYuaW5fcmVwbHlfdG89JycNCgllbHNlOg0KCSAgICBtYXRjaD1waXBlcm1h
aWwubXNnaWRfcGF0LnNlYXJjaChpX3JfdCkNCgkgICAgaWYgbWF0Y2g9PU5v
bmU6IHNlbGYuaW5fcmVwbHlfdG89JycNCgkgICAgZWxzZTogc2VsZi5pbl9y
ZXBseV90bz1waXBlcm1haWwuc3RyaXBfc2VwYXJhdG9ycyhtYXRjaC5ncm91
cCgxKSkNCgkJDQoJcmVmZXJlbmNlcz1tZXNzYWdlLmdldGhlYWRlcignUmVm
ZXJlbmNlcycpDQoJaWYgcmVmZXJlbmNlcz09Tm9uZTogc2VsZi5yZWZlcmVu
Y2VzPVtdDQoJZWxzZTogc2VsZi5yZWZlcmVuY2VzPW1hcChwaXBlcm1haWwu
c3RyaXBfc2VwYXJhdG9ycywgc3RyaW5nLnNwbGl0KHJlZmVyZW5jZXMpKQ0K
DQoJIyBTYXZlIGFueSBvdGhlciBpbnRlcmVzdGluZyBoZWFkZXJzDQoJc2Vs
Zi5oZWFkZXJzPXt9DQoJZm9yIGkgaW4ga2VlcEhlYWRlcnM6DQoJICAgIGlm
IG1lc3NhZ2UuaGFzX2tleShpKTogc2VsZi5oZWFkZXJzW2ldPW1lc3NhZ2Vb
aV0NCg0KCSMgUmVhZCB0aGUgbWVzc2FnZSBib2R5DQoJc2VsZi5ib2R5PVtd
DQoJbWVzc2FnZS5yZXdpbmRib2R5KCkNCgl3aGlsZSAoMSk6DQoJICAgIGxp
bmU9bWVzc2FnZS5mcC5yZWFkbGluZSgpDQoJICAgIGlmIGxpbmU9PSIiOiBi
cmVhaw0KCSAgICBzZWxmLmJvZHkuYXBwZW5kKGxpbmUpDQoJDQogICAgZGVm
IGxvYWRib2R5X2Zyb21IVE1MKHNlbGYsZmlsZW9iaik6DQogICAgICAgIHNl
bGYuYm9keT1bXQ0KICAgICAgICBiZWdpbj0wDQoJd2hpbGUoMSk6DQogICAg
ICAgICAgICBsaW5lPWZpbGVvYmoucmVhZGxpbmUoKQ0KICAgICAgICAgICAg
aWYgbm90IGxpbmU6DQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAg
ICAgIGlmIChub3QgYmVnaW4pIGFuZCBzdHJpbmcuc3RyaXAobGluZSk9PSc8
IS0tYmVnaW5hcnRpY2xlLS0+JzoNCgkgICAgICAgIGJlZ2luPTENCiAgICAg
ICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgc3RyaW5nLnN0
cmlwKGxpbmUpPT0nPCEtLWVuZGFydGljbGUtLT4nOg0KICAgICAgICAgICAg
ICAgIGJyZWFrDQogICAgICAgICAgICBpZiBiZWdpbjoNCiAgICAgICAgICAg
ICAgICBzZWxmLmJvZHkuYXBwZW5kKGxpbmUpDQoNCiAgICBkZWYgX19nZXRz
dGF0ZV9fKHNlbGYpOg0KICAgICAgICBkPXt9DQogICAgICAgIGZvciBlYWNo
IGluIHNlbGYuX19kaWN0X18ua2V5cygpOg0KICAgICAgICAgICAgaWYgZWFj
aCBpbiBbJ21haWxsaXN0JywncHJldicsJ25leHQnLCdib2R5J106DQogICAg
ICAgICAgICAgICAgZFtlYWNoXSA9IE5vbmUNCiAgICAgICAgICAgIGVsc2U6
DQogICAgICAgICAgICAgICAgZFtlYWNoXSA9IHNlbGYuX19kaWN0X19bZWFj
aF0NCiAgICAgICAgZFsnYm9keSddPVtdDQogICAgICAgIHJldHVybiBkDQog
DQoNCmNsYXNzIEh5cGVyQXJjaGl2ZShwaXBlcm1haWwuVCk6DQoNCiAgICAj
IHNvbWUgZGVmYXVsdHMNCiAgICBESVJNT0RFPTA3NTUgDQogICAgRklMRU1P
REU9MDY0NCANCg0KICAgIFZFUkJPU0U9MA0KICAgIERFRkFVTFRJTkRFWD0n
dGhyZWFkJw0KICAgIEFSQ0hJVkVfUEVSSU9EPSdtb250aCcNCiANCiAgICBU
SFJFQURMQVpZPTANCiAgICBUSFJFQURMRVZFTFM9Mw0KDQogICAgQUxMT1dI
VE1MPTENCiAgICBTSE9XSFRNTD0xDQogICAgSVFVT1RFUz0xDQogICAgU0hP
V0JSPTENCg0KICAgIGh0bWxfaGRyX3RtcGw9RG9jdW1lbnRUZW1wbGF0ZS5I
VE1MKGluZGV4X2hlYWRlcl90ZW1wbGF0ZSkNCiAgICBodG1sX2Zvb3RfdG1w
bD1Eb2N1bWVudFRlbXBsYXRlLkhUTUwoaW5kZXhfZm9vdGVyX3RlbXBsYXRl
KQ0KICAgIGh0bWxfVE9DX3RtcGw9RG9jdW1lbnRUZW1wbGF0ZS5IVE1MKFRP
Q190ZW1wbGF0ZSkNCg0KICAgIGRlZiBodG1sX2Zvb3Qoc2VsZik6DQogICAg
ICAgIHJldHVybiBzZWxmLmh0bWxfZm9vdF90bXBsKHNlbGYpDQoNCiAgICBk
ZWYgaHRtbF9oZWFkKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5odG1s
X2hkcl90bXBsKHNlbGYpDQoNCiAgICBkZWYgaHRtbF9UT0Moc2VsZik6DQog
ICAgICAgIHJldHVybiBzZWxmLmh0bWxfVE9DX3RtcGwoc2VsZikNCg0KDQog
ICAgZGVmIF9faW5pdF9fKHNlbGYsIG1haWxsaXN0LHVubG9jaz0xKToNCiAg
ICAgICAgc2VsZi5tYWlsbGlzdD1tYWlsbGlzdA0KICAgICAgICBzZWxmLl91
bmxvY2tsaXN0PXVubG9jaw0KICAgICAgICBzZWxmLl9sb2NrX2ZpbGU9Tm9u
ZQ0KIA0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYubWFpbGxpc3QsJ2FyY2hp
dmVfdm9sdW1lX2ZyZXF1ZW5jeScpOg0KICAgICAgICAgICAgaWYgc2VsZi5t
YWlsbGlzdC5hcmNoaXZlX3ZvbHVtZV9mcmVxdWVuY3kgPT0gMDoNCiAgICAg
ICAgICAgICAgICBzZWxmLkFSQ0hJVkVfUEVSSU9EPSd5ZWFyJw0KICAgICAg
ICAgICAgZWxpZiBzZWxmLm1haWxsaXN0LmFyY2hpdmVfdm9sdW1lX2ZyZXF1
ZW5jeSA9PSAyOg0KICAgICAgICAgICAgICAgIHNlbGYuQVJDSElWRV9QRVJJ
T0Q9J3F1YXJ0ZXInDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAg
ICAgIHNlbGYuQVJDSElWRV9QRVJJT0Q9J21vbnRoJw0KDQoJcGlwZXJtYWls
LlQuX19pbml0X18oc2VsZiwgbWFpbGxpc3QuYXJjaGl2ZV9kaXJlY3Rvcnks
IHJlbG9hZD0xLCBkYXRhYmFzZT1waXBlcm1haWwuQlNEREJkYXRhYmFzZSht
YWlsbGlzdC5hcmNoaXZlX2RpcmVjdG9yeSkpDQoNCiAgICBkZWYgR2V0QXJj
aExvY2soc2VsZik6DQogICAgICAgIGlmIHNlbGYuX2xvY2tfZmlsZToNCiAg
ICAgICAgICAgIHJldHVybiAxDQogICAgICAgIG91ID0gb3MudW1hc2soMCkN
CiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5fbG9ja19maWxlID0g
cG9zaXhmaWxlLm9wZW4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBvcy5wYXRoLmpvaW4obW1fY2ZnLkxPQ0tfRElSLCAnJXNAYXJjaC5sb2Nr
JyAlIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWls
bGlzdC5faW50ZXJuYWxfbmFtZSksICdhKycpDQogICAgICAgIGZpbmFsbHk6
DQogICAgICAgICAgICBvcy51bWFzayhvdSkNCiAgICAgICAgIyBtaW5vciBy
YWNlIGNvbmRpdGlvbiBoZXJlLCB0aGVyZSBpcyBubyB3YXkgdG8gYXRvbWlj
bHkgDQogICAgICAgICMgY2hlY2sgJiBnZXQgYSBsb2NrLiBUaGF0IHNob3Vs
ZG4ndCBtYXR0ZXIgaGVyZSB0aG8nIC1kZG0NCiAgICAgICAgaWYgbm90IHNl
bGYuX2xvY2tfZmlsZS5sb2NrKCd3PycsIDEpOg0KICAgICAgICAgICAgc2Vs
Zi5fbG9ja19maWxlLmxvY2soJ3d8JywgMSkNCiAgICAgICAgZWxzZToNCiAg
ICAgICAgICAgIHJldHVybiAwDQogICAgICAgIHJldHVybiAxDQoNCiAgICBk
ZWYgRHJvcEFyY2hMb2NrKHNlbGYpOg0KICAgICAgICBpZiBzZWxmLl9sb2Nr
X2ZpbGU6DQogICAgICAgICAgICBzZWxmLl9sb2NrX2ZpbGUubG9jaygndScp
DQogICAgICAgICAgICBzZWxmLl9sb2NrX2ZpbGUuY2xvc2UoKQ0KICAgICAg
ICAgICAgc2VsZi5fbG9ja19maWxlID0gTm9uZQ0KDQogICAgZGVmIHByb2Nl
c3NMaXN0QXJjaChzZWxmKToNCiAgICAgICAgbmFtZSA9IHNlbGYubWFpbGxp
c3QuQXJjaGl2ZUZpbGVOYW1lKCkNCiAgICAgICAgd25hbWU9IG5hbWUrJy53
b3JraW5nJw0KICAgICAgICBlbmFtZT0gbmFtZSsnLmVycl91bmFyY2hpdmVk
Jw0KICAgICAgICB0cnk6DQogICAgICAgICAgICBvcy5zdGF0KG5hbWUpDQog
ICAgICAgIGV4Y2VwdCAoSU9FcnJvcixvcy5lcnJvcik6DQogICAgICAgICAg
ICAjbm8gYXJjaGl2ZSBmaWxlLCBub3RoaW4gdG8gZG8gLWRkbQ0KICAgICAg
ICAgICAgcmV0dXJuDQogDQogICAgICAgICNzZWUgaWYgYXJjaCBpcyBsb2Nr
ZWQgaGVyZSAtZGRtIA0KICAgICAgICBpZiBub3Qgc2VsZi5HZXRBcmNoTG9j
aygpOg0KICAgICAgICAgICAgI2Fub3RoZXIgYXJjaGl2ZXIgaXMgcnVubmlu
Zywgbm90aGluZyB0byBkby4gLWRkbQ0KICAgICAgICAgICAgcmV0dXJuDQoN
CiAgICAgICAgI2lmIHRoZSB3b3JraW5nIGZpbGUgaXMgc3RpbGwgaGVyZSwg
dGhlIGFyY2hpdmVyIG1heSBoYXZlIA0KICAgICAgICAjIGNyYXNoZWQgZHVy
aW5nIGFyY2hpdmluZy4gU2F2ZSBpdCwgbG9nIGFuIGVycm9yLCBhbmQgbW92
ZSBvbi4gDQoJdHJ5Og0KICAgICAgICAgICAgd2Y9b3Blbih3bmFtZSwncicp
DQogICAgICAgICAgICBzZWxmLm1haWxsaXN0LkxvZ01zZygiZXJyb3IiLCJB
cmNoaXZlIHdvcmtpbmcgZmlsZSAlcyBwcmVzZW50LiAiDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgJXMgZm9yIHBvc3NpYmx5
IHVuYXJjaGl2ZWQgbXNncyIgJQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICh3bmFtZSxlbmFtZSkgKQ0KICAgICAgICAgICAgZWY9b3Bl
bihlbmFtZSwgJ2ErJykNCiAgICAgICAgICAgIGVmLnNlZWsoMSwyKQ0KICAg
ICAgICAgICAgaWYgZWYucmVhZCgxKSA8PiAnXG4nOg0KICAgICAgICAgICAg
ICAgIGVmLndyaXRlKCdcbicpDQogICAgICAgICAgICBlZi53cml0ZSh3Zi5y
ZWFkKCkpDQogICAgICAgICAgICBlZi5jbG9zZSgpDQogICAgICAgICAgICB3
Zi5jbG9zZSgpDQogICAgICAgICAgICBvcy51bmxpbmsod25hbWUpDQogICAg
ICAgIGV4Y2VwdCBJT0Vycm9yOg0KICAgICAgICAgICAgcGFzcw0KICAgICAg
ICBvcy5yZW5hbWUobmFtZSx3bmFtZSkNCiAgICAgICAgaWYgc2VsZi5fdW5s
b2NrbGlzdDoNCiAgICAgICAgICAgIHNlbGYubWFpbGxpc3QuVW5sb2NrKCkN
CiAgICAgICAgYXJjaGZpbGU9b3Blbih3bmFtZSwncicpDQogICAgICAgIHNl
bGYucHJvY2Vzc1VuaXhNYWlsYm94KGFyY2hmaWxlLCBBcnRpY2xlKQ0KICAg
ICAgICBhcmNoZmlsZS5jbG9zZSgpDQogICAgICAgIG9zLnVubGluayh3bmFt
ZSkNCiAgICAgICAgc2VsZi5Ecm9wQXJjaExvY2soKQ0KDQogICAgZGVmIGdl
dF9maWxlbmFtZShzZWxmLCBhcnRpY2xlKToNCglyZXR1cm4gJyUwNmkuaHRt
bCcgJSAoYXJ0aWNsZS5zZXF1ZW5jZSwpDQoNCiAgICBkZWYgZ2V0X2FyY2hp
dmVzKHNlbGYsIGFydGljbGUpOg0KCSIiIlJldHVybiBhIGxpc3Qgb2YgaW5k
ZXhlcyB3aGVyZSB0aGUgYXJ0aWNsZSBzaG91bGQgYmUgZmlsZWQuDQoJQSBz
dHJpbmcgY2FuIGJlIHJldHVybmVkIGlmIHRoZSBsaXN0IG9ubHkgY29udGFp
bnMgb25lIGVudHJ5LCANCglhbmQgdGhlIGVtcHR5IGxpc3QgaXMgbGVnYWwu
IiIiDQoJaWYgYXJ0aWNsZS5zdWJqZWN0IGluIFsnc3Vic2NyaWJlJywgJ3Vu
c3Vic2NyaWJlJ106IHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBzZWxm
LmRhdGVUb1ZvbE5hbWUoc3RyaW5nLmF0b2YoYXJ0aWNsZS5kYXRlKSkNCg0K
DQojIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgc2hvdWxkIGJlIGludmVy
c2VzIG9mIGVhY2ggb3RoZXIuIC1kZG0NCg0KICAgIGRlZiBkYXRlVG9Wb2xO
YW1lKHNlbGYsZGF0ZSk6DQogICAgICAgIGRhdGV0dXBsZT10aW1lLmdtdGlt
ZShkYXRlKQ0KCWlmIHNlbGYuQVJDSElWRV9QRVJJT0Q9PSd5ZWFyJzoNCgkg
ICAgcmV0dXJuIHRpbWUuc3RyZnRpbWUoIiVZIixkYXRldHVwbGUpDQoJZWxp
ZiBzZWxmLkFSQ0hJVkVfUEVSSU9EPT0ncXVhcnRlcic6DQoJICAgIGlmIGFk
YXRlWzFdIGluIFsxLDIsM106DQoJICAgICAgICByZXR1cm4gdGltZS5zdHJm
dGltZSgiJVlxMSIsZGF0ZXR1cGxlKQ0KCSAgICBlbGlmIGFkYXRlWzFdIGlu
IFs0LDUsNl06DQoJICAgICAgICByZXR1cm4gdGltZS5zdHJmdGltZSgiJVlx
MiIsZGF0ZXR1cGxlKQ0KCSAgICBlbGlmIGFkYXRlWzFdIGluIFs3LDgsOV06
DQoJICAgICAgICByZXR1cm4gdGltZS5zdHJmdGltZSgiJVlxMyIsZGF0ZXR1
cGxlKQ0KCSAgICBlbHNlOg0KCSAgICAgICAgcmV0dXJuIHRpbWUuc3RyZnRp
bWUoIiVZcTQiLGRhdGV0dXBsZSkNCiAgICAgICAgIyBtb250aC4gLWRkbQ0K
IAllbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRpbWUuc3RyZnRpbWUoIiVZ
LSVCIixkYXRldHVwbGUpDQoNCiAgICBkZWYgdm9sTmFtZVRvRGF0ZShzZWxm
LHZvbG5hbWUpOg0KICAgICAgICB2b2xuYW1lPXN0cmluZy5zdHJpcCh2b2xu
YW1lKQ0KICAgICAgICB2b2xyZT0geyAneWVhcicgOiByJ14oP1A8eWVhcj5b
MC05XXs0LDR9KSQnLA0KICAgICAgICAgICAgICAgICAncXVhcnRlcicgOiBy
J14oP1A8eWVhcj5bMC05XXs0LDR9KXEoP1A8cXVhcnRlcj5bMTIzNF0pJCcs
DQogICAgICAgICAgICAgICAgICdtb250aCcgOiByJ14oP1A8eWVhcj5bMC05
XXs0LDR9KS0oP1A8bW9udGg+W2EtekEtWl0rKSQnIH0NCiAgICAgICAgZm9y
IGVhY2ggaW4gdm9scmUua2V5cygpOg0KICAgICAgICAgICAgbWF0Y2g9cmUu
bWF0Y2godm9scmVbZWFjaF0sdm9sbmFtZSkNCiAgICAgICAgICAgIGlmIG1h
dGNoOg0KICAgICAgICAgICAgICAgIHllYXI9c3RyaW5nLmF0b2kobWF0Y2gu
Z3JvdXAoJ3llYXInKSkNCiAgICAgICAgICAgICAgICBtb250aD0xDQogICAg
ICAgICAgICAgICAgaWYgZWFjaCA9PSAncXVhcnRlcic6DQogICAgICAgICAg
ICAgICAgICAgIHE9c3RyaW5nLmF0b2kobWF0Y2guZ3JvdXAoJ3F1YXJ0ZXIn
KSkNCiAgICAgICAgICAgICAgICAgICAgbW9udGg9KHEqMyktMg0KICAgICAg
ICAgICAgICAgIGVsaWYgZWFjaCA9PSAnbW9udGgnOg0KICAgICAgICAgICAg
ICAgICAgICBtb250aHN0cj1zdHJpbmcubG93ZXIobWF0Y2guZ3JvdXAoJ21v
bnRoJykpDQogICAgICAgICAgICAgICAgICAgIG09W10NCiAgICAgICAgICAg
ICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwxMyk6DQogICAgICAgICAgICAg
ICAgICAgICAgICBtLmFwcGVuZChzdHJpbmcubG93ZXIoDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCIlQiIsKDE5
OTksaSwxLDAsMCwwLDAsMSwwKSkpKQ0KICAgICAgICAgICAgICAgICAgICB0
cnk6DQogICAgICAgICAgICAgICAgICAgICAgICBtb250aD1tLmluZGV4KG1v
bnRoc3RyKSsxDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVy
cm9yOg0KICAgICAgICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICAg
ICAgICAgIHJldHVybiB0aW1lLm1rdGltZSgoeWVhcixtb250aCwxLDAsMCww
LDAsMSwtMSkpDQogICAgICAgIHJldHVybiAwLjANCg0KICAgIGRlZiBzb3J0
YXJjaGl2ZXMoc2VsZik6DQogICAgICAgIGRlZiBzZihhLGIscz1zZWxmKToN
CiAgICAgICAgICAgIGFsPXMudm9sTmFtZVRvRGF0ZShhKQ0KICAgICAgICAg
ICAgYmw9cy52b2xOYW1lVG9EYXRlKGIpDQogICAgICAgICAgICBpZiBhbD5i
bDoNCiAgICAgICAgICAgICAgICByZXR1cm4gMQ0KICAgICAgICAgICAgZWxp
ZiBhbDxibDoNCiAgICAgICAgICAgICAgICByZXR1cm4gLTENCiAgICAgICAg
ICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIDANCiAgICAgICAg
aWYgc2VsZi5BUkNISVZFX1BFUklPRCBpbiAoJ21vbnRoJywneWVhcicsJ3F1
YXJ0ZXInKToNCiAgICAgICAgICAgIHNlbGYuYXJjaGl2ZXMuc29ydChzZikN
CiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuYXJjaGl2ZXMuc29y
dCgpDQoNCiAgICBkZWYgbWVzc2FnZShzZWxmLCBtc2cpOg0KCWlmIHNlbGYu
VkVSQk9TRToNCgkgICAgaW1wb3J0IHN5cw0KCSAgICBzeXMuc3RkZXJyLndy
aXRlKG1zZykNCgkgICAgaWYgbXNnWy0xOl0hPSdcbic6IHN5cy5zdGRlcnIu
d3JpdGUoJ1xuJykNCg0KICAgIGRlZiBvcGVuX25ld19hcmNoaXZlKHNlbGYs
IGFyY2hpdmUsIGFyY2hpdmVkaXIpOg0KCWltcG9ydCBvcw0KCWluZGV4X2h0
bWw9b3MucGF0aC5qb2luKGFyY2hpdmVkaXIsICdpbmRleC5odG1sJykgDQoJ
dHJ5OiBvcy51bmxpbmsoaW5kZXhfaHRtbCkNCglleGNlcHQ6IHBhc3MNCglv
cy5zeW1saW5rKHNlbGYuREVGQVVMVElOREVYKycuaHRtbCcsaW5kZXhfaHRt
bCkNCg0KICAgIGRlZiB3cml0ZV9pbmRleF9oZWFkZXIoc2VsZik6DQoJc2Vs
Zi5kZXB0aD0wDQogICAgICAgIHByaW50IHNlbGYuaHRtbF9oZWFkKCkNCg0K
ICAgICAgICBpZiBub3Qgc2VsZi5USFJFQURMQVpZIGFuZCBzZWxmLnR5cGU9
PSdUaHJlYWQnOg0KCSAgICAjIFVwZGF0ZSB0aGUgdGhyZWFkZWQgaW5kZXgN
CgkgICAgc2VsZi5tZXNzYWdlKCJDb21wdXRpbmcgdGhyZWFkZWQgaW5kZXhc
biIpDQoJICAgIHNlbGYudXBkYXRlVGhyZWFkZWRJbmRleCgpDQoNCg0KICAg
IGRlZiB3cml0ZV9pbmRleF9mb290ZXIoc2VsZik6DQoJaW1wb3J0IHN0cmlu
Zw0KCWZvciBpIGluIHJhbmdlKHNlbGYuZGVwdGgpOiBwcmludCAnPC9VTD4n
DQogICAgICAgIHByaW50IHNlbGYuaHRtbF9mb290KCkNCg0KICAgIGRlZiB3
cml0ZV9pbmRleF9lbnRyeShzZWxmLCBhcnRpY2xlKToNCglwcmludCAnPExJ
PiA8QSBIUkVGPSIlcyI+JXM8L0E+IDxBIE5BTUU9IiVpIj48L0E+PEk+JXM8
L0k+JyAlICh1cmxsaWIucXVvdGUoYXJ0aWNsZS5maWxlbmFtZSksIA0KCQkJ
CQkJCQkgICAgIENHSWVzY2FwZShhcnRpY2xlLnN1YmplY3QpLCBhcnRpY2xl
LnNlcXVlbmNlLCANCgkJCQkJCQkJICAgICBDR0llc2NhcGUoYXJ0aWNsZS5h
dXRob3IpKQ0KDQogICAgZGVmIHdyaXRlX3RocmVhZGluZGV4X2VudHJ5KHNl
bGYsIGFydGljbGUsIGRlcHRoKToNCglpZiBkZXB0aDwwOiANCgkgICAgc3lz
LnN0ZGVyci53cml0ZSgnZGVwdGg8MCcpIDsgZGVwdGg9MA0KCWlmIGRlcHRo
PnNlbGYuVEhSRUFETEVWRUxTOiBkZXB0aD1zZWxmLlRIUkVBRExFVkVMUw0K
CWlmIGRlcHRoPHNlbGYuZGVwdGg6IA0KCSAgICBmb3IgaSBpbiByYW5nZShz
ZWxmLmRlcHRoLWRlcHRoKTogcHJpbnQgJzwvVUw+Jw0KCWVsaWYgZGVwdGg+
c2VsZi5kZXB0aDogDQoJICAgIGZvciBpIGluIHJhbmdlKGRlcHRoLXNlbGYu
ZGVwdGgpOiBwcmludCAnPFVMPicNCglwcmludCAnPCEtLSVpICVzIC0tPicg
JSAoZGVwdGgsIGFydGljbGUudGhyZWFkS2V5KQ0KCXNlbGYuZGVwdGg9ZGVw
dGgNCglwcmludCAnPExJPiA8QSBIUkVGPSIlcyI+JXM8L0E+IDxBIE5BTUU9
IiVpIj48L0E+PEk+JXM8L0k+JyAlIChDR0llc2NhcGUodXJsbGliLnF1b3Rl
KGFydGljbGUuZmlsZW5hbWUpKSwNCgkJCQkJCQkJICAgICBDR0llc2NhcGUo
YXJ0aWNsZS5zdWJqZWN0KSwgYXJ0aWNsZS5zZXF1ZW5jZSs5MTAsIA0KCQkJ
CQkJCQkgICAgIENHSWVzY2FwZShhcnRpY2xlLmF1dGhvcikpDQoNCiAgICBk
ZWYgd3JpdGVfVE9DKHNlbGYpOg0KICAgICAgICBzZWxmLnNvcnRhcmNoaXZl
cygpDQogICAgICAgIHRvYz1vcGVuKG9zLnBhdGguam9pbihzZWxmLmJhc2Vk
aXIsICdpbmRleC5odG1sJyksICd3JykNCiAgICAgICAgdG9jLndyaXRlKHNl
bGYuaHRtbF9UT0MoKSkNCiAgICAgICAgdG9jLmNsb3NlKCkNCg0KDQogICAg
IyBBcmNoaXZlIGFuIEFydGljbGUgb2JqZWN0Lg0KICAgIGRlZiBhZGRfYXJ0
aWNsZShzZWxmLCBhcnRpY2xlKToNCiAgICAgICAgIyBEZXRlcm1pbmUgaW50
byB3aGF0IGFyY2hpdmVzIHRoZSBhcnRpY2xlIHNob3VsZCBiZSBwbGFjZWQN
CiAgICAgICAgYXJjaGl2ZXM9c2VsZi5nZXRfYXJjaGl2ZXMoYXJ0aWNsZSkN
CiAgICAgICAgaWYgYXJjaGl2ZXM9PU5vbmU6IGFyY2hpdmVzPVtdICAgICAg
ICAjIElmIG5vIHZhbHVlIHdhcyByZXR1cm5lZCwgaWdub3JlIGl0DQogICAg
ICAgIGlmIHR5cGUoYXJjaGl2ZXMpPT10eXBlKCcnKTogYXJjaGl2ZXM9W2Fy
Y2hpdmVzXSAgICAgICAgIyBJZiBhIHN0cmluZyB3YXMgcmV0dXJuZWQsIGNv
bnZlcnQgdG8gYSBsaXN0DQogICAgICAgIGlmIGFyY2hpdmVzPT1bXTogcmV0
dXJuICAgICAgICAgIyBJZ25vcmUgdGhlIGFydGljbGUNCg0KICAgICAgICAj
IEFkZCB0aGUgYXJ0aWNsZSB0byBlYWNoIGFyY2hpdmUgaW4gdHVybg0KICAg
ICAgICBhcnRpY2xlLmZpbGVuYW1lPWZpbGVuYW1lPXNlbGYuZ2V0X2ZpbGVu
YW1lKGFydGljbGUpDQogICAgICAgIGFydGljbGVfdGV4dD1hcnRpY2xlLmFz
X3RleHQoKQ0KICAgICAgICB0ZW1wPXNlbGYuZm9ybWF0X2FydGljbGUoYXJ0
aWNsZSkgIyBSZWZvcm1hdCB0aGUgYXJ0aWNsZQ0KICAgICAgICBzZWxmLm1l
c3NhZ2UoIlByb2Nlc3NpbmcgYXJ0aWNsZSAjIitzdHIoYXJ0aWNsZS5zZXF1
ZW5jZSkrJyBpbnRvIGFyY2hpdmVzICcrc3RyKGFyY2hpdmVzKSkNCiAgICAg
ICAgZm9yIGkgaW4gYXJjaGl2ZXM6DQogICAgICAgICAgICBzZWxmLmFyY2hp
dmU9aQ0KICAgICAgICAgICAgYXJjaGl2ZWRpcj1vcy5wYXRoLmpvaW4oc2Vs
Zi5iYXNlZGlyLCBpKQ0KICAgICAgICAgICAgIyBJZiBpdCdzIGEgbmV3IGFy
Y2hpdmUsIGNyZWF0ZSBpdA0KICAgICAgICAgICAgaWYgaSBub3QgaW4gc2Vs
Zi5hcmNoaXZlczogDQogICAgICAgICAgICAgICAgc2VsZi5hcmNoaXZlcy5h
cHBlbmQoaSkgOyBzZWxmLnVwZGF0ZV9UT0M9MQ0KICAgICAgICAgICAgICAg
IHNlbGYuZGF0YWJhc2UubmV3QXJjaGl2ZShpKQ0KICAgICAgICAgICAgICAg
ICMgSWYgdGhlIGFyY2hpdmUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGNy
ZWF0ZSBpdA0KICAgICAgICAgICAgICAgIHRyeTogb3Muc3RhdChhcmNoaXZl
ZGlyKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyZGF0
YToNCiAgICAgICAgICAgICAgICAgICAgZXJybm8sIGVycm1zZz1lcnJkYXRh
DQogICAgICAgICAgICAgICAgICAgIGlmIGVycm5vPT0yOiANCiAgICAgICAg
ICAgICAgICAgICAgICAgIG9zLm1rZGlyKGFyY2hpdmVkaXIsIHNlbGYuRElS
TU9ERSkNCiAgICAgICAgICAgICAgICAgICAgZWxzZTogcmFpc2Ugb3MuZXJy
b3IsIGVycmRhdGENCiAgICAgICAgICAgICAgICBzZWxmLm9wZW5fbmV3X2Fy
Y2hpdmUoaSwgYXJjaGl2ZWRpcikNCg0KICAgICAgICAgICAgIyBXcml0ZSB0
aGUgSFRNTC1pemVkIGFydGljbGUgdG8gdGhlIGh0bWwgYXJjaGl2ZS4NCiAg
ICAgICAgICAgIGY9b3Blbihvcy5wYXRoLmpvaW4oYXJjaGl2ZWRpciwgZmls
ZW5hbWUpLCAndycpDQogICAgICAgICAgICBvcy5jaG1vZChvcy5wYXRoLmpv
aW4oYXJjaGl2ZWRpciwgZmlsZW5hbWUpLCBzZWxmLkZJTEVNT0RFKQ0KICAg
ICAgICAgICAgZi53cml0ZSh0ZW1wLmFzX2h0bWwoKSkNCiAgICAgICAgICAg
IGYuY2xvc2UoKQ0KDQoNCiAgICAgICAgICAgICMgV3JpdGUgdGhlIHRleHQg
YXJ0aWNsZSB0byB0aGUgdGV4dCBhcmNoaXZlLg0KICAgICAgICAgICAgYXJj
aGl2ZXRleHRmaWxlPW9zLnBhdGguam9pbihzZWxmLmJhc2VkaXIsIiVzLnR4
dCIgJSBpKQ0KICAgICAgICAgICAgZj1vcGVuKGFyY2hpdmV0ZXh0ZmlsZSwg
J2ErJykNCiAgICAgICAgICAgIG9zLmNobW9kKGFyY2hpdmV0ZXh0ZmlsZSwg
c2VsZi5GSUxFTU9ERSkNCiAgICAgICAgICAgIGYud3JpdGUoYXJ0aWNsZV90
ZXh0KQ0KICAgICAgICAgICAgZi5jbG9zZSgpDQoNCg0KICAgICAgICAgICAg
YXV0aG9ya2V5PXBpcGVybWFpbC5maXhBdXRob3IoYXJ0aWNsZS5hdXRob3Ip
KydcMDAwJythcnRpY2xlLmRhdGUNCiAgICAgICAgICAgIHN1YmplY3RrZXk9
c3RyaW5nLmxvd2VyKGFydGljbGUuc3ViamVjdCkrJ1wwMDAnK2FydGljbGUu
ZGF0ZQ0KDQogICAgICAgICAgICAjIFVwZGF0ZSBwYXJlbnRpbmcgaW5mbw0K
ICAgICAgICAgICAgcGFyZW50SUQ9Tm9uZQ0KICAgICAgICAgICAgaWYgYXJ0
aWNsZS5pbl9yZXBseV90byE9Jyc6IHBhcmVudElEPWFydGljbGUuaW5fcmVw
bHlfdG8NCiAgICAgICAgICAgIGVsaWYgYXJ0aWNsZS5yZWZlcmVuY2VzIT1b
XTogDQogICAgICAgICAgICAgICAgIyBSZW1vdmUgYXJ0aWNsZSBJRHMgdGhh
dCBhcmVuJ3QgaW4gdGhlIGFyY2hpdmUNCiAgICAgICAgICAgICAgICByZWZz
PWZpbHRlcihsYW1iZGEgeCwgc2VsZj1zZWxmOiBzZWxmLmRhdGFiYXNlLmhh
c0FydGljbGUoc2VsZi5hcmNoaXZlLCB4KSwgDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYXJ0aWNsZS5yZWZlcmVuY2VzKQ0KICAgICAgICAgICAg
ICAgIGlmIGxlbihyZWZzKToNCiAgICAgICAgICAgICAgICAgICAgcmVmcz1t
YXAobGFtYmRhIHgsIHM9c2VsZjogcy5kYXRhYmFzZS5nZXRBcnRpY2xlKHMu
YXJjaGl2ZSwgeCksIHJlZnMpDQogICAgICAgICAgICAgICAgICAgIG1heGRh
dGU9cmVmc1swXQ0KICAgICAgICAgICAgICAgICAgICBmb3IgcmVmIGluIHJl
ZnNbMTpdOiANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlZi5kYXRl
Pm1heGRhdGUuZGF0ZTogbWF4ZGF0ZT1yZWYNCiAgICAgICAgICAgICAgICAg
ICAgcGFyZW50SUQ9bWF4ZGF0ZS5tc2dpZA0KICAgICAgICAgICAgZWxzZToN
CiAgICAgICAgICAgICAgICAjIEdldCB0aGUgb2xkZXN0IGFydGljbGUgd2l0
aCBhIG1hdGNoaW5nIHN1YmplY3QsIGFuZCBhc3N1bWUgdGhpcyBpcyANCiAg
ICAgICAgICAgICAgICAjIGEgZm9sbG93LXVwIHRvIHRoYXQgYXJ0aWNsZQ0K
ICAgICAgICAgICAgICAgIHBhcmVudElEPXNlbGYuZGF0YWJhc2UuZ2V0T2xk
ZXN0QXJ0aWNsZShzZWxmLmFyY2hpdmUsIGFydGljbGUuc3ViamVjdCkNCg0K
ICAgICAgICAgICAgaWYgcGFyZW50SUQhPU5vbmUgYW5kIG5vdCBzZWxmLmRh
dGFiYXNlLmhhc0FydGljbGUoc2VsZi5hcmNoaXZlLCBwYXJlbnRJRCk6IA0K
ICAgICAgICAgICAgICAgIHBhcmVudElEPU5vbmUNCiAgICAgICAgICAgIGFy
dGljbGUucGFyZW50SUQ9cGFyZW50SUQgDQogICAgICAgICAgICBpZiBwYXJl
bnRJRCE9Tm9uZToNCiAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi5kYXRh
YmFzZS5nZXRBcnRpY2xlKHNlbGYuYXJjaGl2ZSwgcGFyZW50SUQpDQogICAg
ICAgICAgICAgICAgYXJ0aWNsZS50aHJlYWRLZXk9cGFyZW50LnRocmVhZEtl
eSthcnRpY2xlLmRhdGUrJy0nDQogICAgICAgICAgICBlbHNlOiBhcnRpY2xl
LnRocmVhZEtleT1hcnRpY2xlLmRhdGUrJy0nDQogICAgICAgICAgICBzZWxm
LmRhdGFiYXNlLnNldFRocmVhZEtleShzZWxmLmFyY2hpdmUsIGFydGljbGUu
dGhyZWFkS2V5KydcMDAwJythcnRpY2xlLm1zZ2lkLCBhcnRpY2xlLm1zZ2lk
KQ0KICAgICAgICAgICAgc2VsZi5kYXRhYmFzZS5hZGRBcnRpY2xlKGksIHRl
bXAsIHN1YmplY3RrZXksIGF1dGhvcmtleSkNCiAgICAgICAgICAgIA0KICAg
ICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5fZGlydHlfYXJjaGl2ZXM6IA0K
ICAgICAgICAgICAgICAgIHNlbGYuX2RpcnR5X2FyY2hpdmVzLmFwcGVuZChp
KQ0KICAgICAgICBkZWwgdGVtcA0KDQoNCiAgICAjIFVwZGF0ZSBvbmx5IGFy
Y2hpdmVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyAiY2hhbmdlZCIuDQog
ICAgZGVmIHVwZGF0ZV9kaXJ0eV9hcmNoaXZlcyhzZWxmKToNCiAgICAgICAg
Zm9yIGkgaW4gc2VsZi5fZGlydHlfYXJjaGl2ZXM6DQogICAgICAgICAgICBz
ZWxmLnVwZGF0ZV9hcmNoaXZlKGkpDQogICAgICAgICAgICBhcmNoej1Ob25l
DQogICAgICAgICAgICBhcmNodD1Ob25lDQogICAgICAgICAgICB0cnk6DQog
ICAgICAgICAgICAgICAgaW1wb3J0IGd6aXANCiAgICAgICAgICAgICAgICB0
cnk6IA0KICAgICAgICAgICAgICAgICAgICBhcmNodD1vcGVuKG9zLnBhdGgu
am9pbihzZWxmLmJhc2VkaXIsIiVzLnR4dCIgJSBpKSwiciIpIA0KICAgICAg
ICAgICAgICAgICAgICB0cnk6IA0KICAgICAgICAgICAgICAgICAgICAgICAg
b3MucmVuYW1lKG9zLnBhdGguam9pbihzZWxmLmJhc2VkaXIsIiVzLnR4dC5n
eiIgJSBpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBh
dGguam9pbihzZWxmLmJhc2VkaXIsIiVzLm9sZC50eHQuZ3oiICUgaSkpDQog
ICAgICAgICAgICAgICAgICAgICAgICBhcmNoej1nemlwLm9wZW4ob3MucGF0
aC5qb2luKHNlbGYuYmFzZWRpciwiJXMub2xkLnR4dC5neiIgJSBpKSwiciIp
DQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgUnVudGlt
ZUVycm9yLCBvcy5lcnJvcik6DQogICAgICAgICAgICAgICAgICAgICAgICBw
YXNzDQogICAgICAgICAgICAgICAgICAgIG5ld3o9Z3ppcC5vcGVuKG9zLnBh
dGguam9pbihzZWxmLmJhc2VkaXIsIiVzLnR4dC5neiIgJSBpKSwidyIpIA0K
CQkgICAgaWYgYXJjaHogOg0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3
ei53cml0ZShhcmNoei5yZWFkKCkpDQogICAgICAgICAgICAgICAgICAgICAg
ICBhcmNoei5jbG9zZSgpDQogICAgICAgICAgICAgICAgICAgICAgICBvcy51
bmxpbmsob3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwiJXMub2xkLnR4dC5n
eiIgJSBpKSkNCiAgICAgICAgICAgICAgICAgICAgbmV3ei53cml0ZShhcmNo
dC5yZWFkKCkpDQogICAgICAgICAgICAgICAgICAgIG5ld3ouY2xvc2UoKQ0K
ICAgICAgICAgICAgICAgICAgICBhcmNodC5jbG9zZSgpDQogICAgICAgICAg
ICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oc2VsZi5iYXNlZGly
LCIlcy50eHQiICUgaSkpDQogICAgICAgICAgICAgICAgZXhjZXB0IElPRXJy
b3I6DQogICAgICAgICAgICAgICAgICAgIHBhc3MNCiAgICAgICAgICAgIGV4
Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAgICAgICAgICAgICBwYXNzDQogICAg
ICAgIHNlbGYuX2RpcnR5X2FyY2hpdmVzPVtdDQoNCiAgICBkZWYgY2xvc2Uo
c2VsZik6DQogICAgICAgICJDbG9zZSBhbiBhcmNoaXZlLCBzYXZpbmcgaXRz
IHN0YXRlIGFuZCB1cGRhdGluZyBhbnkgY2hhbmdlZCBhcmNoaXZlcy4iDQog
ICAgICAgIHNlbGYudXBkYXRlX2RpcnR5X2FyY2hpdmVzKCkjIFVwZGF0ZSBh
bGwgY2hhbmdlZCBhcmNoaXZlcw0KICAgICAgICAjIElmIHJlcXVpcmVkLCB1
cGRhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzDQogICAgICAgIGlmIHNlbGYu
dXBkYXRlX1RPQyBvciAxOg0KICAgICAgICAgICAgc2VsZi51cGRhdGVfVE9D
PTANCiAgICAgICAgICAgIHNlbGYud3JpdGVfVE9DKCkNCiAgICAgICAgIyBT
YXZlIHRoZSBjb2xsZWN0aXZlIHN0YXRlIA0KICAgICAgICBzZWxmLm1lc3Nh
Z2UoJ1BpY2tsaW5nIGFyY2hpdmUgc3RhdGUgaW50byAnK29zLnBhdGguam9p
bihzZWxmLmJhc2VkaXIsICdwaXBlcm1haWwucGNrJykpDQogICAgICAgIHNl
bGYuZGF0YWJhc2UuY2xvc2UoKQ0KICAgICAgICBkZWwgc2VsZi5kYXRhYmFz
ZQ0KICAgICAgICBmPW9wZW4ob3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwg
J3BpcGVybWFpbC5wY2snKSwgJ3cnKQ0KICAgICAgICBwaWNrbGUuZHVtcChz
ZWxmLl9fZ2V0c3RhdGVfXygpLCBmKQ0KICAgICAgICBmLmNsb3NlKCkNCg0K
ICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6DQogICAgICAgIGQ9e30NCiAg
ICAgICAgZm9yIGVhY2ggaW4gc2VsZi5fX2RpY3RfXy5rZXlzKCk6DQogICAg
ICAgICAgICBpZiBub3QgKGVhY2ggaW4gWydtYWlsbGlzdCcsJ19sb2NrX2Zp
bGUnLCdfdW5sb2NrbGlzdCddKToNCiAgICAgICAgICAgICAgICBkW2VhY2hd
ID0gc2VsZi5fX2RpY3RfX1tlYWNoXQ0KICAgICAgICByZXR1cm4gZA0KDQog
ICAgICAgIA0KIA0KDQogICAgIyBBZGQgPEEgSFJFRj0iLi4uIj4gdGFncyBh
cm91bmQgVVJMcyBhbmQgZS1tYWlsIGFkZHJlc3Nlcy4NCg0KICAgIGRlZiBf
X3Byb2Nlc3Nib2R5X1VSTHF1b3RlKHNlbGYsIHNvdXJjZSwgZGVzdCk6DQoJ
Ym9keTI9W10NCglsYXN0X2xpbmVfd2FzX3F1b3RlZD0wDQoJZm9yIGkgaW4g
eHJhbmdlKDAsIGxlbihzb3VyY2UpKToNCgkgICAgTG9yaWc9TD1zb3VyY2Vb
aV0gOyBwcmVmaXg9c3VmZml4PSIiDQoJICAgIGlmIEw9PU5vbmU6IGNvbnRp
bnVlDQoJICAgICMgSXRhbGljaXNlIHF1b3RlZCB0ZXh0DQoJICAgIGlmIHNl
bGYuSVFVT1RFUzoNCgkJcXVvdGVkPXF1b3RlZHBhdC5tYXRjaChMKQ0KCQlp
ZiBxdW90ZWQ9PU5vbmU6IGxhc3RfbGluZV93YXNfcXVvdGVkPTANCgkJZWxz
ZToNCgkJICAgIHF1b3RlZCA9IHF1b3RlZC5lbmQoMCkNCgkJICAgIHByZWZp
eD1DR0llc2NhcGUoTFs6cXVvdGVkXSkgKyAnPGk+JyANCgkJICAgIHN1ZmZp
eD0nPC9JPicNCgkJICAgIGlmIHNlbGYuU0hPV0hUTUw6IHN1ZmZpeD1zdWZm
aXgrJzxCUj4nDQoJCSAgICBpZiBub3QgbGFzdF9saW5lX3dhc19xdW90ZWQ6
IHByZWZpeD0nPEJSPicrcHJlZml4DQoJCSAgICBMPSBMW3F1b3RlZDpdIA0K
CQkgICAgbGFzdF9saW5lX3dhc19xdW90ZWQ9MQ0KCSAgICAjIENoZWNrIGZv
ciBhbiBlLW1haWwgYWRkcmVzcw0KCSAgICBMMj0iIiA7IGpyPWVtYWlscGF0
LnNlYXJjaChMKSA7IGtyPXVybHBhdC5zZWFyY2goTCkNCgkgICAgd2hpbGUg
anIhPU5vbmUgb3Iga3IhPU5vbmU6DQoJCWlmIGpyPT1Ob25lOiBqPS0xDQoJ
CWVsc2U6IGogPSBqci5zdGFydCgwKQ0KCQlpZiBrcj09Tm9uZTogaz0tMQ0K
CQllbHNlOiBrID0ga3Iuc3RhcnQoMCkNCgkJaWYgaiE9LTEgYW5kIChqPGsg
b3Igaz09LTEpOiB0ZXh0PWpyLmdyb3VwKDEpIDsgVVJMPSdtYWlsdG86Jyt0
ZXh0IDsgcG9zPWoNCgkJZWxpZiBrIT0tMSBhbmQgKGo+ayBvciBqPT0tMSk6
IHRleHQ9VVJMPWtyLmdyb3VwKDEpIDsgcG9zPWsNCgkJZWxzZTogIyBqPT1r
DQoJCSAgICByYWlzZSBWYWx1ZUVycm9yLCAiaj09azogVGhpcyBjYW4ndCBo
YXBwZW4hIg0KCQlsZW5ndGg9bGVuKHRleHQpDQojCQlzeXMuc3RkZXJyLndy
aXRlKCJVUkw6ICVzICVzICVzIFxuIiAlIChDR0llc2NhcGUoTFs6cG9zXSks
IFVSTCwgQ0dJZXNjYXBlKHRleHQpKSkNCgkJTDI9TDIrJyVzPEEgSFJFRj0i
JXMiPiVzPC9BPicgJSAoQ0dJZXNjYXBlKExbOnBvc10pLCBVUkwsIENHSWVz
Y2FwZSh0ZXh0KSkNCgkJTD1MW3BvcytsZW5ndGg6XQ0KCQlqcj1lbWFpbHBh
dC5zZWFyY2goTCkgOyBrcj11cmxwYXQuc2VhcmNoKEwpDQoJICAgIGlmIGpy
PT1Ob25lIGFuZCBrcj09Tm9uZTogTD1DR0llc2NhcGUoTCkNCgkgICAgTD1w
cmVmaXgrTDIrTCtzdWZmaXgNCgkgICAgaWYgTCE9TG9yaWc6IHNvdXJjZVtp
XSwgZGVzdFtpXT1Ob25lLCBMDQoNCiAgICAjIEVzY2FwZSBhbGwgc3BlY2lh
bCBjaGFyYWN0ZXJzDQogICAgZGVmIF9fcHJvY2Vzc2JvZHlfQ0dJZXNjYXBl
KHNlbGYsIHNvdXJjZSwgZGVzdCk6DQogICAgICAgIGltcG9ydCBjZ2kNCiAg
ICAgICAgZm9yIGkgaW4geHJhbmdlKDAsIGxlbihzb3VyY2UpKToNCgkgICAg
aWYgc291cmNlW2ldIT1Ob25lOiANCgkgICAgICAgIGRlc3RbaV09Y2dpLmVz
Y2FwZShzb3VyY2VbaV0pIDsgc291cmNlW2ldPU5vbmUNCgkJDQogICAgIyBQ
ZXJmb3JtIEh5cGVybWFpbC1zdHlsZSBwcm9jZXNzaW5nIG9mIDxIVE1MPjwv
SFRNTD4gZGlyZWN0aXZlcw0KICAgICMgaW4gbWVzc2FnZSBib2RpZXMuICBM
aW5lcyBiZXR3ZWVuIDxIVE1MPiBhbmQgPC9IVE1MPiB3aWxsIGJlIHdyaXR0
ZW4NCiAgICAjIG91dCBwcmVjaXNlbHkgYXMgdGhleSBhcmU7IG90aGVyIGxp
bmVzIHdpbGwgYmUgcGFzc2VkIHRvIGZ1bmMyDQogICAgIyBmb3IgZnVydGhl
ciBwcm9jZXNzaW5nIC4NCg0KICAgIGRlZiBfX3Byb2Nlc3Nib2R5X0hUTUwo
c2VsZiwgc291cmNlLCBkZXN0KToNCiAgICAgICAgbD1sZW4oc291cmNlKSA7
IGk9MA0KCXdoaWxlIGk8bDoNCgkgICAgd2hpbGUgaTxsIGFuZCBodG1scGF0
Lm1hdGNoKHNvdXJjZVtpXSk9PU5vbmU6IGk9aSsxDQoJICAgIGlmIGk8bDog
c291cmNlW2ldPU5vbmUgOyBpPWkrMQ0KCSAgICB3aGlsZSBpPGwgYW5kIG5v
aHRtbHBhdC5tYXRjaChzb3VyY2VbaV0pPT1Ob25lOg0KCSAgICAgICAgZGVz
dFtpXSwgc291cmNlW2ldID0gc291cmNlW2ldLCBOb25lDQoJICAgICAgICBp
PWkrMQ0KCSAgICBpZiBpPGw6IHNvdXJjZVtpXT1Ob25lIDsgaT1pKzENCgkg
ICAgDQogICAgZGVmIGZvcm1hdF9hcnRpY2xlKHNlbGYsIGFydGljbGUpOg0K
CXNvdXJjZT1hcnRpY2xlLmJvZHkgOyBkZXN0PVtOb25lXSpsZW4oc291cmNl
KQ0KCSMgSGFuZGxlIDxIVE1MPiA8L0hUTUw+IGRpcmVjdGl2ZXMNCglpZiBz
ZWxmLkFMTE9XSFRNTDogDQoJICAgIHNlbGYuX19wcm9jZXNzYm9keV9IVE1M
KHNvdXJjZSwgZGVzdCkNCglzZWxmLl9fcHJvY2Vzc2JvZHlfVVJMcXVvdGUo
c291cmNlLCBkZXN0KQ0KCWlmIG5vdCBzZWxmLlNIT1dIVE1MOiANCgkgICAg
IyBEbyBzaW1wbGUgZm9ybWF0dGluZyBoZXJlOiA8UFJFPi4uPC9QUkU+DQoJ
ICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzb3VyY2UpKToNCgkJcz1zb3Vy
Y2VbaV0NCgkJaWYgcz09Tm9uZTogY29udGludWUNCgkJZGVzdFtpXT1DR0ll
c2NhcGUocykgOyBzb3VyY2VbaV09Tm9uZQ0KCSAgICBpZiBsZW4oZGVzdCkg
PiAwOg0KCQlkZXN0WzBdPSc8UFJFPicrZGVzdFswXSA7IGRlc3RbLTFdPWRl
c3RbLTFdKyc8L1BSRT4nDQoJZWxzZToNCgkgICAgIyBEbyBmYW5jeSBmb3Jt
YXR0aW5nIGhlcmUNCgkgICAgaWYgc2VsZi5TSE9XQlI6DQoJCSMgQWRkIDxC
Uj4gb250byBldmVyeSBsaW5lDQoJCWZvciBpIGluIHJhbmdlKDAsIGxlbihz
b3VyY2UpKToNCgkJICAgIHM9c291cmNlW2ldDQoJCSAgICBpZiBzPT1Ob25l
OiBjb250aW51ZQ0KCQkgICAgcz1DR0llc2NhcGUocykgKyc8QlI+Jw0KCQkg
ICAgZGVzdFtpXT1zIDsgc291cmNlW2ldPU5vbmUNCgkgICAgZWxzZToNCgkJ
Zm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHNvdXJjZSkpOg0KCQkgICAgcz1zb3Vy
Y2VbaV0NCgkJICAgIGlmIHM9PU5vbmU6IGNvbnRpbnVlDQoJCSAgICBzPUNH
SWVzY2FwZShzKQ0KCQkgICAgaWYgc1swOjFdIGluICcgXHRcbic6IHM9JzxQ
Picrcw0KCQkgICAgZGVzdFtpXT1zIDsgc291cmNlW2ldPU5vbmUNCiAgICAg
ICAgYXJ0aWNsZS5ib2R5PWZpbHRlcihsYW1iZGEgeDogeCE9Tm9uZSwgZGVz
dCkNCglyZXR1cm4gYXJ0aWNsZQ0KDQogICAgZGVmIHVwZGF0ZV9hcnRpY2xl
KHNlbGYsIGFyY2RpciwgYXJ0aWNsZSwgcHJldiwgbmV4dCk6DQoJaW1wb3J0
IG9zDQoJc2VsZi5tZXNzYWdlKCdVcGRhdGluZyBIVE1MIGZvciBhcnRpY2xl
ICcrc3RyKGFydGljbGUuc2VxdWVuY2UpKQ0KCXRyeToNCgkgICAgZj1vcGVu
KG9zLnBhdGguam9pbihhcmNkaXIsIGFydGljbGUuZmlsZW5hbWUpLCAncicp
DQogICAgICAgICAgICBhcnRpY2xlLmxvYWRib2R5X2Zyb21IVE1MKGYpDQoJ
ICAgIGYuY2xvc2UoKQ0KICAgICAgICBleGNlcHQgSU9FcnJvcjoNCiAgICAg
ICAgICAgIHNlbGYubWVzc2FnZSgiYXJ0aWNsZSBmaWxlICVzIGlzIG1pc3Np
bmchIiAlIG9zLnBhdGguam9pbihhcmNkaXIsIGFydGljbGUuZmlsZW5hbWUp
KSANCiAgICAgICAgYXJ0aWNsZS5wcmV2PXByZXYNCiAgICAgICAgYXJ0aWNs
ZS5uZXh0PW5leHQNCglmPW9wZW4ob3MucGF0aC5qb2luKGFyY2RpciwgYXJ0
aWNsZS5maWxlbmFtZSksICd3JykNCglmLndyaXRlKGFydGljbGUuYXNfaHRt
bCgpKQ0KCWYuY2xvc2UoKQ0K
---1395546950-237318664-904200538=:1550--