# adi_article_tab v0.4 # Enhanced article tab # Adi Gilbert # http://www.greatoceanmedia.com.au/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMjp7czo0OiJuYW1lIjtzOjE1OiJhZGlfYXJ0aWNsZV90YWIiO3M6NzoidmVyc2lvbiI7 czozOiIwLjQiO3M6NjoiYXV0aG9yIjtzOjExOiJBZGkgR2lsYmVydCI7czoxMDoiYXV0aG9y X3VyaSI7czozNDoiaHR0cDovL3d3dy5ncmVhdG9jZWFubWVkaWEuY29tLmF1LyI7czoxMToi ZGVzY3JpcHRpb24iO3M6MjA6IkVuaGFuY2VkIGFydGljbGUgdGFiIjtzOjQ6InR5cGUiO2k6 MztzOjU6ImZsYWdzIjtpOjM7czo4OiJ0ZXh0cGFjayI7czo2MjI6IiNAb3duZXIgZ29tZWRp YQojQGxhbmd1YWdlIGVuLCBlbi1nYiwgZW4tdXMKI0BhZG1pbi1zaWRlCmFkaV9hZG1pbl9w cml2cyA9PiBBZG1pbiBwcml2aWxlZ2VzOgphZGlfaW5zdGFsbF9mYWlsID0+IFVuYWJsZSB0 byBpbnN0YWxsCmFkaV9pbnN0YWxsZWQgPT4gSW5zdGFsbGVkCmFkaV9ub3RfaW5zdGFsbGVk ID0+IE5vdCBpbnN0YWxsZWQKYWRpX3BsdWdpbl9wcml2cyA9PiBQbHVnaW4gcHJpdmlsZWdl czoKYWRpX3RleHRwYWNrX2ZhaWwgPT4gVGV4dHBhY2sgaW5zdGFsbGF0aW9uIGZhaWxlZAph ZGlfdGV4dHBhY2tfZmVlZGJhY2sgPT4gVGV4dHBhY2sgZmVlZGJhY2sKYWRpX3RleHRwYWNr X29ubGluZSA9PiBUZXh0cGFjayBhbHNvIGF2YWlsYWJsZSBvbmxpbmUKYWRpX3VuaW5zdGFs bCA9PiBVbmluc3RhbGwKYWRpX3VuaW5zdGFsbF9mYWlsID0+IFVuYWJsZSB0byB1bmluc3Rh bGwKYWRpX3VuaW5zdGFsbGVkID0+IFVuaW5zdGFsbGVkCmFkaV91cGRhdGVfcHJlZnMgPT4g VXBkYXRlIHByZWZlcmVuY2VzCmFkaV91cGdyYWRlX2ZhaWwgPT4gVW5hYmxlIHRvIHVwZ3Jh ZGUKYWRpX3VwZ3JhZGVfcmVxdWlyZWQgPT4gVXBncmFkZSByZXF1aXJlZAphZGlfdXBncmFk ZWQgPT4gVXBncmFkZWQiO3M6NDoiaGVscCI7czoxNjMyOiJoMS4gKmFkaV9hcnRpY2xlX3Rh YiogLSBFbmhhbmNlZCBhcnRpY2xlIHRhYgoKVGhpcyBwbHVnaW4gZW5oYW5jZXMgdGhlIHN0 YW5kYXJkIFRYUCBBcnRpY2xlIEVkaXQgdGFiOgoKKiAtYXJ0aWNsZSBJRC0gX25vdyBzdGFu ZGFyZCBpbiBUWFAgNC43K18KKiBhcnRpY2xlIGRlbGV0ZSBidXR0b24KCmgyLiAqVXNhZ2Uq CgpJbnN0YWxsICYgYWN0aXZhdGUgdGhlIHBsdWdpbiwgdGhlbiBmaW5kIGFuIGFydGljbGUg dG8gZWRpdC4gIFlvdSdsbCBmaW5kIHRoZSBhcnRpY2xlIGRlbGV0ZSBidXR0b24gbmVhciB0 aGUgdXN1YWwgTmV3IEFydGljbGUvRHVwbGljYXRlL1ZpZXcgYnV0dG9ucy4KCmgyLiAqUHJp dmlsZWdlcyoKCllvdSBjYW4gYWRqdXN0IHdobyBnZXRzIHRvIHVzZSB0aGUgcGx1Z2luIGJ5 IHNldHRpbmcgdGhlIHByaXZpbGVnZXMgaW4gcGx1Z2luIG9wdGlvbnMuCgpPbmx5IHVzZXJz IHdpdGggc3VmZmljaWVudCAiYXJ0aWNsZSBkZWxldGUiIHByaXZpbGVnZXMgd2lsbCBnZXQg dGhlIGRlbGV0ZSBidXR0b24uCgpoMi4gKlRleHRwYWNrKgoKVG8gaW5zdGFsbCB0aGUgVGV4 dHBhY2ssIGdvIHRvIHRoZSBwbHVnaW4ncyBPcHRpb25zIHRhYiBhbmQgY2xpY2sgb24gJ0lu c3RhbGwgdGV4dHBhY2snLiAgVGhpcyB3aWxsIGNvcHkgJiBpbnN0YWxsIGl0IGZyb20gYSBy ZW1vdGUgc2VydmVyLiBUaGUgbnVtYmVyIG9mIGxhbmd1YWdlIHN0cmluZ3MgaW5zdGFsbGVk IGZvciB5b3VyIGxhbmd1YWdlIHdpbGwgYmUgZGlzcGxheWVkLgoKSWYgdGhlIFRleHRwYWNr IGluc3RhbGxhdGlvbiBmYWlscyAocG9zc2libHkgZHVlIHRvIGFuIGVycm9yIGFjY2Vzc2lu ZyB0aGUgcmVtb3RlIHNpdGUpLCB0aGUgYWx0ZXJuYXRpdmUgaXMgdG8gY2xpY2sgdGhlICJU ZXh0cGFjayBhbHNvIGF2YWlsYWJsZSBvbmxpbmUiOmh0dHA6Ly93d3cuZ3JlYXRvY2Vhbm1l ZGlhLmNvbS5hdS90ZXh0cGFjayBsaW5rLiAgVGhpcyB3aWxsIHRha2UgeW91IHRvIGEgd2Vi c2l0ZSB3aGVyZSB0aGUgVGV4dHBhY2sgY2FuIGJlIG1hbnVhbGx5IGNvcGllZCAmIHBhc3Rl ZCBpbnRvIHRoZSBfVFhQIEFkbWluIC0gTGFuZ3VhZ2VfIHRhYi4KCkFkZGl0aW9ucyBhbmQg Y29ycmVjdGlvbnMgdG8gdGhlIFRleHRwYWNrIGFyZSB3ZWxjb21lIC0gcGxlYXNlIHVzZSB0 aGUgIlRleHRwYWNrIGZlZWRiYWNrIjpodHRwOi8vd3d3LmdyZWF0b2NlYW5tZWRpYS5jb20u YXUvdGV4dHBhY2svP3BsdWdpbj1hZGlfYXJ0aWNsZV90YWIgZm9ybS4KCmgyKGFkaV9leHRy YXMpLiAqQWRkaXRpb25hbCBpbmZvcm1hdGlvbioKCnAoYWRpX2V4dHJhcykuIFN1cHBvcnQg YW5kIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlICJUZXh0 cGF0dGVybiBzdXBwb3J0IGZvcnVtIjpodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3Zp ZXd0b3BpYy5waHA/aWQ9NDYyMTEuIEEgY29weSBvZiB0aGlzIGhlbHAgaXMgYWxzbyBhdmFp bGFibGUgIm9ubGluZSI6aHR0cDovL3d3dy5ncmVhdG9jZWFubWVkaWEuY29tLmF1L3R4cC8/ cGx1Z2luPWFkaV9hcnRpY2xlX3RhYi4gIE1vcmUgYWRpX3BsdWdpbnMgY2FuIGJlIGZvdW5k ICJoZXJlIjpodHRwOi8vd3d3LmdyZWF0b2NlYW5tZWRpYS5jb20uYXUvdHhwLy4iO3M6NDoi Y29kZSI7czoxMzc3MzoiCi8qCglhZGlfYXJ0aWNsZV90YWIgLSBFbmhhbmNlZCBhcnRpY2xl IHRhYgoKCVdyaXR0ZW4gYnkgQWRpIEdpbGJlcnQKCglSZWxlYXNlZCB1bmRlciB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKCglWZXJzaW9uIGhpc3Rvcnk6CgkwLjQJCS0gVFhQ IDQuNysgb25seQoJCQktIHJlbW92ZWQ6IGFydGljbGUgSUQgZGlzcGxheSAobm93IGRvbmUg YnkgVFhQKQoJMC4zCQktIHJlZml4ZXMgZm9yIFRYUCA0LjYKCTAuMgkJLSBmaXhlcyBmb3Ig VFhQIDQuNgoJMC4xCQktIGluaXRpYWwgcmVsZWFzZQoKKi8KCi8vPz8/IENPREUKCmlmIChA dHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsKCWdsb2JhbCAkcHJlZnMsICRhZGlfYXJ0aWNs ZV90YWJfZGVidWc7CgoJJGFkaV9hcnRpY2xlX3RhYl9kZWJ1ZyA9IDA7CgoJaWYgKCF2ZXJz aW9uX2NvbXBhcmUodHhwX3ZlcnNpb24sICc0LjcnLCAnPj0nKSkgcmV0dXJuOwoKCWFkaV9h cnRpY2xlX3RhYl9pbml0KCk7Cn0KCmZ1bmN0aW9uIGFkaV9hcnRpY2xlX3RhYl9pbml0KCkg ewovLyBpbml0aWFsIHNldCB1cAoJZ2xvYmFsICRwcmVmcywgJGV2ZW50LCAkc3RlcCwgJHRl eHRhcnJheSwgJGFkaV9hcnRpY2xlX3RhYl90YWJfbGlzdCwgJGFkaV9hcnRpY2xlX3RhYl9w cmVmcywgJGFkaV9hcnRpY2xlX3RhYl9vdXRsYXdzLCAkYWRpX2FydGljbGVfdGFiX2RlYnVn LCAkYWRpX2FydGljbGVfdGFiX3BsdWdpbl9zdGF0dXMsICRhZGlfYXJ0aWNsZV90YWJfdXJs OwoKCS8vIGRlZmF1bHQgcHJlZmVyZW5jZXMKCSRhZGlfYXJ0aWNsZV90YWJfcHJlZnMgPSBh cnJheSgKCQknYWRpX2FydGljbGVfdGFiX3ByaXZzJyA9PiBhcnJheSgndmFsdWUnID0+ICcx LDIsMyw0LDUsNicsICdibGFuaycgPT4gMSwgJ3ByaXZhdGUnID0+IDAsICdpbnB1dCcgPT4g J2N1c3RvbScsICdsYWJlbCcgPT4gJ2FkaV9wbHVnaW5fcHJpdnMnLCAndGFiJyA9PiAnb3B0 aW9ucycpLCAvLyBhbGxvd2VkIHRvIHVzZSBwbHVnaW4KCSk7CgoJLy8gcGx1Z2luIHByaXZz IHRvIGJlIGV4Y2x1ZGVkCgkkYWRpX2FydGljbGVfdGFiX291dGxhd3MgPSBhcnJheSgwKTsK CgkvLyBUZXh0cGFjawoJJGFkaV9hcnRpY2xlX3RhYl91cmwgPSBhcnJheSgKCQkndGV4dHBh Y2snID0+ICdodHRwOi8vd3d3LmdyZWF0b2NlYW5tZWRpYS5jb20uYXUvZmlsZXMvYWRpX3Rl eHRwYWNrLnR4dCcsCgkJJ3RleHRwYWNrX2Rvd25sb2FkJyA9PiAnaHR0cDovL3d3dy5ncmVh dG9jZWFubWVkaWEuY29tLmF1L3RleHRwYWNrL2Rvd25sb2FkJywKCQkndGV4dHBhY2tfZmVl ZGJhY2snID0+ICdodHRwOi8vd3d3LmdyZWF0b2NlYW5tZWRpYS5jb20uYXUvdGV4dHBhY2sv P3BsdWdpbj1hZGlfYXJ0aWNsZV90YWInLAoJKTsKCWlmIChzdHJwb3MoJHByZWZzWydwbHVn aW5fY2FjaGVfZGlyJ10sICdhZGknKSAhPT0gRkFMU0UpIC8vIHVzZSBBZGkncyBsb2NhbCB2 ZXJzaW9uCgkJJGFkaV9hcnRpY2xlX3RhYl91cmxbJ3RleHRwYWNrJ10gPSAkcHJlZnNbJ3Bs dWdpbl9jYWNoZV9kaXInXS4nL2FkaV90ZXh0cGFjay50eHQnOwoKCS8vIGdldCBob2xkIG9m IGxhbmd1YWdlIHN0cmluZ3MgaGlkZGVuIGJlaGluZCBldmVudCB3YWxsCglpZiAoaW5fYXJy YXkoJGV2ZW50LCBhcnJheSgncGx1Z2luX3ByZWZzLmFkaV9hcnRpY2xlX3RhYicsICdhZGlf YXJ0aWNsZV90YWJfb3B0aW9ucycpKSkKCQlhZGlfYXJ0aWNsZV90YWJfbG9hZF9sYW5nKCdp bnN0YWxsX3RleHRwYWNrLCBlZGl0X3ByZWZlcmVuY2VzLCBwdWJsaXNoZXIsIG1hbmFnaW5n X2VkaXRvciwgY29weV9lZGl0b3IsIHN0YWZmX3dyaXRlciwgZnJlZWxhbmNlciwgZGVzaWdu ZXInKTsKCgkkdmlldyA9IGdwcygndmlldycpOyAvLyB2YWx1ZXM6IGJsYW5rIG9yICJ0ZXh0 IiAobm9ybWFsIGVkaXQgdmlldyksICJodG1sIiwgInByZXZpZXciCglpZiAoKCR2aWV3ID09 ICd0ZXh0JykgfHwgKCR2aWV3ID09ICcnKSkgeyAvLyBkb24ndCB3YW50IGFueXRoaW5nIGlu IEhUTUwgb3IgUHJldmlldyB2aWV3cyAocHJlIDQuOCkKCQkvLyBhZGlfYXJ0aWNsZV90YWIg cHJpdnMgJiBjYWxsYmFja3MKCQlhZGRfcHJpdnMoJ2FkaV9hcnRpY2xlX3RhYicsIGFkaV9h cnRpY2xlX3RhYl9wcmVmKCdhZGlfYXJ0aWNsZV90YWJfcHJpdnMnKSk7CgkJaWYgKGhhc19w cml2cygnYWRpX2FydGljbGVfdGFiJykpIHsKCQkJaWYgKCRldmVudCA9PSAnYXJ0aWNsZScp CgkJCQlyZWdpc3Rlcl9jYWxsYmFjaygnYWRpX2FydGljbGVfdGFiX2RlbGV0ZV9mb3JtJywg J2FkbWluX3NpZGUnLCAnYm9keV9lbmQnKTsgLy8gaGlkZSBmb3JtIGluIGZvb3RlcgoJCX0K CQkvLyBzY3JpcHQKCQlpZiAoJGV2ZW50ID09ICdhcnRpY2xlJykKCQkJcmVnaXN0ZXJfY2Fs bGJhY2soJ2FkaV9hcnRpY2xlX3RhYl9zY3JpcHQnLCAnYWRtaW5fc2lkZScsICdoZWFkX2Vu ZCcpOwoJfQoKCS8vIHBsdWdpbiBvcHRpb25zCgkkYWRpX2FydGljbGVfdGFiX3BsdWdpbl9z dGF0dXMgPSBmZXRjaCgnc3RhdHVzJywgJ3R4cF9wbHVnaW4nLCAnbmFtZScsICdhZGlfYXJ0 aWNsZV90YWInKTsKCWlmICgkYWRpX2FydGljbGVfdGFiX3BsdWdpbl9zdGF0dXMpIHsgLy8g cHJvcGVyIGluc3RhbGwgLSBvcHRpb25zIHVuZGVyIFBsdWdpbnMgdGFiCgkJYWRkX3ByaXZz KCdwbHVnaW5fcHJlZnMuYWRpX2FydGljbGVfdGFiJyk7IC8vIGRlZmF1bHRzIHRvIHByaXYg JzEnIG9ubHkKCQlyZWdpc3Rlcl9jYWxsYmFjaygnYWRpX2FydGljbGVfdGFiX29wdGlvbnMn LCAncGx1Z2luX3ByZWZzLmFkaV9hcnRpY2xlX3RhYicpOwoJfQoJZWxzZSB7IC8vIHR4cGRl diAtIG9wdGlvbnMgdW5kZXIgRXh0ZW5zaW9ucyB0YWIKCQlhZGRfcHJpdnMoJ2FkaV9hcnRp Y2xlX3RhYl9vcHRpb25zJyk7IC8vIGRlZmF1bHRzIHRvIHByaXYgJzEnIG9ubHkKCQlyZWdp c3Rlcl90YWIoJ2V4dGVuc2lvbnMnLCAnYWRpX2FydGljbGVfdGFiX29wdGlvbnMnLCAnYWRp X2FydGljbGVfdGFiIG9wdGlvbnMnKTsKCQlyZWdpc3Rlcl9jYWxsYmFjaygnYWRpX2FydGlj bGVfdGFiX29wdGlvbnMnLCAnYWRpX2FydGljbGVfdGFiX29wdGlvbnMnKTsKCX0KfQoKZnVu Y3Rpb24gYWRpX2FydGljbGVfdGFiX2xvYWRfbGFuZygkcmVxdWlyZWRfbGlzdCkgewovLyBs b2FkIHN1cHBsaWVkIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdzIGZyb20gdHhwX2xhbmcgKGZv ciBsYXRlciB1c2UgaW4gZ1R4dCgpKQoJZ2xvYmFsICRwcmVmcywgJGFkaV9hcnRpY2xlX3Rh Yl9kZWJ1ZywgJGxhbmdfdWk7CgoJJGV4dHJhX2xhbmcgPSBhcnJheSgpOwoKCSRyZXF1aXJl ZCA9IGRvX2xpc3QoJHJlcXVpcmVkX2xpc3QpOyAvLyBjb252ZXJ0IGNvbW1hLXNlcGFyYXRl ZCBsaXN0IHRvIHRyaW1tZWQgYXJyYXkKCglpZiAoJGFkaV9hcnRpY2xlX3RhYl9kZWJ1Zykg ewoJCWVjaG8gX19GVU5DVElPTl9fLicoKTonLmJyOwoJCWVjaG8gJyRsYW5nX3VpPScuJGxh bmdfdWkuYnI7CgkJZWNobyAiUkVRVUlSRUQgTElTVDogJHJlcXVpcmVkX2xpc3QiLmJyOwoJ fQoKCWlmIChpc3NldCgkbGFuZ191aSkpIHsKCQkkd2hlcmUgPSAibGFuZyA9ICciLmRvU2xh c2goJGxhbmdfdWkpLiInIEFORCBuYW1lICE9ICcnIEFORCAobmFtZSBJTiAoIi5pbXBsb2Rl KCcsJywgcXVvdGVfbGlzdCgkcmVxdWlyZWQpKS4iKSkiOwoJCSRycyA9IHNhZmVfcm93c19z dGFydCgnbmFtZSwgZGF0YScsICd0eHBfbGFuZycsICR3aGVyZSk7CgkJaWYgKCFlbXB0eSgk cnMpKQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpCgkJCQkkZXh0cmFfbGFuZ1skYVsn bmFtZSddXSA9ICRhWydkYXRhJ107CgoJCS8vIGZlZWQgZXh0cmEgc3RyaW5ncyBpbnRvIHN5 c3RlbQoJCVR4cDo6Z2V0KCdcVGV4dHBhdHRlcm5cTDEwblxMYW5nJyktPnNldFBhY2soJGV4 dHJhX2xhbmcsIFRSVUUpOwoJfQoJZWxzZQoJCWlmICgkYWRpX2FydGljbGVfdGFiX2RlYnVn KQoJCQllY2hvICckbGFuZ191aSBOT1QgU0VUJy5icjsKCglpZiAoJGFkaV9hcnRpY2xlX3Rh Yl9kZWJ1ZykgewoJCWVjaG8gJ0VYVFJBIExBTkc6JzsKCQlkbXAoJGV4dHJhX2xhbmcpOwoJ fQp9CgpmdW5jdGlvbiBhZGlfYXJ0aWNsZV90YWJfc2NyaXB0KCkgewovLyBzY3JpcHRpc20K Ly8gLSBkZWxldGUgYnV0dG9uIHJlbmRlciBmYWlscyBpZiB1c2VyIGRvZXNuJ3QgaGF2ZSBw cml2cyBmb3IgYXJ0aWNsZSAoaS5lLiB0aGVyZSdzIG5vIHAudHhwLXNhdmUgdG8gaGFuZyBv ZmYpCglnbG9iYWwgJGFkaV9hcnRpY2xlX3RhYl9kZWJ1ZzsKCgkkZGVsZXRlX2xpbmsgPSAn PGEgaHJlZj0iIyIgaWQ9ImFkaV9hcnRpY2xlX3RhYl9kZWxldGVfbGluayIgdGl0bGU9Iicu Z1R4dCgnZGVsZXRlJykuJyIgY2xhc3M9ImRlc3Ryb3kiPjxzcGFuIGNsYXNzPSJ1aS1pY29u IHVpLWljb24tY2xvc2UiPjwvc3Bhbj4gJy5nVHh0KCdkZWxldGUnKS4nPC9hPic7CgoJJGRl YnVnX2NvZGUxID0gJGRlYnVnX2NvZGUyID0gJyc7CglpZiAoJGFkaV9hcnRpY2xlX3RhYl9k ZWJ1ZykgewoJCSRkZWJ1Z19jb2RlMSA9ICJjb25zb2xlLmxvZygnYWRpX2FydGljbGVfdGFi OiBpbml0aWFsIHRhYiB2aXNpdCwgYXJ0aWNsZV9pZD0nK2FydGljbGVfaWQpIjsKCQkkZGVi dWdfY29kZTEgPSAiY29uc29sZS5sb2coJ2FkaV9hcnRpY2xlX3RhYjogYWpheHkgYXJ0aWNs ZSBzYXZlL2R1cGxpY2F0ZSByZXBhaXJzLCBhcnRpY2xlX2lkPScrYXJ0aWNsZV9pZCkiOwoJ fQoKCWVjaG8gPDw8RU5EX1NDUklQVAo8c2NyaXB0PgoJJChmdW5jdGlvbigpIHsKCQkvLyBh ZGlfYXJ0aWNsZV90YWIKCQkvLyBpbml0aWFsIHRhYiB2aXNpdAoJCWFydGljbGVfaWQgPSAk KCdmb3JtI2FydGljbGVfZm9ybSBpbnB1dFtuYW1lPSJJRCJdJykudmFsKCk7IC8vIGN1cnJl bnQgYXJ0aWNsZSBpZCwgemVybyBpZiBuZXcgYXJ0aWNsZQoJCS8vIGFkZCBkZWxldGUgYnV0 dG9uIChleGlzdGluZyBhcnRpY2xlIG9ubHkpCgkJaWYgKGFydGljbGVfaWQgIT0gMCkKCQkJ JCgncC50eHAtc2F2ZSArIHAudHhwLWFjdGlvbnMnKS5hcHBlbmQoJyRkZWxldGVfbGluaycp OwogCQkvLyBkZWxldGUgbGluayBjbGljayAtPiBmb3JtIHN1Ym1pdAoJCSQoJyNhZGlfYXJ0 aWNsZV90YWJfZGVsZXRlX2xpbmsnKS5jbGljayhmdW5jdGlvbigpIHsKCQkJJCgnZm9ybSNh ZGlfYXJ0aWNsZV90YWJfZGVsZXRlX2Zvcm0nKS5zdWJtaXQoKTsKCQl9KTsKCQkkZGVidWdf Y29kZTEKCQkvLyBhamF4eSBhcnRpY2xlIHNhdmUvZHVwbGljYXRlIHJlcGFpcnMKCQl0ZXh0 cGF0dGVybi5SZWxheS5yZWdpc3RlcigndHhwQXN5bmNGb3JtLnN1Y2Nlc3MnLCBmdW5jdGlv bigpIHsKCQkJLy8gZ2V0IGp1c3Qtc2F2ZWQgb3IganVzdC1kdXBsaWNhdGVkIGFydGljbGUg aWQgKGZyb20gcGFnZSBtYXJrdXApCgkJCWFydGljbGVfaWQgPSAkKCdmb3JtI2FydGljbGVf Zm9ybSBpbnB1dFtuYW1lPSJJRCJdJykudmFsKCk7CgkJCS8vIHR3ZWFrIGhpZGRlbiBmb3Jt IHdpdGggbmV3IGFydGljbGUgaWQKCQkJJCgnZm9ybSNhZGlfYXJ0aWNsZV90YWJfZGVsZXRl X2Zvcm0gaW5wdXRbbmFtZT0ic2VsZWN0ZWRbMF0iXScpLnZhbChhcnRpY2xlX2lkKTsKCQkJ Ly8gcmVjcmVhdGUgZGVsZXRlIGJ1dHRvbgoJCQkkKCdwLnR4cC1zYXZlICsgcC50eHAtYWN0 aW9ucycpLmFwcGVuZCgnJGRlbGV0ZV9saW5rJyk7CgkJCS8vIHJlZG8gZGVsZXRlIGxpbmsg Y2xpY2sgLT4gZm9ybSBzdWJtaXQKCQkJJCgnI2FkaV9hcnRpY2xlX3RhYl9kZWxldGVfbGlu aycpLmNsaWNrKGZ1bmN0aW9uKCkgewoJCQkJJCgnZm9ybSNhZGlfYXJ0aWNsZV90YWJfZGVs ZXRlX2Zvcm0nKS5zdWJtaXQoKTsKCQkJfSk7CgkJCSRkZWJ1Z19jb2RlMgoJCX0pOwoJfSk7 Cjwvc2NyaXB0PgpFTkRfU0NSSVBUOwp9CgpmdW5jdGlvbiBhZGlfYXJ0aWNsZV90YWJfZGVs ZXRlX2Zvcm0oKSB7Ci8vIGdlbmVyYXRlIGEgaGlkZGVuIGZvcm0gdG8gc2l0IGluIGZvb3Rl ciAoY2FuJ3QgaGF2ZSBpdCBpbnNpZGUgYXJ0aWNsZSB0YWIncyA8Zm9ybT4pIHRvIGJlIGpR dWVyeS1hY3Rpb25lZCB3aGVuIGRlbGV0ZSBidXR0b24gY2xpY2tlZAovLyAtIHVzaW5nIGVj aG8gdG8gYXZvaWQgY2hhbm5lbGxpbmcgJGRlZmF1bHQsIHdoaWNoIHdpbGwgaW50ZXJmZXJl IHdpdGggYnkgb3RoZXIgcGx1Z2lucyBmb290ZXIgZmlkZGxpbmcKLy8gLSBuZWVkIHRvIHVz ZSBmb3JtIGNveiBsaXN0IGFkbWluIGV4cGVjdHMgaW5zdHJ1Y3Rpb25zIHRvIGJlIFBPU1Rl ZAovLyAtIGFydGljbGUgSUQgdGFrZW4gZnJvbSBVUkwgdmFyIG9uIGluaXRpYWwgdmlzaXQK Ly8gLSBmb3JtIHN0aWxsIGdlbmVyYXRlZCBpbiBuZXcgYXJ0aWNsZSB0YWIgd2l0aCBJRD0w IChpZCBqUXVlcnktdXBkYXRlZCBmcm9tIGhpZGRlbiBmb3JtIGlucHV0IFtmb3JtI2FydGlj bGVfZm9ybSBpbnB1dCBuYW1lPSJJRCJdIHdoZW4gbmV3IGFydGljbGUgcHVibGlzaGVkKQov LyAtIGRlbGV0ZSBidXR0b24gZXhpc3RlbmNlIChnZW5lcmF0ZWQgaW4galF1ZXJ5KSBkZXBl bmRzIG9uIHByZXNlbmNlIG9mIHNhdmUgYnV0dG9uICh3aGljaCB3b24ndCBiZSBwcmVzZW50 IGlmIHVzZXIgZG9lc24ndCBoYXZlIHByaXZpbGVnZXMgdG8gc2F2ZSBvciBkZWxldGUpCi8v IC0gRnJlZWxhbmNlcnMgYXJlIGFsbG93ZWQgdG8gc2F2ZS9kdXBsaWNhdGUvZGVsZXRlIHRo ZWlyIG93biBQRU5ESU5HIGFydGljbGVzIGJ1dCBvbmNlIG1hZGUgTElWRSBpdCdzIHRvdWdo IHRpdHR5IChubyBzYXZlIGJ1dHRvbiwgc28gbm8gZGVsZXRlIGJ1dHRvbikKCgkkaWQgPSBn cHMoJ0lEJyk7CglpZiAoJGlkID09ICcnKSAvLyBuZXcgYXJ0aWNsZSB0YWIKCQkkaWQgPSAw OyAvLyB3aWxsIGdldCBqUXVlcnktY2hhbmdlZCB3aGVuIG5ldyBhcnRpY2xlIHB1Ymxpc2hl ZAoKCWVjaG8KCQlmb3JtKAoJCQllSW5wdXQoJ2xpc3QnKQoJCQkuc0lucHV0KCdsaXN0X211 bHRpX2VkaXQnKQoJCQkuaElucHV0KCdlZGl0X21ldGhvZCcsICdkZWxldGUnKQoJCQkuaElu cHV0KCdzZWxlY3RlZFswXScsICRpZCkKCQkJLCAnZGlzcGxheTpub25lJwoJCQksICJjb25m aXJtKCciLmdUeHQoJ2NvbmZpcm1fZGVsZXRlX3BvcHVwJykuIicpOyIKCQkJLCAncG9zdCcK CQkJLCAnJwoJCQksICcnCgkJCSwgJ2FkaV9hcnRpY2xlX3RhYl9kZWxldGVfZm9ybScgLy8g SFRNTCBJRAoJCSk7Cn0KCmZ1bmN0aW9uIGFkaV9hcnRpY2xlX3RhYl9wcmVmKCRuYW1lLCAk dmFsdWU9TlVMTCwgJHByaXZhdGU9RkFMU0UpIHsKLy8gcmVhZCBvciBzZXQgcHJlZgoJZ2xv YmFsICRwcmVmcywgJGFkaV9hcnRpY2xlX3RhYl9wcmVmczsKCglpZiAoJHZhbHVlID09PSBO VUxMKQoJCXJldHVybiBnZXRfcHJlZigkbmFtZSwgJGFkaV9hcnRpY2xlX3RhYl9wcmVmc1sk bmFtZV1bJ3ZhbHVlJ10pOwoJZWxzZSB7CgkJaWYgKGFycmF5X2tleV9leGlzdHMoJG5hbWUs ICRhZGlfYXJ0aWNsZV90YWJfcHJlZnMpKQoJCQkkaHRtbCA9ICRhZGlfYXJ0aWNsZV90YWJf cHJlZnNbJG5hbWVdWydpbnB1dCddOwoJCWVsc2UKCQkJJGh0bWwgPSAndGV4dF9pbnB1dCc7 CgkJJHJlcyA9IHNldF9wcmVmKCRuYW1lLCAkdmFsdWUsICdhZGlfYXJ0aWNsZV90YWJfYWRt aW4nLCAyLCAkaHRtbCwgMCwgJHByaXZhdGUpOwoJCSRwcmVmc1skbmFtZV0gPSBnZXRfcHJl ZigkbmFtZSwgJGFkaV9hcnRpY2xlX3RhYl9wcmVmc1skbmFtZV1bJ3ZhbHVlJ10sIFRSVUUp OwoJCXJldHVybiAkcmVzOwoJfQp9CgpmdW5jdGlvbiBhZGlfYXJ0aWNsZV90YWJfcHJlZl9p bnB1dHMoJGV2ZW50LCAkdGFiPU5VTEwpIHsKLy8gb3V0cHV0IHByZWZlcmVuY2UgaW5wdXQg ZmllbGRzIGFjY29yZGluZyB0byBvcHRpb25zL2FkbWluIHNldHRpbmcKCWdsb2JhbCAkdHhw X2dyb3VwcywgJGFkaV9hcnRpY2xlX3RhYl9wcmVmcywgJGFkaV9hcnRpY2xlX3RhYl9vdXRs YXdzLCAkYWRpX2FydGljbGVfdGFiX2FkbWluX291dGxhd3M7CgoJaWYgKCR0YWIgPT09IE5V TEwpIHJldHVybjsKCgkkb3V0ID0gJyc7CgkkdGhpc19oZWFkaW5nID0gJyc7CgoJZm9yZWFj aCAoJGFkaV9hcnRpY2xlX3RhYl9wcmVmcyBhcyAkcHJlZl9uYW1lID0+ICRwcmVmX2luZm8p IHsKCQlpZiAoJHByZWZfaW5mb1sndGFiJ10gPT0gJHRhYikgewoJCQlpZiAoaXNzZXQoJHBy ZWZfaW5mb1snaGVhZGluZyddKSkKCQkJCWlmICgkcHJlZl9pbmZvWydoZWFkaW5nJ10gIT0g JHRoaXNfaGVhZGluZykgewoJCQkJCSR0aGlzX2hlYWRpbmcgPSAkcHJlZl9pbmZvWydoZWFk aW5nJ107CgkJCQkJJG91dCAuPSBoZWQoZ1R4dCgkdGhpc19oZWFkaW5nKSwgMik7CgkJCQl9 CgkJCXN3aXRjaCAoJHByZWZfaW5mb1snaW5wdXQnXSkgewoJCQkJY2FzZSAneWVzbm9yYWRp byc6CgkJCQkJJG91dCAuPQoJCQkJCQlncmFmKAoJCQkJCQkJdGFnKGdUeHQoJHByZWZfaW5m b1snbGFiZWwnXSksICdsYWJlbCcpCgkJCQkJCQkuc3Auc3AKCQkJCQkJCS50YWcocmFkaW8o JHByZWZfbmFtZSwgJzAnLCAoYWRpX2FydGljbGVfdGFiX3ByZWYoJHByZWZfbmFtZSkgPT0g JzAnKSkuc3AuZ1R4dCgnbm8nKSwgJ2xhYmVsJykKCQkJCQkJCS5zcC5zcAoJCQkJCQkJLnRh ZyhyYWRpbygkcHJlZl9uYW1lLCAnMScsIChhZGlfYXJ0aWNsZV90YWJfcHJlZigkcHJlZl9u YW1lKSA9PSAnMScpKS5zcC5nVHh0KCd5ZXMnKSwgJ2xhYmVsJykKCQkJCQkJCSwgJyBjbGFz cz0iJy4kcHJlZl9uYW1lLiciJwoJCQkJCQkpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnY3Vz dG9tJzoKCQkJCQkvLyBhZG1pbiBwcml2cwoJCQkJCWlmICgkcHJlZl9uYW1lID09ICdhZGlf YXJ0aWNsZV90YWJfYWRtaW5fcHJpdnMnKSB7CgkJCQkJCSRwcml2X291dCA9IGdUeHQoJHBy ZWZfaW5mb1snbGFiZWwnXSk7CgkJCQkJCSRhZG1pbl9wcml2cyA9IGRvX2xpc3QoYWRpX2Fy dGljbGVfdGFiX3ByZWYoJ2FkaV9hcnRpY2xlX3RhYl9hZG1pbl9wcml2cycpKTsKCQkJCQkJ Zm9yZWFjaCAoJHR4cF9ncm91cHMgYXMgJGluZGV4ID0+ICRncm91cCkKCQkJCQkJCWlmIChh cnJheV9zZWFyY2goJGluZGV4LCAkYWRpX2FydGljbGVfdGFiX2FkbWluX291dGxhd3MpID09 PSBGQUxTRSkgLy8gaWdub3JlIHRoZSBvdXRsYXdzCgkJCQkJCQkJJHByaXZfb3V0IC49IHRh ZyhzcC5zcC5jaGVja2JveDIoImFkaV9hcnRpY2xlX3RhYl9hZG1pbl9wcml2c1skaW5kZXhd IiwgKGFycmF5X3NlYXJjaCgkaW5kZXgsICRhZG1pbl9wcml2cykgIT09IEZBTFNFKSwgJycs ICdhZGlfYXJ0aWNsZV90YWJfYWRtaW5fcHJpdnMnKS5zcC5nVHh0KCRncm91cCksICdsYWJl bCcpOwoJCQkJCQkkb3V0IC49IGdyYWYoJHByaXZfb3V0LCAnIGNsYXNzPSInLiRwcmVmX25h bWUuJyInKTsKCQkJCQl9CgkJCQkJLy8gcGx1Z2luIHByaXZzCgkJCQkJaWYgKCRwcmVmX25h bWUgPT0gJ2FkaV9hcnRpY2xlX3RhYl9wcml2cycpIHsKCQkJCQkJJHByaXZfb3V0ID0gZ1R4 dCgkcHJlZl9pbmZvWydsYWJlbCddKTsKCQkJCQkJJHBsdWdpbl9wcml2cyA9IGRvX2xpc3Qo YWRpX2FydGljbGVfdGFiX3ByZWYoJ2FkaV9hcnRpY2xlX3RhYl9wcml2cycpKTsKCQkJCQkJ Zm9yZWFjaCAoJHR4cF9ncm91cHMgYXMgJGluZGV4ID0+ICRncm91cCkKCQkJCQkJCWlmIChh cnJheV9zZWFyY2goJGluZGV4LCAkYWRpX2FydGljbGVfdGFiX291dGxhd3MpID09PSBGQUxT RSkgLy8gaWdub3JlIHRoZSBvdXRsYXdzCgkJCQkJCQkJJHByaXZfb3V0IC49IHRhZyhzcC5z cC5jaGVja2JveDIoImFkaV9hcnRpY2xlX3RhYl9wcml2c1skaW5kZXhdIiwgKGFycmF5X3Nl YXJjaCgkaW5kZXgsICRwbHVnaW5fcHJpdnMpICE9PSBGQUxTRSksICcnLCAnYWRpX2FydGlj bGVfdGFiX3ByaXZzJykuc3AuZ1R4dCgkZ3JvdXApLCAnbGFiZWwnKTsKCQkJCQkJJG91dCAu PSBncmFmKCRwcml2X291dCwgJyBjbGFzcz0iJy4kcHJlZl9uYW1lLiciJyk7CgkJCQkJfQoJ CQkJCWJyZWFrOwoJCQkJZGVmYXVsdDogLy8gdGV4dF9pbnB1dAoJCQkJCSRzaXplID0gKGlz c2V0KCRwcmVmX2luZm9bJ3NpemUnXSkgPyAkcHJlZl9pbmZvWydzaXplJ10gOiAnJyk7CgkJ CQkJJG91dCAuPQoJCQkJCQlncmFmKAoJCQkJCQkJdGFnKGdUeHQoJHByZWZfaW5mb1snbGFi ZWwnXSksICdsYWJlbCcpCgkJCQkJCQkuc3Auc3AKCQkJCQkJCS5maW5wdXQoJ3RleHQnLCAk cHJlZl9uYW1lLCBzdHJpcHNsYXNoZXMoYWRpX2FydGljbGVfdGFiX3ByZWYoJHByZWZfbmFt ZSkpLCAkcHJlZl9uYW1lLCAnJywgJycsICRzaXplKQoJCQkJCQkJLCAnIGNsYXNzPSInLiRw cmVmX25hbWUuJyInCgkJCQkJCSk7CgkJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJaWYgKCRv dXQpCgkJcmV0dXJuCgkJCWZvcm0oCgkJCQl0YWcoCgkJCQkJdGFnKGdUeHQoJ3RhYl9wcmVm ZXJlbmNlcycpLCAnaDInKQoJCQkJCS4kb3V0CgkJCQkJLmZJbnB1dCgnc3VibWl0JywgJ2Rv X3NvbWV0aGluZycsIGdUeHQoJ2FkaV91cGRhdGVfcHJlZnMnKSwgJ3NtYWxsZXJib3gnKQoJ CQkJCS5lSW5wdXQoJGV2ZW50KQoJCQkJCS5zSW5wdXQoJ3VwZGF0ZV9wcmVmcycpCgkJCQkJ LCAnZGl2JwoJCQkJCSwgJyBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiIGNsYXNzPSJhZGlf YXJ0aWNsZV90YWJfcHJlZnMiJwoJCQkJKQoJCQkpOwp9CgpmdW5jdGlvbiBhZGlfYXJ0aWNs ZV90YWJfdXBkYXRlX3ByZWZzKCR0YWI9TlVMTCkgewovLyB1cGRhdGUgcHJlZnMKCWdsb2Jh bCAkdHhwX3VzZXIsICRhZGlfYXJ0aWNsZV90YWJfcHJlZnM7CgoJaWYgKCR0YWIgPT09IE5V TEwpCgkJcmV0dXJuIEZBTFNFOwoJZWxzZSB7CgkJJHJlc3VsdCA9IFRSVUU7CgkJZm9yZWFj aCAoJGFkaV9hcnRpY2xlX3RhYl9wcmVmcyBhcyAkcHJlZl9uYW1lID0+ICRwcmVmX2luZm8p IHsKCQkJaWYgKCRwcmVmX2luZm9bJ3RhYiddID09ICR0YWIpIHsgLy8gdGFiIG1hdGNoPwoJ CQkJaWYgKGFycmF5X2tleV9leGlzdHMoJHByZWZfbmFtZSwgJF9QT1NUKSkKCQkJCQkkdmFs dWUgPSAkX1BPU1RbJHByZWZfbmFtZV07CgkJCQllbHNlIGlmICgkcHJlZl9pbmZvWydpbnB1 dCddID09ICd5ZXNub3JhZGlvJykKCQkJCQkkdmFsdWUgPSAnMCc7CgkJCQllbHNlCgkJCQkJ JHZhbHVlID0gJHByZWZfaW5mb1sndmFsdWUnXTsKCQkJCWlmIChpc19hcnJheSgkdmFsdWUp KSB7IC8vIHN0cmluZy1pZnkgYXJyYXlzCgkJCQkJJHZhbHVlcyA9IGFycmF5X2tleXMoJHZh bHVlKTsgLy8gbmVlZCBpbmRleCB2YWx1ZXMgbm90IDFzCgkJCQkJaWYgKCRwcmVmX25hbWUg PT0gJ2FkaV9hcnRpY2xlX3RhYl9hZG1pbl9wcml2cycpIHsKCQkJCQkJJHVzZXJfcHJpdiA9 IHNhZmVfZmllbGQoJ3ByaXZzJywgJ3R4cF91c2VycycsICJuYW1lPSciLmRvU2xhc2goJHR4 cF91c2VyKS4iJyIpOwoJCQkJCQkkdmFsdWVzID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdl KCR2YWx1ZXMsIGFycmF5KDEsICR1c2VyX3ByaXYpKSk7IC8vIGNhbid0IGtpbGwgb2ZmIFB1 Ymxpc2hlciBvciBzZWxmCgkJCQkJfQoJCQkJCSR2YWx1ZSA9IGltcGxvZGUoJywnLCAkdmFs dWVzKTsKCQkJCX0KCQkJCS8vIHNvbWUgdmFsdWVzIG5vdCBhbGxvd2VkIHRvIGJlIGJsYW5r LCByZXNldCB0byBkZWZhdWx0CgkJCQlpZiAoKCEkcHJlZl9pbmZvWydibGFuayddKSAmJiAo dHJpbSgkdmFsdWUpID09ICcnKSkKCQkJCQkJJHZhbHVlID0gJGFkaV9hcnRpY2xlX3RhYl9w cmVmc1skcHJlZl9uYW1lXVsndmFsdWUnXTsKCQkJCS8vIHVwZGF0ZSBwcmVmCgkJCQkkcHJp dmF0ZSA9ICgkcHJlZl9pbmZvWyd0YWInXSA9PSAnb3B0aW9ucycgPyBGQUxTRSA6ICRwcmVm X2luZm9bJ3ByaXZhdGUnXSk7IC8vICJvcHRpb25zIiBwcmVmcyBjYW4ndCBiZSBwcml2YXRl CgkJCQkkcmVzdWx0ICY9IGFkaV9hcnRpY2xlX3RhYl9wcmVmKCRwcmVmX25hbWUsICR2YWx1 ZSwgJHByaXZhdGUpOwoJCQl9CgkJfQoJCXJldHVybiAkcmVzdWx0OwoJfQp9CgpmdW5jdGlv biBhZGlfYXJ0aWNsZV90YWJfb3B0aW9ucygkZXZlbnQsICRzdGVwKSB7Ci8vIGFkaV9hcnRp Y2xlX3RhYiBvcHRpb25zIHBhZ2UKCWdsb2JhbCAkdHhwX3VzZXIsICR0eHBfZ3JvdXBzLCAk YWRpX2FydGljbGVfdGFiX2RlYnVnLCAkYWRpX2FydGljbGVfdGFiX3VybCwgJGFkaV9hcnRp Y2xlX3RhYl9wbHVnaW5fc3RhdHVzLCAkYWRpX2FydGljbGVfdGFiX3ByZWZzLCAkYWRpX2Fy dGljbGVfdGFiX291dGxhd3MsICRsYW5nX3VpOwoKCSRtZXNzYWdlID0gJyc7CgoJLy8gZGFu Y2Ugc3RlcHMKCWlmICgkc3RlcCA9PSAndGV4dHBhY2snKSB7CgkJJGFkaV90ZXh0cGFjayA9 IGZpbGVfZ2V0X2NvbnRlbnRzKCRhZGlfYXJ0aWNsZV90YWJfdXJsWyd0ZXh0cGFjayddKTsK CQlpZiAoJGFkaV90ZXh0cGFjaykgewoJCQkkcmVzdWx0ID0gaW5zdGFsbF90ZXh0cGFjaygk YWRpX3RleHRwYWNrKTsKCQkJJG1lc3NhZ2UgPSBnVHh0KCd0ZXh0cGFja19zdHJpbmdzX2lu c3RhbGxlZCcsIGFycmF5KCd7Y291bnR9JyA9PiAkcmVzdWx0KSk7CgkJCSRuZXdfbGFuZyA9 IGxvYWRfbGFuZygkbGFuZ191aSwgJ2FkbWluJyk7CgkJCVR4cDo6Z2V0KCdcVGV4dHBhdHRl cm5cTDEwblxMYW5nJyktPnNldFBhY2soJG5ld19sYW5nLCBUUlVFKTsKCQl9CgkJZWxzZQoJ CQkkbWVzc2FnZSA9IGFycmF5KGdUeHQoJ2FkaV90ZXh0cGFja19mYWlsJyksIEVfRVJST1Ip OwoJfQoJZWxzZSBpZiAoJHN0ZXAgPT0gJ3VwZGF0ZV9wcmVmcycpIHsKCQkkcmVzdWx0ID0g YWRpX2FydGljbGVfdGFiX3VwZGF0ZV9wcmVmcygnb3B0aW9ucycpOwoJCSRyZXN1bHQgPyAk bWVzc2FnZSA9IGdUeHQoJ3ByZWZlcmVuY2VzX3NhdmVkJykgOiAkbWVzc2FnZSA9IGFycmF5 KGdUeHQoJ2FkaV9wcmVmX3VwZGF0ZV9mYWlsJyksIEVfRVJST1IpOwoJfQoKCS8vIGdlbmVy YXRlIHBhZ2UKCXBhZ2V0b3AoJ2FkaV9hcnRpY2xlX3RhYiAtICcuZ1R4dCgnb3B0aW9ucycp LCAkbWVzc2FnZSk7CgoJLy8gcGx1Z2luIHByaXYgY2hlY2tib3hlcwoJJHBsdWdpbl9wcml2 cyA9IGRvX2xpc3QoYWRpX2FydGljbGVfdGFiX3ByZWYoJ2FkaV9hcnRpY2xlX3RhYl9wcml2 cycpKTsKCSRwcml2X2NoZWNrYm94ZXMgPSAnJzsKCWZvcmVhY2ggKCR0eHBfZ3JvdXBzIGFz ICRpbmRleCA9PiAkZ3JvdXApCgkJaWYgKGFycmF5X3NlYXJjaCgkaW5kZXgsICRhZGlfYXJ0 aWNsZV90YWJfb3V0bGF3cykgPT09IEZBTFNFKSAvLyBpZ25vcmUgdGhlIG91dGxhd3MKCQkJ JHByaXZfY2hlY2tib3hlcyAuPSB0YWcoZ1R4dCgkZ3JvdXApLmNoZWNrYm94MigiYWRpX2Fy dGljbGVfdGFiX3ByaXZzWyRpbmRleF0iLCAoYXJyYXlfc2VhcmNoKCRpbmRleCwgJHBsdWdp bl9wcml2cykgIT09IEZBTFNFKSwgJycsICdhZGlfYXJ0aWNsZV90YWJfcHJpdnMnKS5zcC5z cCwgJ2xhYmVsJyk7CgoJLy8gb3B0aW9ucwoJZWNobwoJCXRhZygKCQkJdGFnKCdhZGlfYXJ0 aWNsZV90YWIgJy5nVHh0KCdvcHRpb25zJyksICdoMicpCgkJCS8vIHByZWZzCgkJCS5hZGlf YXJ0aWNsZV90YWJfcHJlZl9pbnB1dHMoJGV2ZW50LCAnb3B0aW9ucycpCgkJCS8vIHRleHRw YWNrIGxpbmtzCgkJCS5ncmFmKGhyZWYoZ1R4dCgnaW5zdGFsbF90ZXh0cGFjaycpLCAnP2V2 ZW50PScuJGV2ZW50LmEuJ3N0ZXA9dGV4dHBhY2snKSwgJyBzdHlsZT0ibWFyZ2luLXRvcDoz ZW0iJykKCQkJLmdyYWYoaHJlZihnVHh0KCdhZGlfdGV4dHBhY2tfb25saW5lJyksICRhZGlf YXJ0aWNsZV90YWJfdXJsWyd0ZXh0cGFja19kb3dubG9hZCddKSkKCQkJLmdyYWYoaHJlZihn VHh0KCdhZGlfdGV4dHBhY2tfZmVlZGJhY2snKSwgJGFkaV9hcnRpY2xlX3RhYl91cmxbJ3Rl eHRwYWNrX2ZlZWRiYWNrJ10pKQoJCQksICdkaXYnCgkJCSwgJyBzdHlsZT0idGV4dC1hbGln bjpjZW50ZXIiJwoJCSk7Cn0KIjtzOjg6ImhlbHBfcmF3IjtzOjE2MzI6ImgxLiAqYWRpX2Fy dGljbGVfdGFiKiAtIEVuaGFuY2VkIGFydGljbGUgdGFiCgpUaGlzIHBsdWdpbiBlbmhhbmNl cyB0aGUgc3RhbmRhcmQgVFhQIEFydGljbGUgRWRpdCB0YWI6CgoqIC1hcnRpY2xlIElELSBf bm93IHN0YW5kYXJkIGluIFRYUCA0LjcrXwoqIGFydGljbGUgZGVsZXRlIGJ1dHRvbgoKaDIu ICpVc2FnZSoKCkluc3RhbGwgJiBhY3RpdmF0ZSB0aGUgcGx1Z2luLCB0aGVuIGZpbmQgYW4g YXJ0aWNsZSB0byBlZGl0LiAgWW91J2xsIGZpbmQgdGhlIGFydGljbGUgZGVsZXRlIGJ1dHRv biBuZWFyIHRoZSB1c3VhbCBOZXcgQXJ0aWNsZS9EdXBsaWNhdGUvVmlldyBidXR0b25zLgoK aDIuICpQcml2aWxlZ2VzKgoKWW91IGNhbiBhZGp1c3Qgd2hvIGdldHMgdG8gdXNlIHRoZSBw bHVnaW4gYnkgc2V0dGluZyB0aGUgcHJpdmlsZWdlcyBpbiBwbHVnaW4gb3B0aW9ucy4KCk9u bHkgdXNlcnMgd2l0aCBzdWZmaWNpZW50ICJhcnRpY2xlIGRlbGV0ZSIgcHJpdmlsZWdlcyB3 aWxsIGdldCB0aGUgZGVsZXRlIGJ1dHRvbi4KCmgyLiAqVGV4dHBhY2sqCgpUbyBpbnN0YWxs IHRoZSBUZXh0cGFjaywgZ28gdG8gdGhlIHBsdWdpbidzIE9wdGlvbnMgdGFiIGFuZCBjbGlj ayBvbiAnSW5zdGFsbCB0ZXh0cGFjaycuICBUaGlzIHdpbGwgY29weSAmIGluc3RhbGwgaXQg ZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuIFRoZSBudW1iZXIgb2YgbGFuZ3VhZ2Ugc3RyaW5ncyBp bnN0YWxsZWQgZm9yIHlvdXIgbGFuZ3VhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuCgpJZiB0aGUg VGV4dHBhY2sgaW5zdGFsbGF0aW9uIGZhaWxzIChwb3NzaWJseSBkdWUgdG8gYW4gZXJyb3Ig YWNjZXNzaW5nIHRoZSByZW1vdGUgc2l0ZSksIHRoZSBhbHRlcm5hdGl2ZSBpcyB0byBjbGlj ayB0aGUgIlRleHRwYWNrIGFsc28gYXZhaWxhYmxlIG9ubGluZSI6aHR0cDovL3d3dy5ncmVh dG9jZWFubWVkaWEuY29tLmF1L3RleHRwYWNrIGxpbmsuICBUaGlzIHdpbGwgdGFrZSB5b3Ug dG8gYSB3ZWJzaXRlIHdoZXJlIHRoZSBUZXh0cGFjayBjYW4gYmUgbWFudWFsbHkgY29waWVk ICYgcGFzdGVkIGludG8gdGhlIF9UWFAgQWRtaW4gLSBMYW5ndWFnZV8gdGFiLgoKQWRkaXRp b25zIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgVGV4dHBhY2sgYXJlIHdlbGNvbWUgLSBwbGVh c2UgdXNlIHRoZSAiVGV4dHBhY2sgZmVlZGJhY2siOmh0dHA6Ly93d3cuZ3JlYXRvY2Vhbm1l ZGlhLmNvbS5hdS90ZXh0cGFjay8/cGx1Z2luPWFkaV9hcnRpY2xlX3RhYiBmb3JtLgoKaDIo YWRpX2V4dHJhcykuICpBZGRpdGlvbmFsIGluZm9ybWF0aW9uKgoKcChhZGlfZXh0cmFzKS4g U3VwcG9ydCBhbmQgZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgZnJvbSB0 aGUgIlRleHRwYXR0ZXJuIHN1cHBvcnQgZm9ydW0iOmh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVy bi5jb20vdmlld3RvcGljLnBocD9pZD00NjIxMS4gQSBjb3B5IG9mIHRoaXMgaGVscCBpcyBh bHNvIGF2YWlsYWJsZSAib25saW5lIjpodHRwOi8vd3d3LmdyZWF0b2NlYW5tZWRpYS5jb20u YXUvdHhwLz9wbHVnaW49YWRpX2FydGljbGVfdGFiLiAgTW9yZSBhZGlfcGx1Z2lucyBjYW4g YmUgZm91bmQgImhlcmUiOmh0dHA6Ly93d3cuZ3JlYXRvY2Vhbm1lZGlhLmNvbS5hdS90eHAv LiI7czozOiJtZDUiO3M6MzI6IjBmYWRmMTA0MDlmYjMyZDE0YmJlYjkyOTA1YjMwNDg2Ijt9