# gbp_permanent_links v0.14 patch 7 (standard) # Custom permanent links rules # By: Graeme Porteous # http://rgbp.co.uk/projects/textpattern/gbp_permanent_links/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE5OiJnYnBfcGVybWFuZW50X2xpbmtzIjtzOjc6InZlcnNp b24iO3M6NjoiMC4xNC43IjtzOjY6ImF1dGhvciI7czoxNToiR3JhZW1lIFBvcnRlb3VzIjtz OjEwOiJhdXRob3JfdXJpIjtzOjU5OiJodHRwOi8vcmdicC5jby51ay9wcm9qZWN0cy90ZXh0 cGF0dGVybi9nYnBfcGVybWFuZW50X2xpbmtzLyI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjg6 IkN1c3RvbSBwZXJtYW5lbnQgbGlua3MgcnVsZXMiO3M6NDoidHlwZSI7czoxOiIxIjtzOjQ6 ImhlbHAiO3M6MTUxOiJoMS4gZ2JwX3Blcm1hbmVudF9saW5rcy4KClRoZXJlIGlzIG5vIHBs dWdpbiBkb2N1bWVudGF0aW9uLiBGb3IgaGVscCBwbGVhc2UgdXNlIHRoZSAiZm9ydW0gdGhy ZWFkIjpodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTg5 MTguIjtzOjQ6ImNvZGUiO3M6NjgzNDU6Ii8vIENvbnN0YW50cwpAZGVmaW5lKCdnYnBfc2F2 ZScsICdzYXZlJyk7CkBkZWZpbmUoJ2dicF9wb3N0JywgJ3Bvc3QnKTsKQGRlZmluZSgnZ2Jw X3NlcGFyYXRvcicsICcmfiZ+JicpOwoKLy8gcmVxdWlyZV9wbHVnaW4oKSB3aWxsIHJlc2V0 IHRoZSAkdHhwX2N1cnJlbnRfcGx1Z2luIGdsb2JhbApnbG9iYWwgJHR4cF9jdXJyZW50X3Bs dWdpbjsKJGdicF9jdXJyZW50X3BsdWdpbiA9ICR0eHBfY3VycmVudF9wbHVnaW47CnJlcXVp cmVfcGx1Z2luKCdnYnBfYWRtaW5fbGlicmFyeScpOwokdHhwX2N1cnJlbnRfcGx1Z2luID0g JGdicF9jdXJyZW50X3BsdWdpbjsKCmNsYXNzIFBlcm1hbmVudExpbmtzIGV4dGVuZHMgR0JQ UGx1Z2luCnsKCXZhciAkcHJlZmVyZW5jZXMgPSBhcnJheSgKCQknc2hvd19wcmVmaXgnID0+ IGFycmF5KCd2YWx1ZScgPT4gMCwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ3Nob3df c3VmZml4JyA9PiBhcnJheSgndmFsdWUnID0+IDAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycp LAoJCSdvbWl0X3RyYWlsaW5nX3NsYXNoJyA9PiBhcnJheSgndmFsdWUnID0+IDAgLCAndHlw ZScgPT4gJ3llc25vcmFkaW8nKSwKCQkncmVkaXJlY3RfbXRfc3R5bGVfbGlua3MnID0+IGFy cmF5KCd2YWx1ZScgPT4gMSAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdjbGVhbl9w YWdlX2FyY2hpdmVfbGlua3MnID0+IGFycmF5KCd2YWx1ZScgPT4gMSAsICd0eXBlJyA9PiAn eWVzbm9yYWRpbycpLAoJCSdqb2luX3ByZXRleHRfdG9fcGFnZWxpbmtzJyA9PiBhcnJheSgn dmFsdWUnID0+IDEgLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQknY2hlY2tfcHJldGV4 dF9jYXRlZ29yeV9jb250ZXh0JyA9PiBhcnJheSgndmFsdWUnID0+IDAgLCAndHlwZScgPT4g J3llc25vcmFkaW8nKSwKCQknY2hlY2tfcHJldGV4dF9zZWN0aW9uX2NvbnRleHQnID0+IGFy cmF5KCd2YWx1ZScgPT4gMCAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdmb3JjZV9s b3dlcmNhc2VfdXJscycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNu b3JhZGlvJyksCgkJJ2F1dG9tYXRpY2FsbHlfYXBwZW5kX3RpdGxlJyA9PiBhcnJheSgndmFs dWUnID0+IDEgLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQkndXNlX2NsZWF2ZXJfcGFy dGlhbF9tYXRjaGVzJyA9PiBhcnJheSgndmFsdWUnID0+IDEgLCAndHlwZScgPT4gJ3llc25v cmFkaW8nKSwKCQkncGVybWxpbmtfcmVkaXJlY3RfaHR0cF9zdGF0dXMnID0+IGFycmF5KCd2 YWx1ZScgPT4gJzMwMScgLCAndHlwZScgPT4gJ3RleHRfaW5wdXQnKSwKCQkndXJsX3JlZGly ZWN0X2h0dHBfc3RhdHVzJyA9PiBhcnJheSgndmFsdWUnID0+ICczMDInICwgJ3R5cGUnID0+ ICd0ZXh0X2lucHV0JyksCgkJJ3RleHRfYW5kX3JlZ2V4X3NlZ21lbnRfc2NvcmVzJyA9PiBh cnJheSgndmFsdWUnID0+ICcwJyAsICd0eXBlJyA9PiAndGV4dF9pbnB1dCcpLAoJCSdkZWJ1 ZycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCSk7 Cgl2YXIgJG1hdGNoZWRfcGVybWxpbmsgPSBhcnJheSgpOwoJdmFyICRwYXJ0aWFsX21hdGNo ZXMgPSBhcnJheSgpOwoJdmFyICRjbGVhdmVyX3BhcnRpYWxfbWF0Y2g7Cgl2YXIgJGJ1ZmZl cl9kZWJ1ZyA9IGFycmF5KCk7CgoJZnVuY3Rpb24gcHJlbG9hZCAoKSB7CgkJbmV3IFBlcm1h bmVudExpbmtzTGlzdFRhYlZpZXcoJ2xpc3QnLCAnbGlzdCcsICR0aGlzKTsKCQluZXcgUGVy bWFuZW50TGlua3NCdWlsZFRhYlZpZXcoJ2J1aWxkJywgJ2J1aWxkJywgJHRoaXMpOwoJCW5l dyBHQlBQcmVmZXJlbmNlVGFiVmlldygkdGhpcyk7Cgl9CgoJZnVuY3Rpb24gbWFpbiAoKSB7 CgkJcmVxdWlyZV9wcml2cygkdGhpcy0+ZXZlbnQpOwoJfQoKCWZ1bmN0aW9uIGdldF9hbGxf cGVybWxpbmtzICgkc29ydCA9IDAsICRleGNsdWRlID0gYXJyYXkoKSkgewoJCXN0YXRpYyAk cnM7CgkJaWYgKCFpc3NldCgkcnMpKQoJCQkkcnMgPSBzYWZlX2NvbHVtbigKCQkJCSJSRVBM QUNFKG5hbWUsICd7JHRoaXMtPnBsdWdpbl9uYW1lfV8nLCAnJykgQVMgaWQiLCAndHhwX3By ZWZzJywKCQkJCSJgZXZlbnRgID0gJ3skdGhpcy0+ZXZlbnR9JyBBTkQgYG5hbWVgIFJFR0VY UCAnXnskdGhpcy0+cGx1Z2luX25hbWV9Xy57MTN9JCciCgkJCSk7CgoJCWlmIChAdHhwaW50 ZXJmYWNlID09ICdwdWJsaWMnKQoJCQkkdGhpcy0+ZGVidWcoJ0xvYWRpbmcgcGVybWxpbmtz IGZyb20gZGInKTsKCQkkaSA9IDA7CgoJCSRwZXJtbGlua3MgPSBhcnJheSgpOwoJCWZvcmVh Y2ggKCRycyBhcyAkaWQpIHsKCQkJJHBsID0gJHRoaXMtPmdldF9wZXJtbGluaygkaWQpOwoK CQkJLy8gRG9uJ3QgdHJ5IGFuZCBsb2FkIHBlcm1hbGluayBydWxlcyBmcm9tIHRoZSBuZXcg dmVyc2lvbgoJCQlpZiAoIWlzc2V0KCRwbFsnY29tcG9uZW50cyddKSkKCQkJCWNvbnRpbnVl OwoKCQkJaWYgKGNvdW50KCRleGNsdWRlKSA+IDApCgkJCQlmb3JlYWNoICgkcGxbJ2NvbXBv bmVudHMnXSBhcyAkcGxfYykgewoJCQkJCWlmIChpc19hcnJheSgkZXhjbHVkZSkgJiYgaW5f YXJyYXkoJHBsX2NbJ3R5cGUnXSwgJGV4Y2x1ZGUpKQoJCQkJCQljb250aW51ZSAyOwoJCQkJ CWlmIChpc19zdHJpbmcoJGV4Y2x1ZGUpICYmICRwbF9jWyd0eXBlJ10gPT09ICRleGNsdWRl KQoJCQkJCQljb250aW51ZSAyOwoJCQkJfQoKCQkJJHBlcm1saW5rc1skaWRdID0gJHBsOwoK CQkJaWYgKCRzb3J0KQoJCQkJJHByZWNlZGVuY2VbJGlkXSA9ICRwZXJtbGlua3NbJGlkXVsn c2V0dGluZ3MnXVsncGxfcHJlY2VkZW5jZSddOwoJCX0KCgkJLy8gSWYgbW9yZSB0aGFuIG9u ZSBwZXJtYW5lbnQgbGluaywgc29ydCBieSB0aGVpciBwcmVjZWRlbmNlIHZhbHVlLgoJCWlm ICgkc29ydCAmJiBjb3VudCgkcGVybWxpbmtzKSA+IDEpCgkJCWFycmF5X211bHRpc29ydCgk cHJlY2VkZW5jZSwgU09SVF9ERVNDLCAkcGVybWxpbmtzKTsKCgkJaWYgKEB0eHBpbnRlcmZh Y2UgPT0gJ3B1YmxpYycpIHsKCQkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAkcGwpCgkJCQkk dGhpcy0+ZGVidWcoJHBsWydzZXR0aW5ncyddWydwbF9wcmVjZWRlbmNlJ10uJzogJy4kcGxb J3NldHRpbmdzJ11bJ3BsX25hbWUnXS4nICgnLiRwbFsnc2V0dGluZ3MnXVsncGxfcHJldmll dyddLicpJyk7CgkJfQoKCQlyZXR1cm4gJHBlcm1saW5rczsKCX0KCglmdW5jdGlvbiBnZXRf cGVybWxpbmsgKCRpZCkgewoJCSRwZXJtbGluayA9ICR0aGlzLT5wcmVmKCRpZCk7CgkJcmV0 dXJuIGlzX2FycmF5KCRwZXJtbGluaykgPyAkcGVybWxpbmsgOiBhcnJheSgpOwoJfQoKCWZ1 bmN0aW9uIHJlbW92ZV9wZXJtbGluayAoJGlkKSB7CgkJJHBlcm1saW5rID0gJHRoaXMtPmdl dF9wZXJtbGluaygkaWQpOwoJCXNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAiYGV2ZW50YCA9 ICd7JHRoaXMtPmV2ZW50fScgQU5EIGBuYW1lYCBMSUtFICd7JHRoaXMtPnBsdWdpbl9uYW1l fV97JGlkfSUnIik7CgkJcmV0dXJuICRwZXJtbGlua1snc2V0dGluZ3MnXVsncGxfbmFtZSdd OwoJfQoKCWZ1bmN0aW9uIF9mZWVkX2VudHJ5ICgpIHsKCQlzdGF0aWMgJHNldDsKCQlpZiAo IWlzc2V0KCRzZXQpKSB7CgkJCS8vIFdlJ3JlIGluIGEgZmVlZCBmb3JjZSBkZWJ1Z2dpbmcg b2ZmLgoJCQkkdGhpcy0+cHJlZmVyZW5jZXNbJ2RlYnVnJ11bJ3ZhbHVlJ10gPSAkR0xPQkFM U1sncHJlZnMnXVskdGhpcy0+cGx1Z2luX25hbWUuJ19kZWJ1ZyddID0gMDsKCgkJCSR0aGlz LT5zZXRfcGVybWxpbmtfbW9kZSh0cnVlKTsKCQkJJHNldCA9IHRydWU7CgkJfQoJfQoKCWZ1 bmN0aW9uIF90ZXh0cGF0dGVybiAoKSB7CgkJZ2xvYmFsICRwbHVnaW5zX3ZlciwgJHByZXRl eHQsICRwcmVmcywgJHBsdWdpbl9jYWxsYmFjazsKCgkJJHRoaXMtPmRlYnVnKCdQbHVnaW46 ICcuJHRoaXMtPnBsdWdpbl9uYW1lLicgLSAnLiRwbHVnaW5zX3ZlclskdGhpcy0+cGx1Z2lu X25hbWVdKTsKCQkkdGhpcy0+ZGVidWcoJ0Z1bmN0aW9uOiAnLl9fRlVOQ1RJT05fXy4nKCkn KTsKCgkJLy8gVVJJCgkJJHJlcSA9ICRwcmV0ZXh0WydyZXEnXTsKCQkkcmVxID0gcHJlZ19y ZXBsYWNlKCclXD9bXlwvXSskJScsICcnLCAkcmVxKTsKCQkkdGhpcy0+ZGVidWcoJ1JlcXVl c3QgVVJJOiAnLiRyZXEpOwoJCSR1cmkgPSBleHBsb2RlKCcvJywgdHJpbSgkcmVxLCAnLycp KTsKCgkJLy8gVGhlIG51bWJlciBvZiBjb21wb25lbnRzIGNvbWVzIGluIHVzZWZ1bCB3aGVu IGRldGVybWluaW5nIHRoZSBiZXN0IHBhcnRpYWwgbWF0Y2guCgkJJHVyaV9jb21wb25lbnRf Y291bnQgPSBjb3VudCgkdXJpKTsKCgkJLy8gUGVybWFuZW50IGxpbmtzCgkJJHBlcm1saW5r cyA9ICR0aGlzLT5nZXRfYWxsX3Blcm1saW5rcygxKTsKCgkJLy8gRm9yY2UgVGV4dHBhdHRl cm4gYW5kIHRhZ3MgdG8gdXNlIG1lc3N5IFVSTHMgLSB0aGVzZSBhcmUgZWFzaWVyIHRvCgkJ Ly8gZmluZCBpbiByZWdleAoJCSR0aGlzLT5zZXRfcGVybWxpbmtfbW9kZSgpOwoKCQlpZiAo Y291bnQoJHBlcm1saW5rcykpIHsKCgkJCS8vIFdlIGFsc28gd2FudCB0byBtYXRjaCB0aGUg ZnJvbnQgcGFnZSBvZiB0aGUgc2l0ZSAoZm9yIHBhZ2UgbnVtYmVycyAvIGZlZWRzIGV0Yy4u KS4KCQkJLy8gQWRkIGEgcGVybWxpbmtzIHJ1bGUgd2hpY2ggd2lsbCBkbyB0aGF0LgoJCQkk cGVybWxpbmtzWydkZWZhdWx0J10gPSBhcnJheSgKCQkJCSdjb21wb25lbnRzJyA9PiBhcnJh eSgpLAoJCQkJJ3NldHRpbmdzJyA9PiBhcnJheSgKCQkJCQkncGxfbmFtZScgPT4gJ2dicF9w ZXJtYW5lbnRfbGlua3NfZGVmYXVsdCcsICdwbF9wcmVjZWRlbmNlJyA9PiAnJywgJ3BsX3By ZXZpZXcnID0+ICcvJywKCQkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5 JyA9PiAnJywgJ2Rlc19zZWN0aW9uJyA9PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4gJycsCgkJ CQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycsICdkZXNfbG9jYXRp b24nID0+ICcnLCAnZGVzX3BhZ2UnID0+ICcnCgkJCSkpOwoKCQkJLy8gRXh0ZW5kIHRoZSBw cmV0ZXh0X3JlcGxhY2VtZW50IHNjb3BlIG91dHNpZGUgdGhlIGZvcmVhY2ggcGVybWxpbmsg bG9vcAoJCQkkcHJldGV4dF9yZXBsYWNlbWVudCA9IE5VTEw7CgoJCQlmb3JlYWNoKCRwZXJt bGlua3MgYXMgJGlkID0+ICRwbCkgewoJCQkJLy8gRXh0cmFjdCB0aGUgcGVybWxpbmsgc2V0 dGluZ3MKCQkJCSRwbF9zZXR0aW5ncyA9ICRwbFsnc2V0dGluZ3MnXTsKCQkJCWV4dHJhY3Qo JHBsX3NldHRpbmdzKTsKCgkJCQkkdGhpcy0+ZGVidWcoJ1Blcm1saW5rIG5hbWU6ICcuJHBs X25hbWUpOwoJCQkJJHRoaXMtPmRlYnVnKCdQZXJtbGluayBpZDogJy4kaWQpOwoJCQkJJHRo aXMtPmRlYnVnKCdQcmV2aWV3OiAnLiRwbF9wcmV2aWV3KTsKCgkJCQkkcGxfY29tcG9uZW50 cyA9ICRwbFsnY29tcG9uZW50cyddOwoKCQkJCS8vIFVSSSBjb21wb25lbnRzCgkJCQkkdXJp X2NvbXBvbmVudHMgPSAkdXJpOwoKCQkJCSR0aGlzLT5kZWJ1ZygnUEwgY29tcG9uZW50IGNv dW50OiAnLmNvdW50KCRwbF9jb21wb25lbnRzKSk7CgkJCQkkdGhpcy0+ZGVidWcoJ1VSTCBj b21wb25lbnQgY291bnQ6ICcuY291bnQoJHVyaV9jb21wb25lbnRzKSk7CgoJCQkJJGRhdGUg PSBmYWxzZTsgJHRpdGxlX3BhZ2VfZmVlZCA9IGZhbHNlOwoJCQkJZm9yZWFjaCgkcGxfY29t cG9uZW50cyBhcyAkcGxfYykKCQkJCQkvLyBBcmUgd2UgZXhwZWN0aW5nIGEgZGF0ZSBjb21w b25lbnQ/IElmIHNvIHRoZSBudW1iZXIgb2YgcGwgYW5kIHVyaSBjb21wb25lbnRzIHdvbid0 IG1hdGNoCgkJCQkJaWYgKCRwbF9jWyd0eXBlJ10gPT0gJ2RhdGUnKQoJCQkJCQkkZGF0ZSA9 IHRydWU7CgkJCQkJLy8gRG8gd2UgaGF2ZSBlaXRoZXIgYSB0aXRsZSwgcGFnZSBvciBhIGZl ZWQgY29tcG9uZW50PwoJCQkJCWVsc2UgaWYgKGluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFy cmF5KCd0aXRsZScsICdwYWdlJywgJ2ZlZWQnKSkpCgkJCQkJCSR0aXRsZV9wYWdlX2ZlZWQg PSB0cnVlOwoKCQkJCWlmICghJHRpdGxlX3BhZ2VfZmVlZCkKCQkJCQkvLyBJZiB0aGVyZSBp c24ndCBhIHRpdGxlLCBwYWdlIG9yIGZlZWQgY29tcG9uZW50IHRoZW4gYXBwZW5kIGEgc3Bl Y2lhbCB0eXBlIGZvciBjbGVhdmVyIHBhcnRpYWwgbWF0Y2hpbmcKCQkJCQkkcGxfY29tcG9u ZW50c1tdID0gYXJyYXkoJ3R5cGUnID0+ICd0aXRsZV9wYWdlX2ZlZWQnLCAncHJlZml4JyA9 PiAnJywgJ3N1ZmZpeCcgPT4gJycsICdyZWdleCcgPT4gJycsICd0ZXh0JyA9PiAnJyk7CgoJ CQkJLy8gRXhpdCBlYXJseSBpZiB0aGVyZSBhcmUgbW9yZSBVUkwgY29tcG9uZW50cyB0aGFu IFBMIGNvbXBvbmVudHMsCgkJCQkvLyB0YWtpbmcgaW50byBhY2NvdW50IHdoZXRoZXIgdGhl cmUgaXMgYSBkYXRhIGNvbXBvbmVudAoJCQkJaWYgKCEkdXJpX2NvbXBvbmVudHNbMF0gfHwg Y291bnQoJHVyaV9jb21wb25lbnRzKSA+IGNvdW50KCRwbF9jb21wb25lbnRzKSArICgkZGF0 ZSA/IDIgOiAwKSkgewoJCQkJCSR0aGlzLT5kZWJ1ZygnTW9yZSBVUkwgY29tcG9uZW50cyB0 aGFuIFBMIGNvbXBvbmVudHMnKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZXNl dCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIHdlIGFyZSBhYm91dCB0byBzdGFydCBhbm90aGVy IGNvbXBhcmlzb24KCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXkoJ3Blcm1saW5r X2lkJyA9PiAkaWQpOwoKCQkJCS8vIFJlc2V0IHRoZSBhcnRpY2xlIGNvbnRleHQgc3RyaW5n CgkJCQkkY29udGV4dCA9IGFycmF5KCk7CgkJCQl1bnNldCgkY29udGV4dF9zdHIpOwoJCQkJ aWYgKCFlbXB0eSgkZGVzX3NlY3Rpb24pKQoJCQkJCSRjb250ZXh0W10gPSAiYFNlY3Rpb25g ID0gJyRkZXNfc2VjdGlvbiciOwoJCQkJaWYgKCFlbXB0eSgkZGVzX2NhdGVnb3J5KSkKCQkJ CQkkY29udGV4dFtdID0gIihgQ2F0ZWdvcnkxYCA9ICckZGVzX2NhdGVnb3J5JyBPUiBgQ2F0 ZWdvcnkyYCA9ICckZGVzX2NhdGVnb3J5JykiOwoJCQkJJGNvbnRleHRfc3RyID0gKGNvdW50 KCRjb250ZXh0KSA+IDAgPyAnYW5kICcuam9pbignIGFuZCAnLCAkY29udGV4dCkgOiAnJyk7 CgoJCQkJLy8gQXNzdW1lIHRoZXJlIGlzIG5vIG1hdGNoCgkJCQkkcGFydGlhbF9tYXRjaCA9 IGZhbHNlOwoJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9IGZhbHNlOwoKCQkJCS8vIExv b3AgdGhyb3VnaCB0aGUgcGVybWxpbmsgY29tcG9uZW50cwoJCQkJZm9yZWFjaCAoJHBsX2Nv bXBvbmVudHMgYXMgJHBsX2NfaW5kZXggPT4gJHBsX2MpIHsKCQkJCQkvLyBBc3N1bWUgdGhl cmUgaXMgbm8gbWF0Y2gKCQkJCQkkbWF0Y2ggPSBmYWxzZTsKCgkJCQkJLy8gQ2hlY2sgdG8g c2VlIGlmIHRoZXJlIGFyZSBzdGlsbCBVUkkgY29tcG9uZW50cyB0byBiZSBjaGVja2VkLgoJ CQkJCWlmIChjb3VudCgkdXJpX2NvbXBvbmVudHMpKQoJCQkJCQkvLyBHZXQgdGhlIG5leHQg Y29tcG9uZW50LgoJCQkJCQkkdXJpX2MgPSBhcnJheV9zaGlmdCgkdXJpX2NvbXBvbmVudHMp OwoKCQkJCQllbHNlIGlmICghJHRpdGxlX3BhZ2VfZmVlZCAmJiBjb3VudCgkcGxfY29tcG9u ZW50cykgLSAxID09ICR1cmlfY29tcG9uZW50X2NvdW50KSB7CgkJCQkJCS8vIElmIHdlIGFw cGVuZGVkIGEgdGl0bGVfcGFnZV9mZWVkIGNvbXBvbmVudCBlYXJsaWVyIGFuZCBwZXJtbGlu ayBhbmQgVVJJIGNvbXBvbmVudHMKCQkJCQkJLy8gY291bnRzIGFyZSBlcXVhbCwgd2UgbXVz dCBvZiBmaW5pc2hlZCBjaGVja2luZyB0aGlzIHBlcm1saW5rLCBhbmQgaXQgbWF0Y2hlcyBz byBicmVhay4KCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgoJCQkJCX0gZWxz ZSB7CgkJCQkJCS8vIElmIHRoZXJlIGFyZSBubyBtb3JlIFVSSSBjb21wb25lbnRzIHRoZW4g d2UgaGF2ZSBhIHBhcnRpYWwgbWF0Y2guCgkJCQkJCS8vIFN0b3JlIHRoZSBwYXJ0aWFsIG1h dGNoIGRhdGEgdW5sZXNzIHRoZXJlIGhhcyBiZWVuIGEgcHJlY2VkaW5nIHBlcm1saW5rIHdp dGggdGhlCgkJCQkJCS8vIHNhbWUgbnVtYmVyIG9mIGNvbXBvbmVudHMsIGFzIHBlcm1saW5r IGhhdmUgYWxyZWFkeSBiZWVuIHNvcnRlZCBieSBwcmVjZWRlbmNlLgoJCQkJCQlpZiAoIWFy cmF5X2tleV9leGlzdHMoJHVyaV9jb21wb25lbnRfY291bnQsICR0aGlzLT5wYXJ0aWFsX21h dGNoZXMpKQoJCQkJCQkJJHRoaXMtPnBhcnRpYWxfbWF0Y2hlc1skdXJpX2NvbXBvbmVudF9j b3VudF0gPSAkcHJldGV4dF9yZXBsYWNlbWVudDsKCgkJCQkJCS8vIFVuc2V0IHByZXRleHRf cmVwbGFjZW1lbnQgYXMgY2hhbmdlcyBjb3VsZCBvZiBiZWVuIG1hZGUgaW4gYSBwcmVjZWRp bmcgY29tcG9uZW50CgkJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50KTsKCgkJCQkJ CS8vIEJyZWFrIGVhcmx5IGZvcm0gdGhlIGZvcmVhY2ggcGVybWxpbmsgY29tcG9uZW50cyBs b29wLgoJCQkJCQkkcGFydGlhbF9tYXRjaCA9IHRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCX0K CgkJCQkJLy8gRXh0cmFjdCB0aGUgcGVybWxpbmsgY29tcG9uZW50cy4KCQkJCQlleHRyYWN0 KCRwbF9jKTsKCgkJCQkJLy8gSWYgaXQncyBhIGRhdGUsIGdyYWIgYW5kIGNvbWJpbmUgdGhl IG5leHQgdHdvIFVSSSBjb21wb25lbnRzLgoJCQkJCWlmICgkdHlwZSA9PSAnZGF0ZScpCgkJ CQkJCSR1cmlfYyAuPSAnLycuYXJyYXlfc2hpZnQoJHVyaV9jb21wb25lbnRzKS4nLycuYXJy YXlfc2hpZnQoJHVyaV9jb21wb25lbnRzKTsKCgkJCQkJLy8gRGVjb2RlIHRoZSBVUkwKCQkJ CQkkdXJpX2MgPSB1cmxkZWNvZGUoJHVyaV9jKTsKCgkJCQkJLy8gQWx3YXlzIGNoZWNrIHRo ZSB0eXBlIHVubGVzcyB0aGUgcHJlZml4IG9yIHN1ZmZpeCBhcmVuJ3QgdGhlcmUKCQkJCQkk Y2hlY2tfdHlwZSA9IHRydWU7CgoJCQkJCS8vIENoZWNrIHByZWZpeAoJCQkJCWlmICgkcHJl Zml4ICYmICR0aGlzLT5wcmVmKCdzaG93X3ByZWZpeCcpKSB7CgkJCQkJCSRzYW5pdGl6ZWRf cHJlZml4ID0gdXJsZGVjb2RlKCR0aGlzLT5lbmNvZGVfdXJsKCRwcmVmaXgpKTsKCQkJCQkJ aWYgKCgkcG9zID0gc3RycG9zKCR1cmlfYywgJHNhbml0aXplZF9wcmVmaXgpKSA9PT0gZmFs c2UgfHwgJHBvcyAhPSAwKSB7CgkJCQkJCQkkY2hlY2tfdHlwZSA9IGZhbHNlOwoJCQkJCQkJ JHRoaXMtPmRlYnVnKCdDYW5cJ3QgZmluZCBwcmVmaXg6ICcuJHByZWZpeCk7CgkJCQkJCX0g ZWxzZQoJCQkJCQkJLy8gQ2hlY2sgcGFzc2VkLCByZW1vdmUgcHJlZml4IHJlYWR5IGZvciB0 aGUgbmV4dCBjaGVjawoJCQkJCQkJJHVyaV9jID0gc3Vic3RyX3JlcGxhY2UoJHVyaV9jLCAn JywgMCwgc3RybGVuKCRzYW5pdGl6ZWRfcHJlZml4KSk7CgkJCQkJfQoKCQkJCQkvLyBDaGVj ayBzdWZmaXgKCQkJCQlpZiAoJGNoZWNrX3R5cGUgJiYgJHN1ZmZpeCAmJiAkdGhpcy0+cHJl Zignc2hvd19zdWZmaXgnKSkgewoJCQkJCQkkc2FuaXRpemVkX3N1ZmZpeCA9IHVybGRlY29k ZSgkdGhpcy0+ZW5jb2RlX3VybCgkc3VmZml4KSk7CgkJCQkJCWlmICgoJHBvcyA9IHN0cnJw b3MoJHVyaV9jLCAkc2FuaXRpemVkX3N1ZmZpeCkpID09PSBmYWxzZSkgewoJCQkJCQkJJGNo ZWNrX3R5cGUgPSBmYWxzZTsKCQkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2FuXCd0IGZpbmQgc3Vm Zml4OiAnLiRzdWZmaXgpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCS8vIENoZWNrIHBhc3NlZCwg cmVtb3ZlIHN1ZmZpeCByZWFkeSBmb3IgdGhlIG5leHQgY2hlY2sKCQkJCQkJCSR1cmlfYyA9 IHN1YnN0cl9yZXBsYWNlKCR1cmlfYywgJycsICRwb3MsIHN0cmxlbigkc2FuaXRpemVkX3N1 ZmZpeCkpOwoJCQkJCX0KCgkJCQkJLy8gQm90aCB0aGUgcHJlZml4IGFuZCBzdWZmaXggc2V0 dGluZ3MgaGF2ZSBwYXNzZWQKCQkJCQlpZiAoJGNoZWNrX3R5cGUpIHsKCQkJCQkJJHRoaXMt PmRlYnVnKCdDaGVja2luZyBpZiAiJy4kdXJpX2MuJyIgaXMgb2YgdHlwZSAiJy4kdHlwZS4n IicpOwoJCQkJCQkkdXJpX2MgPSBkb1NsYXNoKCR1cmlfYyk7CgoJCQkJCQkvLwoJCQkJCQlp ZiAoJHByZWZzWydwZXJtYWxpbmtfdGl0bGVfZm9ybWF0J10pIHsKCQkJCQkJCSRtdF9zZWFy Y2ggPSBhcnJheSgnL18vJywgJy9cLmh0bWwkLycpOwoJCQkJCQkJJG10X3JlcGxhY2UgPSBh cnJheSgnLScsICcnKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRtdF9zZWFyY2ggPSBhcnJh eSgnLyg/Ol58XykoLikvZScsICcvXC5odG1sJC8nKTsKCQkJCQkJCSRtdF9yZXBsYWNlID0g YXJyYXkoInN0cnRvdXBwZXIoJ1xcMScpIiwgJycpOwoJCQkJCQl9CgkJCQkJCSRtdF91cmlf YyA9ICR0aGlzLT5wcmVmKCdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycpCgkJCQkJCQk/IHBy ZWdfcmVwbGFjZSgkbXRfc2VhcmNoLCAkbXRfcmVwbGFjZSwgJHVyaV9jKQoJCQkJCQkJOiAn JzsKCgkJCQkJCS8vIENvbXBhcmUgYmFzZWQgb24gdHlwZQoJCQkJCQlzd2l0Y2ggKCR0eXBl KSB7CgkJCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJCQlpZiAoJHJzID0gc2FmZV9yb3co J25hbWUnLCAndHhwX3NlY3Rpb24nLCAiKGBuYW1lYCBsaWtlICckdXJpX2MnIG9yIGBuYW1l YCBsaWtlICckbXRfdXJpX2MnKSBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVn KCdTZWN0aW9uIG5hbWU6ICcuJHJzWyduYW1lJ10pOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBs YWNlbWVudFsncyddID0gJHJzWyduYW1lJ107CgkJCQkJCQkJCSRjb250ZXh0W10gPSAiYFNl Y3Rpb25gID0gJ3skcnNbJ25hbWUnXX0nIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJ CQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2NhdGVnb3J5JzoKCQkJCQkJCQlp ZiAoJHJzID0gc2FmZV9yb3coJ25hbWUnLCAndHhwX2NhdGVnb3J5JywgIihgbmFtZWAgbGlr ZSAnJHVyaV9jJyBvciBgbmFtZWAgbGlrZSAnJG10X3VyaV9jJykgYW5kIGB0eXBlYCA9ICdh cnRpY2xlJyBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCdDYXRlZ29yeSBu YW1lOiAnLiRyc1snbmFtZSddKTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2Mn XSA9ICRyc1snbmFtZSddOwoJCQkJCQkJCQkkY29udGV4dFtdID0gIihgQ2F0ZWdvcnkxYCA9 ICd7JHJzWyduYW1lJ119JyBPUiBgQ2F0ZWdvcnkyYCA9ICckdXJpX2MnKSI7CgkJCQkJCQkJ CSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0 aXRsZSc6CgkJCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93KCd1cmxfdGl0bGUnLCAndGV4dHBh dHRlcm4nLCAiKGB1cmxfdGl0bGVgIGxpa2UgJyR1cmlfYycgb3IgYHVybF90aXRsZWAgbGlr ZSAnJG10X3VyaV9jJykgJGNvbnRleHRfc3RyIGFuZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEi KSkgewoJCQkJCQkJCQkkdGhpcy0+ZGVidWcoJ1VSTCBUaXRsZTogJy4kcnNbJ3VybF90aXRs ZSddKTsKCQkJCQkJCQkJJG10X3JlZGlyZWN0ID0gKCR1cmlfYyAhPSAkbXRfdXJpX2MpOwoJ CQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsndXJsX3RpdGxlJ10gPSAkcnNbJ3VybF90 aXRsZSddOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFr OwoJCQkJCQkJY2FzZSAnaWQnOgoJCQkJCQkJCWlmICgkcnMgPSBzYWZlX3JvdygnSUQsIFBv c3RlZCcsICd0ZXh0cGF0dGVybicsICJgSURgID0gJyR1cmlfYycgJGNvbnRleHRfc3RyIGFu ZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEiKSkgewoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNl bWVudFsnaWQnXSA9ICRyc1snSUQnXTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRb J1Bvc3RlZCddID0gJHJzWydQb3N0ZWQnXTsKCQkJCQkJCQkJJHByZXRleHRbJ251bVBhZ2Vz J10gPSAxOwoJCQkJCQkJCQkkcHJldGV4dFsnaXNfYXJ0aWNsZV9saXN0J10gPSBmYWxzZTsK CQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJ CWNhc2UgJ2F1dGhvcic6CgkJCQkJCQkJaWYgKCRhdXRob3IgPSBzYWZlX2ZpZWxkKCduYW1l JywgJ3R4cF91c2VycycsICJSZWFsTmFtZSBsaWtlICckdXJpX2MnIGxpbWl0IDEiKSkgewoJ CQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsnYXV0aG9yJ10gPSAkYXV0aG9yOwoJCQkJ CQkJCQkkY29udGV4dFtdID0gImBBdXRob3JJRGAgPSAnJGF1dGhvciciOwoJCQkJCQkJCQkk bWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbG9n aW4nOgoJCQkJCQkJCWlmICgkYXV0aG9yID0gc2FmZV9maWVsZCgnbmFtZScsICd0eHBfdXNl cnMnLCAibmFtZSBsaWtlICckdXJpX2MnIGxpbWl0IDEiKSkgewoJCQkJCQkJCQkkcHJldGV4 dF9yZXBsYWNlbWVudFsnYXV0aG9yJ10gPSAkYXV0aG9yOwoJCQkJCQkJCQkkY29udGV4dFtd ID0gImBBdXRob3JJRGAgPSAnJGF1dGhvciciOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJ CQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnY3VzdG9tJzoKCQkJCQkJCQkk Y3VzdG9tX29wdGlvbnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfbWFwKGFycmF5KCR0aGlzLCAi ZW5jb2RlX3VybCIpLCBzYWZlX2NvbHVtbigiY3VzdG9tXyRjdXN0b20iLCAndGV4dHBhdHRl cm4nLCAiY3VzdG9tXyRjdXN0b20gIT0gJyciKSkpOwoJCQkJCQkJCWlmICgkdGhpcy0+cHJl ZignZm9yY2VfbG93ZXJjYXNlX3VybHMnKSkKCQkJCQkJCQkJJGN1c3RvbV9vcHRpb25zID0g YXJyYXlfbWFwKCJzdHJ0b2xvd2VyIiwgJGN1c3RvbV9vcHRpb25zKTsKCQkJCQkJCQlpZiAo aW5fYXJyYXkoJHVyaV9jLCAkY3VzdG9tX29wdGlvbnMpKSB7CgkJCQkJCQkJCSRtYXRjaCA9 IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdkYXRlJzoKCQkJ CQkJCQlpZiAocHJlZ19tYXRjaCgnL15cZHs0fVwvXGR7Mn1cL1xkezJ9JC8nLCAkdXJpX2Mp KSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydkYXRlJ10gPSBzdHJfcmVwbGFj ZSgnLycsICctJywgJHVyaV9jKTsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9 CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3llYXInOgoJCQkJCQkJCWlmIChwcmVnX21h dGNoKCcvXlxkezR9JC8nLCAkdXJpX2MpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50Wyd5ZWFyJ10gPSAkdXJpX2M7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJ fQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtb250aCc6CgkJCQkJCQljYXNlICdkYXkn OgoJCQkJCQkJCWlmIChwcmVnX21hdGNoKCcvXlxkezJ9JC8nLCAkdXJpX2MpKSB7CgkJCQkJ CQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WyR0eXBlXSA9ICR1cmlfYzsKCQkJCQkJCQkJJG1h dGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3BhZ2Un OgoJCQkJCQkJCWlmIChpc19udW1lcmljKCR1cmlfYykpIHsKCQkJCQkJCQkJJHByZXRleHRf cmVwbGFjZW1lbnRbJ3BnJ10gPSAkdXJpX2M7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJ CQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdmZWVkJzoKCQkJCQkJCQlpZiAo aW5fYXJyYXkoJHVyaV9jLCBhcnJheSgncnNzJywgJ2F0b20nKSkpIHsKCQkJCQkJCQkJJHBy ZXRleHRfcmVwbGFjZW1lbnRbJHVyaV9jXSA9IDE7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7 CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdzZWFyY2gnOgoJCQkJCQkJ CQkkcHJldGV4dF9yZXBsYWNlbWVudFsncSddID0gJHVyaV9jOwoJCQkJCQkJCQkkbWF0Y2gg PSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0ZXh0JzoKCQkJCQkJCQlpZiAo JHRoaXMtPmVuY29kZV91cmwoJHRleHQpID09ICR1cmlfYykgewoJCQkJCQkJCQkkbWF0Y2gg PSB0cnVlOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsicGVybWxpbmtfdGV4dF97 JG5hbWV9Il0gPSAkdXJpX2M7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNl ICdyZWdleCc6CgkJCQkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHJlZ2V4IGlzIHZhbGlkIHdp dGhvdXQgb3V0cHV0dGluZyBlcnJvciBtZXNzYWdlcy4KCQkJCQkJCQlvYl9zdGFydCgpOwoJ CQkJCQkJCXByZWdfbWF0Y2goJHJlZ2V4LCAkdXJpX2MsICRyZWdleF9tYXRjaGVzKTsKCQkJ CQkJCQkkaXNfdmFsaWRfcmVnZXggPSAhKG9iX2dldF9jbGVhbigpKTsKCQkJCQkJCQlpZiAo JGlzX3ZhbGlkX3JlZ2V4ICYmIEAkcmVnZXhfbWF0Y2hlc1swXSkgewoJCQkJCQkJCQkkbWF0 Y2ggPSB0cnVlOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsicGVybWxpbmtfcmVn ZXhfeyRuYW1lfSJdID0gJHJlZ2V4X21hdGNoZXNbMF07CgkJCQkJCQkJfQoJCQkJCQkJYnJl YWs7CgkJCQkJCX0gLy8gc3dpdGNoIHR5cGUgZW5kCgoJCQkJCQkvLyBVcGRhdGUgdGhlIGFy dGljbGUgY29udGV4dCBzdHJpbmcKCQkJCQkJJGNvbnRleHRfc3RyID0gKGNvdW50KCRjb250 ZXh0KSA+IDAgPyAnYW5kICcuam9pbignIGFuZCAnLCAkY29udGV4dCkgOiAnJyk7CgoJCQkJ CQkkdGhpcy0+ZGVidWcoKCRtYXRjaCA9PSB0cnVlKSA/ICdZRVMnIDogJ05PJyk7CgoJCQkJ CQlpZiAoISRtYXRjaCAmJiAhJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCAmJiAkdGhpcy0+cHJl ZigndXNlX2NsZWF2ZXJfcGFydGlhbF9tYXRjaGVzJykpIHsKCQkJCQkJCS8vIFRoZXJlIGhh c24ndCBiZWVuIGEgbWF0Y2ggb3IgYSBjb21wbGV0ZSBjbGVhdmVyIHBhcnRpYWwgbWF0Y2gu IExldHMgdHJ5IHRvIGJlIGNsZWF2ZXIgYW5kCgkJCQkJCQkvLyBjaGVjayB0byBzZWUgaWYg dGhpcyBjb21wb25lbnQgaXMgZWl0aGVyIGEgdGl0bGUsIHBhZ2Ugb3IgYSBmZWVkLiBUaGlz IG1ha2VzIGl0IG1vcmUgcHJvYmFibGUKCQkJCQkJCS8vIGEgc3VjY2Vzc2Z1bCBtYXRjaCBm b3IgYSBnaXZlbiBwZXJtbGluayBydWxlIG9jY3Vycy4KCQkJCQkJCSR0aGlzLT5kZWJ1Zygn Q2hlY2tpbmcgaWYgIicuJHVyaV9jLiciIGlzIG9mIHR5cGUgInRpdGxlX3BhZ2VfZmVlZCIn KTsKCgkJCQkJCQlpZiAoJHR5cGUgIT0gJ3RpdGxlJyAmJiAkdXJsX3RpdGxlID0gc2FmZV9m aWVsZCgndXJsX3RpdGxlJywgJ3RleHRwYXR0ZXJuJywgImB1cmxfdGl0bGVgIGxpa2UgJyR1 cmlfYycgJGNvbnRleHRfc3RyIGFuZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEiKSkgewoJCQkJ CQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wyd1cmxfdGl0bGUnXSA9ICR1cmxfdGl0bGU7CgkJ CQkJCQkJJHByZXRleHRbJ251bVBhZ2VzJ10gPSAxOwoJCQkJCQkJCSRwcmV0ZXh0Wydpc19h cnRpY2xlX2xpc3QnXSA9IGZhbHNlOwoJCQkJCQkJCSRjbGVhdmVyX3BhcnRpYWxfbWF0Y2gg PSB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmICgkdGhpcy0+cHJlZignY2xlYW5fcGFnZV9hcmNo aXZlX2xpbmtzJykgJiYgJHR5cGUgIT0gJ3BhZ2UnICYmIGlzX251bWVyaWMoJHVyaV9jKSkg ewoJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZyddID0gJHVyaV9jOwoJCQkJCQkJ CSRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPSB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmICgkdHlw ZSAhPSAnZmVlZCcgJiYgaW5fYXJyYXkoJHVyaV9jLCBhcnJheSgncnNzJywgJ2F0b20nKSkp IHsKCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFskdXJpX2NdID0gMTsKCQkJCQkJCQkk Y2xlYXZlcl9wYXJ0aWFsX21hdGNoID0gdHJ1ZTsKCQkJCQkJCX0KCgkJCQkJCQkkdGhpcy0+ ZGVidWcoKCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPT0gdHJ1ZSkgPyAnWUVTJyA6ICdOTycp OwoKCQkJCQkJCWlmICgkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJCQkJJHRoaXMt PmNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50OwoKCQkJCQkJ CQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNoYW5nZXMgY291bGQgb2YgYmVl biBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJCQkJCXVuc2V0KCRwcmV0ZXh0 X3JlcGxhY2VtZW50KTsKCgkJCQkJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9IHRydWU7 CgkJCQkJCQkJY29udGludWUgMjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0gLy8gY2hlY2sg dHlwZSBlbmQKCgkJCQkJLy8gQnJlYWsgZWFybHkgaWYgdGhlIGNvbXBvbmVudCBkb2Vzbid0 IG1hdGNoLCBhcyB0aGVyZSBpcyBubyBwb2ludCBjb250aW51aW5nCgkJCQkJaWYgKCRtYXRj aCA9PSBmYWxzZSkgewoJCQkJCQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNo YW5nZXMgY291bGQgb2YgYmVlbiBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJ CQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudCk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJ CX0gLy8gZm9yZWFjaCBwZXJtbGluayBjb21wb25lbnQgZW5kCgoJCQkJaWYgKCFpc3NldCgk cHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSkpIHsKCQkJCQlpZiAoaXNzZXQoJHByZXRleHRf cmVwbGFjZW1lbnRbJ3VybF90aXRsZSddKSkgewoJCQkJCQlpZiAoaXNzZXQoJHByZXRleHRf cmVwbGFjZW1lbnRbJ2RhdGUnXSkpIHsKCQkJCQkJCSRkYXRlX3ZhbCA9ICRwcmV0ZXh0X3Jl cGxhY2VtZW50WydkYXRlJ107CgkJCQkJCX0gZWxzZSBpZiAoaXNzZXQoJHByZXRleHRfcmVw bGFjZW1lbnRbJ3llYXInXSkpIHsKCQkJCQkJCSRkYXRlX3ZhbCA9ICRwcmV0ZXh0X3JlcGxh Y2VtZW50Wyd5ZWFyJ107CgkJCQkJCQlpZiAoaXNzZXQoJHByZXRleHRfcmVwbGFjZW1lbnRb J21vbnRoJ10pKSB7CgkJCQkJCQkJJGRhdGVfdmFsIC49ICctJyAuICRwcmV0ZXh0X3JlcGxh Y2VtZW50Wydtb250aCddOwoJCQkJCQkJCWlmIChpc3NldCgkcHJldGV4dF9yZXBsYWNlbWVu dFsnZGF5J10pKSB7CgkJCQkJCQkJCSRkYXRlX3ZhbCAuPSAnLScgLiAkcHJldGV4dF9yZXBs YWNlbWVudFsnZGF5J107CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmIChp c3NldCgkZGF0ZV92YWwpKQoJCQkJCQkJJGNvbnRleHRfc3RyIC49ICIgYW5kIGBQb3N0ZWRg IGxpa2UgJyRkYXRlX3ZhbCUnIjsKCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93KCdJRCwgUG9z dGVkJywgJ3RleHRwYXR0ZXJuJywgImB1cmxfdGl0bGVgIGxpa2UgJ3skcHJldGV4dF9yZXBs YWNlbWVudFsndXJsX3RpdGxlJ119JyAkY29udGV4dF9zdHIgYW5kIGBTdGF0dXNgID49IDQg b3JkZXIgYnkgYFBvc3RlZGAgZGVzYyBsaW1pdCAxIikpIHsKCQkJCQkJCWlmIChpc3NldCgk ZGF0ZV92YWwpKQoJCQkJCQkJCSR0aGlzLT5kZWJ1ZygnRm91bmQgZGF0ZSBhbmQgdGl0bGUt YmFzZWQgbWF0Y2guJyk7CgkJCQkJCQllbHNlCgkJCQkJCQkJJHRoaXMtPmRlYnVnKCdGb3Vu ZCB0aXRsZS1iYXNlZCBtYXRjaC4nKTsKCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydp ZCddID0gJHJzWydJRCddOwoJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3RlZCdd ID0gJHJzWydQb3N0ZWQnXTsKCQkJCQkJCSRwcmV0ZXh0WydudW1QYWdlcyddID0gMTsKCQkJ CQkJCSRwcmV0ZXh0Wydpc19hcnRpY2xlX2xpc3QnXSA9IGZhbHNlOwoJCQkJCQl9IGVsc2Ug ewoJCQkJCQkJJG1hdGNoID0gZmFsc2U7CgkJCQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNl bWVudCk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCRtYXRjaCB8fCAkcGFydGlh bF9tYXRjaCB8fCAkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJLy8gRXh0cmFjdCB0 aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGVybWxpbmsKCQkJCQlAZXh0cmFjdCgkcGVybWxpbmtz WyRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZXJtbGlua19pZCddXVsnc2V0dGluZ3MnXSk7CgoJ CQkJCS8vIENoZWNrIHRoZSBwZXJtbGluayBzZWN0aW9uIGFuZCBjYXRlZ29yeSBjb25kaXRp b25zCgkJCQkJaWYgKCghZW1wdHkoJGNvbl9zZWN0aW9uKSAmJiAkY29uX3NlY3Rpb24gIT0g QCRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10pIHx8CgkJCQkJKCFlbXB0eSgkY29uX2NhdGVn b3J5KSAmJiAkY29uX2NhdGVnb3J5ICE9IEAkcHJldGV4dF9yZXBsYWNlbWVudFsnYyddKSkg ewoJCQkJCQkkdGhpcy0+ZGVidWcoJ1Blcm1saW5rIGNvbmRpdGlvbnMgZmFpbGVkJyk7CgkJ CQkJCWlmIChAJGNvbl9zZWN0aW9uKSAgJHRoaXMtPmRlYnVnKCdjb25fc2VjdGlvbiA9ICcu ICRjb25fc2VjdGlvbik7CgkJCQkJCWlmIChAJGNvbl9jYXRlZ29yeSkgJHRoaXMtPmRlYnVn KCdjb25fY2F0ZWdvcnkgPSAnLiAkY29uX2NhdGVnb3J5KTsKCgkJCQkJCXVuc2V0KCRwcmV0 ZXh0X3JlcGxhY2VtZW50KTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoJG1hdGNoICYmIGlzc2V0 KCRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJJHRoaXMtPmRlYnVnKCdXZSBoYXZlIGEg bWF0Y2ghJyk7CgoJCQkJCWVsc2UgaWYgKCRwYXJ0aWFsX21hdGNoICYmIGNvdW50KCR0aGlz LT5wYXJ0aWFsX21hdGNoZXMpKQoJCQkJCQkkdGhpcy0+ZGVidWcoJ1dlIGhhdmUgYSBcJ3Bh cnRpYWwgbWF0Y2hcJycpOwoKCQkJCQllbHNlIGlmICgkY2xlYXZlcl9wYXJ0aWFsX21hdGNo ICYmIGlzc2V0KCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2gpKQoJCQkJCQkkdGhpcy0+ZGVidWco J1dlIGhhdmUgYSBcJ2NsZWF2ZXIgcGFydGlhbCBtYXRjaFwnJyk7CgoJCQkJCWVsc2UgewoJ CQkJCQkkdGhpcy0+ZGVidWcoJ0Vycm9yOiBDYW5cJ3QgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0 IHR5cGUgbWF0Y2gnKTsKCQkJCQkJLy8gVGhpcyBwZXJtbGluayBoYXMgZmFpbGVkLCBjb250 aW51ZSBleGVjdXRpb24gb2YgdGhlIGZvcmVhY2ggcGVybWxpbmtzIGxvb3AKCQkJCQkJdW5z ZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBXZSBoYXZl IGEgbWF0Y2gKCQkJCWlmIChAJHByZXRleHRfcmVwbGFjZW1lbnQpCgkJCQkJYnJlYWs7CgoJ CQl9IC8vIGZvcmVhY2ggcGVybWxpbmtzIGVuZAoKCQkJLy8gSWYgdGhlcmUgaXMgbm8gbWF0 Y2ggcmVzdG9yZSB0aGUgbW9zdCBsaWtlbHkgcGFydGlhbCBtYXRjaC4gU29ydGVkIGJ5IG51 bWJlciBvZiBjb21wb25lbnRzIGFuZCB0aGVuIHByZWNlZGVuY2UKCQkJaWYgKCFAJHByZXRl eHRfcmVwbGFjZW1lbnQgJiYgY291bnQoJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcykpIHsKCQkJ CSRwdF9zbGljZSA9IGFycmF5X3NsaWNlKCR0aGlzLT5wYXJ0aWFsX21hdGNoZXMsIC0xKTsK CQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfc2hpZnQoJHB0X3NsaWNlKTsKCQkJ fQoJCQl1bnNldCgkdGhpcy0+cGFydGlhbF9tYXRjaGVzKTsKCgkJCS8vIFJlc3RvcmUgdGhl IGNsZWF2ZXJfcGFydGlhbF9tYXRjaCBpZiB0aGVyZSBpcyBubyBvdGhlciBtYXRjaGVzCgkJ CWlmICghQCRwcmV0ZXh0X3JlcGxhY2VtZW50ICYmICR0aGlzLT5jbGVhdmVyX3BhcnRpYWxf bWF0Y2gpCgkJCQkkcHJldGV4dF9yZXBsYWNlbWVudCA9ICR0aGlzLT5jbGVhdmVyX3BhcnRp YWxfbWF0Y2g7CgkJCXVuc2V0KCR0aGlzLT5jbGVhdmVyX3BhcnRpYWxfbWF0Y2gpOwoKCQkJ Ly8gRXh0cmFjdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGVybWxpbmsKCQkJQGV4dHJhY3Qo JHBlcm1saW5rc1skcHJldGV4dF9yZXBsYWNlbWVudFsncGVybWxpbmtfaWQnXV1bJ3NldHRp bmdzJ10pOwoKCQkJLy8gSWYgcHJldGV4dF9yZXBsYWNlbWVudCBpcyBzdGlsbCBzZXQgaGVy ZSB0aGVuIHdlIGhhdmUgYSBtYXRjaAoJCQlpZiAoQCRwcmV0ZXh0X3JlcGxhY2VtZW50KSB7 CgkJCQkkdGhpcy0+ZGVidWcoJ1ByZXRleHQgUmVwbGFjZW1lbnQgJy5wcmludF9yKCRwcmV0 ZXh0X3JlcGxhY2VtZW50LCAxKSk7CgoJCQkJaWYgKCFlbXB0eSgkZGVzX3NlY3Rpb24pKQoJ CQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10gPSAkZGVzX3NlY3Rpb247CgkJCQlpZiAo IWVtcHR5KCRkZXNfY2F0ZWdvcnkpKQoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydjJ10g PSAkZGVzX2NhdGVnb3J5OwoJCQkJaWYgKCFlbXB0eSgkZGVzX2ZlZWQpKQoJCQkJCSRwcmV0 ZXh0X3JlcGxhY2VtZW50WyRkZXNfZmVlZF0gPSAxOwoKCQkJCWlmIChAJHByZXRleHRfcmVw bGFjZW1lbnRbJ2lkJ10gJiYgQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydQb3N0ZWQnXSkgewoJ CQkJCWlmICgkbnAgPSBnZXROZXh0UHJldigkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSwg JHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3RlZCddLCBAJHByZXRleHRfcmVwbGFjZW1lbnRb J3MnXSkpCgkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfbWVyZ2UoJHByZXRl eHRfcmVwbGFjZW1lbnQsICRucCk7CgkJCQl9CgkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNl bWVudFsnUG9zdGVkJ10pOwoKCQkJCS8vIElmIHRoZXJlIGlzIGEgbWF0Y2ggdGhlbiB3ZSBt b3N0IHNldCB0aGUgaHR0cCBzdGF0dXMgY29ycmVjdGx5IGFzIHR4cCdzIHByZXRleHQgbWln aHQgc2V0IGl0IHRvIDQwNAoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3N0YXR1cyddID0g JzIwMCc7CgoJCQkJLy8gU3RvcmUgdGhlIG9yZ2luaWFsIEhUVFAgc3RhdHVzIGNvZGUKCQkJ CS8vIFdlIG1pZ2h0IG5lZWQgdG8gbG9nIHRoZSBwYWdlIGhpdCBpZiBpdCBlcXVhbHMgNDA0 CgkJCQkkb3JnaW5pYWxfc3RhdHVzID0gJHByZXRleHRbJ3N0YXR1cyddOwoKCQkJCS8vIFR4 cCBvbmx5IGxvb2tzIGF0IHRoZSBtb250aCwgYnV0IGR1ZSB0byBob3cgd2UgcGhhc2UgdGhl IG1vbnRoIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBzcWwgdG8gb3VyIG5lZWRzCgkJCQlpZiAo YXJyYXlfa2V5X2V4aXN0cygnZGF0ZScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkgewoJCQkJ CSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydtb250aCddID0gJHByZXRleHRfcmVwbGFjZW1lbnRb J2RhdGUnXTsKCQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnZGF0ZSddKTsKCQkJ CX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygneWVhcicsICRwcmV0ZXh0X3JlcGxhY2Vt ZW50KSB8fAoJCQkJYXJyYXlfa2V5X2V4aXN0cygnbW9udGgnLCAkcHJldGV4dF9yZXBsYWNl bWVudCkgfHwKCQkJCWFycmF5X2tleV9leGlzdHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2Vt ZW50KSkgewoJCQkJCSRtb250aCA9ICcnOwoJCQkJCSRtb250aCAuPSAoYXJyYXlfa2V5X2V4 aXN0cygneWVhcicsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9y ZXBsYWNlbWVudFsneWVhciddLictJyA6ICdfX19fLSc7CgkJCQkJJG1vbnRoIC49IChhcnJh eV9rZXlfZXhpc3RzKCdtb250aCcsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAk cHJldGV4dF9yZXBsYWNlbWVudFsnbW9udGgnXS4nLScgOiAnX18tJzsKCQkJCQkkbW9udGgg Lj0gKGFycmF5X2tleV9leGlzdHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJ CQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsnZGF5J10uJyAnIDogJ19fICc7CgoJCQkJCSRw cmV0ZXh0X3JlcGxhY2VtZW50Wydtb250aCddID0gJG1vbnRoOwoJCQkJCXVuc2V0KCRwcmV0 ZXh0X3JlcGxhY2VtZW50Wyd5ZWFyJ10pOwoJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydkYXknXSk7CgkJCQl9CgoJCQkJLy8gU2VjdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVk IHNvIHdlIGNhbiBhbHdheXMgZ2V0IGEgcGFnZSB0ZW1wbGF0ZS4KCQkJCWlmICghYXJyYXlf a2V5X2V4aXN0cygncycsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCXsKCQkJCQlpZiAo IUAkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSkKCQkJCQkJJHByZXRleHRfcmVwbGFjZW1l bnRbJ3MnXSA9ICdkZWZhdWx0JzsKCQkJCQllbHNlCgkJCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydzJ10gPSBzYWZlX2ZpZWxkKCdTZWN0aW9uJywgJ3RleHRwYXR0ZXJuJywgJ0lEID0g Jy4kcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSk7CgkJCQl9CgoJCQkJLy8gU2V0IHRoZSBj c3MgYW5kIHBhZ2UgdGVtcGxhdGUsIG90aGVyd2lzZSB3ZSBnZXQgYW4gdW5rbm93biBzZWN0 aW9uCgkJCQkkc2VjdGlvbl9zZXR0aW5ncyA9IHNhZmVfcm93KCdjc3MsIHBhZ2UnLCAndHhw X3NlY3Rpb24nLCAibmFtZSA9ICd7JHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXX0nIGxpbWl0 IDEiKTsKCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydwYWdlJ10gPSAoQCRkZXNfcGFnZSkg PyAkZGVzX3BhZ2UgOiAkc2VjdGlvbl9zZXR0aW5nc1sncGFnZSddOwoJCQkJJHByZXRleHRf cmVwbGFjZW1lbnRbJ2NzcyddICA9ICRzZWN0aW9uX3NldHRpbmdzWydjc3MnXTsKCgkJCQkk dGhpcy0+bWF0Y2hlZF9wZXJtbGluayA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50OwoKCQkJCWds b2JhbCAkcGVybWxpbmtfbW9kZTsKCgkJCQlpZiAoaW5fYXJyYXkoJHByZWZzWydwZXJtbGlu a19tb2RlJ10sIGFycmF5KCdpZF90aXRsZScsICdzZWN0aW9uX2lkX3RpdGxlJykpICYmIEAk cHJldGV4dF9yZXBsYWNlbWVudFsncGcnXSAmJiAhQCRwcmV0ZXh0X3JlcGxhY2VtZW50Wydp ZCddKSB7CgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2lkJ10gPSAnJzsKCQkJCQkkcHJl dGV4dF9yZXBsYWNlbWVudFsnaXNfYXJ0aWNsZV9saXN0J10gPSB0cnVlOwoJCQkJfQoKCQkJ CS8vIE1lcmdlIHByZXRleHRfcmVwbGFjZW1lbnQgd2l0aCBwcmV0ZXh0CgkJCQkkcHJldGV4 dCA9IGFycmF5X21lcmdlKCRwcmV0ZXh0LCAkcHJldGV4dF9yZXBsYWNlbWVudCk7CgoJCQkJ aWYgKGlzX251bWVyaWMoQCRwcmV0ZXh0WydpZCddKSkgewoJCQkJCSRhID0gc2FmZV9yb3co JyosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCwgdW5peF90aW1lc3RhbXAo RXhwaXJlcykgYXMgdUV4cGlyZXMsIHVuaXhfdGltZXN0YW1wKExhc3RNb2QpIGFzIHVMYXN0 TW9kJywgJ3RleHRwYXR0ZXJuJywgJ0lEPScuaW50dmFsKCRwcmV0ZXh0WydpZCddKS4nIGFu ZCBTdGF0dXMgPj0gNCcpOwoJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJGEpOwoJCQkJfQoK CQkJCS8vIEV4cG9ydCByZXF1aXJlZCB2YWx1ZXMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UK CQkJCWZvcmVhY2ggKGFycmF5KCdpZCcsICdzJywgJ2MnLCAncGcnLCAnaXNfYXJ0aWNsZV9s aXN0JywgJ3ByZXZfaWQnLCAncHJldl90aXRsZScsICduZXh0X2lkJywgJ25leHRfdGl0bGUn LCAnY3NzJykgYXMgJGtleSkgewoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICRw cmV0ZXh0KSkKCQkJCQkJJEdMT0JBTFNbJGtleV0gPSAkcHJldGV4dFska2V5XTsKCQkJCX0K CgkJCQlpZiAoY291bnQoJHRoaXMtPm1hdGNoZWRfcGVybWxpbmspIHx8IEAkbXRfcmVkaXJl Y3QpIHsKCQkJCQkkcGxfaW5kZXggPSAkcHJldGV4dFsncGVybWxpbmtfaWQnXTsKCQkJCQlp ZiAoIUAkbXRfcmVkaXJlY3QgfHwgISR0aGlzLT5wcmVmKCdyZWRpcmVjdF9tdF9zdHlsZV9s aW5rcycpKSB7CgkJCQkJCSRwbCA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJHByZXRleHRbJ3Bl cm1saW5rX2lkJ10pOwoJCQkJCQkkcGxfaW5kZXggPSBAJHBsWydzZXR0aW5ncyddWydkZXNf cGVybWxpbmsnXTsKCQkJCQl9CgoJCQkJCWlmIChAJHByZXRleHRbJ2lkJ10gJiYgJHBsX2lu ZGV4KSB7CgkJCQkJCWlmIChjb3VudCgkdGhpcy0+Z2V0X3Blcm1saW5rKCRwbF9pbmRleCkp ID4gMCkgewoJCQkJCQkJb2JfY2xlYW4oKTsKCQkJCQkJCWdsb2JhbCAkc2l0ZXVybDsKCQkJ CQkJCSRycyA9IHNhZmVfcm93KCcqLCBJRCBhcyB0aGlzaWQsIHVuaXhfdGltZXN0YW1wKFBv c3RlZCkgYXMgcG9zdGVkJywgJ3RleHRwYXR0ZXJuJywgIklEID0gJ3skcHJldGV4dFsnaWQn XX0nIik7CgkJCQkJCQkkaG9zdCA9IHJ0cmltKHN0cl9yZXBsYWNlKHJ0cmltKGRvU3RyaXAo JHByZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCQkJCQkkdGhp cy0+cmVkaXJlY3QoJGhvc3QuJHRoaXMtPl9wZXJtbGlua3VybCgkcnMsIFBFUk1MSU5LVVJM LCAkcGxfaW5kZXgpLCAkdGhpcy0+cHJlZigncGVybWxpbmtfcmVkaXJlY3RfaHR0cF9zdGF0 dXMnKSk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgaWYgKCR1cmwgPSBAJHBsWydzZXR0aW5ncydd WydkZXNfbG9jYXRpb24nXSkgewoJCQkJCQlvYl9jbGVhbigpOwoJCQkJCQkkdGhpcy0+cmVk aXJlY3QoJHVybCwgJHRoaXMtPnByZWYoJ3VybF9yZWRpcmVjdF9odHRwX3N0YXR1cycpKTsK CQkJCQl9CgkJCQl9CgoJCQkJaWYgKEAkcHJldGV4dFsncnNzJ10pIHsKCQkJCQlpZiAoQCRw cmV0ZXh0WydzJ10pCgkJCQkJCSRfUE9TVFsnc2VjdGlvbiddID0gJHByZXRleHRbJ3MnXTsK CQkJCQlpZiAoQCRwcmV0ZXh0WydjJ10pCgkJCQkJCSRfUE9TVFsnY2F0ZWdvcnknXSA9ICRw cmV0ZXh0WydjJ107CgkJCQkJb2JfY2xlYW4oKTsKCQkJCQlpbmNsdWRlIHR4cGF0aC4nL3B1 Ymxpc2gvcnNzLnBocCc7CgkJCQkJZXhpdChyc3MoKSk7CgkJCQl9CgoJCQkJaWYgKEAkcHJl dGV4dFsnYXRvbSddKSB7CgkJCQkJaWYgKEAkcHJldGV4dFsncyddKQoJCQkJCQkkX1BPU1Rb J3NlY3Rpb24nXSA9ICRwcmV0ZXh0WydzJ107CgkJCQkJaWYgKEAkcHJldGV4dFsnYyddKQoJ CQkJCQkkX1BPU1RbJ2NhdGVnb3J5J10gPSAkcHJldGV4dFsnYyddOwoJCQkJCW9iX2NsZWFu KCk7CgkJCQkJaW5jbHVkZSB0eHBhdGguJy9wdWJsaXNoL2F0b20ucGhwJzsKCQkJCQlleGl0 KGF0b20oKSk7CgkJCQl9CgoJCQkJJHRoaXMtPmRlYnVnKCdQcmV0ZXh0ICcucHJpbnRfcigk cHJldGV4dCwgMSkpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdOTyBDSEFOR0VT IE1BREUnKTsKCQkJfQoKCQkJLy8gTG9nIHRoaXMgcGFnZSBoaXQKCQkJaWYgKEAkb3JnaW5p YWxfc3RhdHVzID09IDQwNCkKCQkJCWxvZ19oaXQoJHByZXRleHRbJ3N0YXR1cyddKTsKCgkJ CS8vIFN0YXJ0IG91dHB1dCBidWZmZXJpbmcgYW5kIHBzZXVkbyBjYWxsYmFjayB0byB0ZXh0 cGF0dGVybl9lbmQKCQkJb2Jfc3RhcnQoYXJyYXkoJiR0aGlzLCAnX3RleHRwYXR0ZXJuX2Vu ZF9jYWxsYmFjaycpKTsKCgkJCS8vIFR4UCA0LjAuNSAocjI0MzYpIGludHJvZHVjZWQgdGhl IHRleHRwYXR0ZXJuX2VuZCBjYWxsYmFjayBtYWtpbmcgdGhlIGZvbGxvd2luZyByZWR1bmRh bnQKCQkJJHZlcnNpb24gPSBhcnJheV9zdW0oYXJyYXlfbWFwKAoJCQkJY3JlYXRlX2Z1bmN0 aW9uKCckbGluZScsICdpZiAocHJlZ19tYXRjaChcJy9eXCQnLidMYXN0Q2hhbmdlZFJldmlz aW9uOiAoXHcrKSBcJC9cJywgJGxpbmUsICRtYXRjaCkpIHJldHVybiAkbWF0Y2hbMV07Jyks CgkJCQlAZmlsZSh0eHBhdGggLiAnL3B1Ymxpc2gucGhwJykKCQkJKSk7CgkJCWlmICgkdmVy c2lvbiA+PSAnMjQzNicpIHJldHVybjsKCgkJCS8vIFJlbW92ZSB0aGUgcGx1Z2luIGNhbGxi YWNrcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQKCQkJZnVuY3Rpb24gZmlsdGVy X2NhbGxiYWNrcygkYykgewoJCQkJaWYgKCRjWydldmVudCddIT0ndGV4dHBhdHRlcm4nKSBy ZXR1cm4gdHJ1ZTsKCQkJCWlmIChAJGNbJ2Z1bmN0aW9uJ11bMF0tPnBsdWdpbl9uYW1lID09 ICdnYnBfcGVybWFuZW50X2xpbmtzJyAmJgoJCQkJCQlAJGNbJ2Z1bmN0aW9uJ11bMV0gPT0g J190ZXh0cGF0dGVybicpCgkJCQl7CgkJCQkJJEdMT0JBTFNbJ2dicF9mb3VuZF9zZWxmJ10g PSB0cnVlOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCXJldHVybiBAJEdMT0JBTFNb J2dicF9mb3VuZF9zZWxmJ107CgkJCX0KCQkJJHBsdWdpbl9jYWxsYmFjayA9IGFycmF5X2Zp bHRlcigkcGx1Z2luX2NhbGxiYWNrLCAnZmlsdGVyX2NhbGxiYWNrcycpOwoJCQl1bnNldCgk R0xPQkFMU1snZ2JwX2ZvdW5kX3NlbGYnXSk7CgoJCQkvLyBSZS1jYWxsIHRleHRwYXR0ZXJu CgkJCXRleHRwYXR0ZXJuKCk7CgoJCQkvLyBDYWxsIGN1c3RvbSB0ZXh0cGF0dGVybl9lbmQg Y2FsbGJhY2sKCQkJJHRoaXMtPl90ZXh0cGF0dGVybl9lbmQoKTsKCgkJCS8vIHRleHRwYXR0 ZXJuKCkgaGFzIHJ1biwga2lsbCB0aGUgY29ubmVjdGlvbgoJCQlkaWUoKTsKCQl9CgoJfSAv LyBmdW5jdGlvbiBfdGV4dHBhdHRlcm4gZW5kCgoJZnVuY3Rpb24gX3RleHRwYXR0ZXJuX2Vu ZCAoKSB7CgkJLy8gUmVkaXJlY3QgdG8gYSA0MDQgaWYgdGhlIHBhZ2UgbnVtYmVyIGlzIGdy ZWF0ZXIgdGhhbiB0aGUgbWF4IG51bWJlciBvZiBwYWdlcwoJCS8vIEhhcyB0byBiZSBhZnRl ciB0ZXh0cGF0dGVybigpIGFzICR0aGlzcGFnZSBpcyBzZXQgZHVyaW5nIDx0eHA6YXJ0aWNs ZSAvPgoJCWdsb2JhbCAkdGhpc3BhZ2UsICRwcmV0ZXh0OwoJCWlmICgoQCRwcmV0ZXh0Wydw ZyddICYmIGlzc2V0KCR0aGlzcGFnZSkpICYmCgkJKCR0aGlzcGFnZVsnbnVtUGFnZXMnXSA8 ICRwcmV0ZXh0WydwZyddKSkgewoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJdHhwX2RpZShnVHh0 KCc0MDRfbm90X2ZvdW5kJyksICc0MDQnKTsKCQl9CgoJCS8vIFN0b3Agb3V0cHV0IGJ1ZmZl cmluZywgdGhpcyBzZW5kcyB0aGUgYnVmZmVyIHRvIF90ZXh0cGF0dGVybl9lbmRfY2FsbGJh Y2soKQoJCXdoaWxlIChAb2JfZW5kX2ZsdXNoKCkpOwoKCX0gLy8gZnVuY3Rpb24gX3RleHRw YXR0ZXJuX2VuZCBlbmQKCglmdW5jdGlvbiBfdGV4dHBhdHRlcm5fZW5kX2NhbGxiYWNrICgk aHRtbCwgJG92ZXJyaWRlID0gJycpIHsKCQlnbG9iYWwgJHByZXRleHQsICRwcm9kdWN0aW9u X3N0YXR1czsKCgkJaWYgKCRvdmVycmlkZSkgJHByZXRleHRbJ3Blcm1saW5rX292ZXJyaWRl J10gPSAkb3ZlcnJpZGU7CgkJJGh0bWwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCgkJCScl aHJlZj0iKCcuaHUuJ3xcPykoW14iXSopIiUnLAoJCQlhcnJheSgmJHRoaXMsICdfcGFnZWxp bmt1cmwnKSwKCQkJJGh0bWwKCQkpOwoJCXVuc2V0KCRwcmV0ZXh0WydwZXJtbGlua19vdmVy cmlkZSddKTsKCgkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpICYmIGluX2FycmF5KCRwcm9k dWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpIHsKCQkJJGRlYnVn ID0gam9pbihuLCAkdGhpcy0+YnVmZmVyX2RlYnVnKTsKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1 ZyA9IGFycmF5KCk7CgkJCWlmICgkZGVidWcpCgkJCQkkaHRtbCA9IGNvbW1lbnQobi4kZGVi dWcubikgLiAkaHRtbDsKCQl9CgoJCXJldHVybiAkaHRtbDsKCX0gLy8gZnVuY3Rpb24gX3Rl eHRwYXR0ZXJuX2VuZF9jYWxsYmFjayBlbmQKCglmdW5jdGlvbiBjaGVja19wZXJtbGlua19j b25kaXRpb25zICgkcGwsICRhcnRpY2xlX2FycmF5KSB7CgkJaWYgKGVtcHR5KCRhcnRpY2xl X2FycmF5WydzZWN0aW9uJ10pKSAkYXJ0aWNsZV9hcnJheVsnc2VjdGlvbiddID0gQCRhcnRp Y2xlX2FycmF5WydTZWN0aW9uJ107CgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5WydjYXRl Z29yeTEnXSkpICRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTEnXSA9IEAkYXJ0aWNsZV9hcnJh eVsnQ2F0ZWdvcnkxJ107CgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTIn XSkpICRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTInXSA9IEAkYXJ0aWNsZV9hcnJheVsnQ2F0 ZWdvcnkyJ107CgoJCWlmIChAJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnknXSAmJiAo JHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnknXSAhPSAkYXJ0aWNsZV9hcnJheVsnY2F0 ZWdvcnkxJ10gfHwgJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnknXSAhPSAkYXJ0aWNs ZV9hcnJheVsnY2F0ZWdvcnkyJ10pKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKEAkcGxbJ3Nl dHRpbmdzJ11bJ2Nvbl9zZWN0aW9uJ10gJiYgJHBsWydzZXR0aW5ncyddWydjb25fc2VjdGlv biddICE9ICRhcnRpY2xlX2FycmF5WydzZWN0aW9uJ10pCgkJCXJldHVybiBmYWxzZTsKCgkJ cmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gX3Blcm1saW5rdXJsICgkYXJ0aWNsZV9hcnJh eSwgJHR5cGUgPSBQRVJNTElOS1VSTCwgJHBsX2luZGV4ID0gTlVMTCkgewoJCWdsb2JhbCAk cHJldGV4dCwgJHByZWZzLCAkcHJvZHVjdGlvbl9zdGF0dXM7CgoJCWlmICgkdHlwZSA9PSBQ QUdFTElOS1VSTCkKCQkJcmV0dXJuICR0aGlzLT50b2dnbGVfY3VzdG9tX3VybF9mdW5jKCdw YWdlbGlua3VybCcsICRhcnRpY2xlX2FycmF5KTsKCgkJaWYgKGVtcHR5KCRhcnRpY2xlX2Fy cmF5KSkgcmV0dXJuOwoKCQlpZiAoJHBsX2luZGV4KQoJCQkkcGwgPSAkdGhpcy0+Z2V0X3Bl cm1saW5rKCRwbF9pbmRleCk7CgkJZWxzZSB7CgkJCS8vIEdldCB0aGUgbWF0Y2hlZCBwcmV0 ZXh0IHJlcGxhY2VtZW50IGFycmF5LgoJCQkkbWF0Y2hlZCA9IChjb3VudCgkdGhpcy0+bWF0 Y2hlZF9wZXJtbGluaykpCgkJCT8gJHRoaXMtPm1hdGNoZWRfcGVybWxpbmsKCQkJOiBAYXJy YXlfc2hpZnQoYXJyYXlfc2xpY2UoJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcywgLTEpKTsKCgkJ CWlmICghaXNzZXQoJHBsKSAmJiAkbWF0Y2hlZCAmJiBhcnJheV9rZXlfZXhpc3RzKCdpZCcs ICRtYXRjaGVkKSkgewoJCQkJLy8gVGhlIHBlcm1saW5rIGlkIGlzIHN0b3JlZCBpbiB0aGUg cHJldGV4dCByZXBsYWNlbWVudCBhcnJheSwgc28gd2UgY2FuIGZpbmQgdGhlIHBlcm1saW5r LgoJCQkJJHBsID0gJHRoaXMtPmdldF9wZXJtbGluaygkbWF0Y2hlZFsncGVybWxpbmtfaWQn XSk7CgkJCQlmb3JlYWNoICgkcGxbJ2NvbXBvbmVudHMnXSBhcyAkcGxfYykKCQkJCQlpZiAo aW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXkoJ2ZlZWQnLCAncGFnZScpKSB8fCAhJHRo aXMtPmNoZWNrX3Blcm1saW5rX2NvbmRpdGlvbnMoJHBsLCAkYXJ0aWNsZV9hcnJheSkpIHsK CQkJCQkJdW5zZXQoJHBsKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQl9CgoJCQlpZiAoIWlz c2V0KCRwbCkpIHsKCQkJCS8vIFdlIGhhdmUgbm8gcGVybWxpbmsgaWQgc28gZ3JhYiB0aGUg cGVybWxpbmsgd2l0aCB0aGUgaGlnaGVzdCBwcmVjZWRlbmNlLgoJCQkJJHBlcm1saW5rcyA9 ICR0aGlzLT5nZXRfYWxsX3Blcm1saW5rcygxLCBhcnJheSgnZmVlZCcsICdwYWdlJykpOwoJ CQkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAka2V5ID0+ICRwbCkKCQkJCQlpZiAoISR0aGlz LT5jaGVja19wZXJtbGlua19jb25kaXRpb25zKCRwbCwgJGFydGljbGVfYXJyYXkpKQoJCQkJ CQl1bnNldCgkcGVybWxpbmtzWyRrZXldKTsKCQkJCSRwbCA9IGFycmF5X3NoaWZ0KCRwZXJt bGlua3MpOwoJCQl9CgkJfQoKCQkkdXJpID0gJyc7CgoJCWlmIChpc19hcnJheSgkcGwpICYm IGFycmF5X2tleV9leGlzdHMoJ2NvbXBvbmVudHMnLCAkcGwpKSB7CgkJCWV4dHJhY3QoJGFy dGljbGVfYXJyYXkpOwoKCQkJaWYgKCFpc3NldCgkdGl0bGUpKSAkdGl0bGUgPSAkVGl0bGU7 CgkJCWlmIChlbXB0eSgkdXJsX3RpdGxlKSkgJHVybF90aXRsZSA9IHN0cmlwU3BhY2UoJHRp dGxlKTsKCQkJaWYgKGVtcHR5KCRzZWN0aW9uKSkgJHNlY3Rpb24gPSAkU2VjdGlvbjsKCQkJ aWYgKGVtcHR5KCRwb3N0ZWQpKSAkcG9zdGVkID0gJFBvc3RlZDsKCQkJaWYgKGVtcHR5KCRh dXRob3JpZCkpICRhdXRob3JpZCA9IEAkQXV0aG9ySUQ7CgkJCWlmIChlbXB0eSgkY2F0ZWdv cnkxKSkgJGNhdGVnb3J5MSA9IEAkQ2F0ZWdvcnkxOwoJCQlpZiAoZW1wdHkoJGNhdGVnb3J5 MikpICRjYXRlZ29yeTIgPSBAJENhdGVnb3J5MjsKCQkJaWYgKGVtcHR5KCR0aGlzaWQpKSAk dGhpc2lkID0gJElEOwoKCQkJJHBsX2NvbXBvbmVudHMgPSAkcGxbJ2NvbXBvbmVudHMnXTsK CgkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRpdGxlIGNvbXBvbmVudC4KCQkJ JHRpdGxlID0gZmFsc2U7CgkJCWZvcmVhY2goJHBsX2NvbXBvbmVudHMgYXMgJHBsX2MpCgkJ CQlpZiAoJHBsX2NbJ3R5cGUnXSA9PSAndGl0bGUnIHx8ICRwbF9jWyd0eXBlJ10gPT0gJ2lk JykKCQkJCQkkdGl0bGUgPSB0cnVlOwoKCQkJLy8gSWYgdGhlcmUgaXNuJ3QgYSB0aXRsZSBj b21wb25lbnQgdGhlbiB3ZSBuZWVkIHRvIGFwcGVuZCBvbmUgdG8gdGhlIGVuZCBvZiB0aGUg VVJJCgkJCWlmICghJHRpdGxlICYmICR0aGlzLT5wcmVmKCdhdXRvbWF0aWNhbGx5X2FwcGVu ZF90aXRsZScpKQoJCQkJJHBsX2NvbXBvbmVudHNbXSA9IGFycmF5KCd0eXBlJyA9PiAndGl0 bGUnLCAncHJlZml4JyA9PiAnJywgJ3N1ZmZpeCcgPT4gJycsICdyZWdleCcgPT4gJycsICd0 ZXh0JyA9PiAnJyk7CgoJCQkkdXJpID0gcnRyaW0oZG9TdHJpcChAJHByZXRleHRbJ3N1YnBh dGgnXSksICcvJyk7CgkJCWZvcmVhY2ggKCRwbF9jb21wb25lbnRzIGFzICRwbF9jKSB7CgkJ CQkkdXJpIC49ICcvJzsKCgkJCQkkdHlwZSA9ICRwbF9jWyd0eXBlJ107CgkJCQlzd2l0Y2gg KCR0eXBlKSB7CgkJCQkJY2FzZSAnY2F0ZWdvcnknOgoJCQkJCQlpZiAoIUAkcGxfY1snY2F0 ZWdvcnknXSkgJHBsX2NbJ2NhdGVnb3J5J10gPSAxOwoJCQkJCQkkcHJpbWFyeSA9ICdjYXRl Z29yeScuICRwbF9jWydjYXRlZ29yeSddOwoJCQkJCQkkc2Vjb25kYXJ5ID0gJ2NhdGVnb3J5 Jy4gKDMtKGludCkkcGxfY1snY2F0ZWdvcnknXSk7CgkJCQkJCSRjaGVja19jb250ZXh0ID0g KCR0aGlzLT5wcmVmKCdqb2luX3ByZXRleHRfdG9fcGFnZWxpbmtzJykgJiYgJHRoaXMtPnBy ZWYoJ2NoZWNrX3ByZXRleHRfY2F0ZWdvcnlfY29udGV4dCcpKTsKCQkJCQkJaWYgKCEkY2hl Y2tfY29udGV4dCB8fCAkJHByaW1hcnkgPT0gJHByZXRleHRbJ2MnXSkKCQkJCQkJCSR1cmlf YyA9ICQkcHJpbWFyeTsKCQkJCQkJZWxzZSBpZiAoISRjaGVja19jb250ZXh0IHx8ICQkc2Vj b25kYXJ5ID09ICRwcmV0ZXh0WydjJ10pCgkJCQkJCQkkdXJpX2MgPSAkJHNlY29uZGFyeTsK CQkJCQkJZWxzZSBpZiAoJHRoaXMtPnByZWYoJ2RlYnVnJykgJiYgaW5fYXJyYXkoJHByb2R1 Y3Rpb25fc3RhdHVzLCBhcnJheSgnZGVidWcnLCAndGVzdGluZycpKSkKCQkJCQkJCSR1cmlf YyA9ICctLUlOVkFMSURfQ0FURUdPUlktLSc7CgkJCQkJCWVsc2UgewoJCQkJCQkJdW5zZXQo JHVyaSk7CgkJCQkJCQlicmVhayAyOwoJCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAn c2VjdGlvbic6CgkJCQkJCSRjaGVja19jb250ZXh0ID0gKCR0aGlzLT5wcmVmKCdqb2luX3By ZXRleHRfdG9fcGFnZWxpbmtzJykgJiYgJHRoaXMtPnByZWYoJ2NoZWNrX3ByZXRleHRfc2Vj dGlvbl9jb250ZXh0JykpOwoJCQkJCQlpZiAoISRjaGVja19jb250ZXh0IHx8ICRzZWN0aW9u ID09ICRwcmV0ZXh0WydzJ10pCgkJCQkJCQkkdXJpX2MgPSAkc2VjdGlvbjsKCQkJCQkJZWxz ZSB7CgkJCQkJCQl1bnNldCgkdXJpKTsKCQkJCQkJCWJyZWFrIDI7CgkJCQkJCX0KCQkJCQli cmVhazsKCQkJCQljYXNlICd0aXRsZSc6ICR1cmlfYyA9ICR1cmxfdGl0bGU7IGJyZWFrOwoJ CQkJCWNhc2UgJ2lkJzogJHVyaV9jID0gJHRoaXNpZDsgYnJlYWs7CgkJCQkJY2FzZSAnYXV0 aG9yJzogJHVyaV9jID0gc2FmZV9maWVsZCgnUmVhbE5hbWUnLCAndHhwX3VzZXJzJywgIm5h bWUgbGlrZSAneyRhdXRob3JpZH0nIik7IGJyZWFrOwoJCQkJCWNhc2UgJ2xvZ2luJzogJHVy aV9jID0gJGF1dGhvcmlkOyBicmVhazsKCQkJCQljYXNlICdkYXRlJzogJHVyaV9jID0gZXhw bG9kZSgnLycsIGRhdGUoJ1kvbS9kJywgJHBvc3RlZCkpOyBicmVhazsKCQkJCQljYXNlICd5 ZWFyJzogJHVyaV9jID0gZGF0ZSgnWScsICRwb3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdt b250aCc6ICR1cmlfYyA9IGRhdGUoJ20nLCAkcG9zdGVkKTsgYnJlYWs7CgkJCQkJY2FzZSAn ZGF5JzogJHVyaV9jID0gZGF0ZSgnZCcsICRwb3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdj dXN0b20nOgoJCQkJCQlpZiAoJHVyaV9jID0gQCRhcnRpY2xlX2FycmF5WyRwcmVmc1siY3Vz dG9tX3skcGxfY1snY3VzdG9tJ119X3NldCJdXSk7CgkJCQkJCWVsc2UgaWYgKCR1cmlfYyA9 IEAkYXJ0aWNsZV9hcnJheVsiY3VzdG9tX3skcGxfY1snY3VzdG9tJ119Il0pOwoJCQkJCQll bHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcnKSAmJiBpbl9hcnJheSgkcHJvZHVjdGlvbl9z dGF0dXMsIGFycmF5KCdkZWJ1ZycsICd0ZXN0aW5nJykpKQoJCQkJCQkJJHVyaV9jID0gJy0t VU5TRVRfQ1VTVE9NX0ZJRUxELS0nOwoJCQkJCQllbHNlIHsKCQkJCQkJCXVuc2V0KCR1cmkp OwoJCQkJCQkJYnJlYWsgMjsKCQkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3RleHQn OiAkdXJpX2MgPSAkcGxfY1sndGV4dCddOyBicmVhazsKCQkJCQljYXNlICdyZWdleCc6CgkJ CQkJCS8vIENoZWNrIHRvIHNlZSBpZiByZWdleCBpcyB2YWxpZCB3aXRob3V0IG91dHB1dHRp bmcgZXJyb3IgbWVzc2FnZXMuCgkJCQkJCW9iX3N0YXJ0KCk7CgkJCQkJCXByZWdfbWF0Y2go JHBsX2NbJ3JlZ2V4J10sICRwbF9jWydyZWdleCddLCAkcmVnZXhfbWF0Y2hlcyk7CgkJCQkJ CSRpc192YWxpZF9yZWdleCA9ICEob2JfZ2V0X2NsZWFuKCkpOwoJCQkJCQlpZiAoJGlzX3Zh bGlkX3JlZ2V4KSB7CgkJCQkJCQkka2V5ID0gInBlcm1saW5rX3JlZ2V4X3skcGxfY1snbmFt ZSddfSI7CgkJCQkJCQkkdXJpX2MgPSAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkcHJldGV4 dCkpID8gJHByZXRleHRbJGtleV0gOiAkcmVnZXhfbWF0Y2hlc1swXTsKCQkJCQkJfSBlbHNl IGlmICgkdGhpcy0+cHJlZignZGVidWcnKSkKCQkJCQkJCSR1cmlfYyA9ICctLUlOVkFMSURf UkVHRVgtLSc7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKGVtcHR5KCR1cmlfYykpCgkJ CQkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpICYmIGluX2FycmF5KCRwcm9kdWN0aW9uX3N0 YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpCgkJCQkJCSR1cmlfYyA9ICctLVBF Uk1MSU5LX0ZPUk1BVF9FUlJPUi0tJzsKCQkJCQllbHNlIHsKCQkJCQkJdW5zZXQoJHVyaSk7 CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQlpZiAoQCRwbF9jWydwcmVmaXgnXSkKCQkJCQkk dXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9jWydwcmVmaXgnXSk7CgoJCQkJaWYgKGlz X2FycmF5KCR1cmlfYykpIHsKCQkJCQlmb3JlYWNoICgkdXJpX2MgYXMgJHVyaV9jMikKCQkJ CQkJJHVyaSAuPSAkdGhpcy0+ZW5jb2RlX3VybCgkdXJpX2MyKSAuICcvJzsKCQkJCQkkdXJp ID0gcnRyaW0oJHVyaSwgJy8nKTsKCQkJCX0gZWxzZQoJCQkJCSR1cmkgLj0gJHRoaXMtPmVu Y29kZV91cmwoJHVyaV9jKTsKCgkJCQlpZiAoQCRwbF9jWydzdWZmaXgnXSkKCQkJCQkkdXJp IC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9jWydzdWZmaXgnXSk7CgoJCQkJdW5zZXQoJHVy aV9jKTsKCQkJfQoKCQkJaWYgKGlzc2V0KCR1cmkpKQoJCQkJJHVyaSAuPSAnLyc7CgkJfQoK CQlpZiAoJHVyaV9lbXB0eSA9IGVtcHR5KCR1cmkpKSB7CgkJCS8vIEl0IGlzIHBvc3NpYmxl IHRoZSB1cmkgaXMgc3RpbGwgZW1wdHkgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgaWYgd2Un cmUgdXNpbmcKCQkJLy8gc3RyaWN0IG1hdGNoaW5nIGlmIHNvIHRyeSB0aGUgZGVmYXVsdCBw ZXJtbGluayBtb2RlLgoJCQkkdXJpID0gJHRoaXMtPnRvZ2dsZV9wZXJtbGlua19tb2RlKCdw ZXJtbGlua3VybCcsICRhcnRpY2xlX2FycmF5KTsKCQl9CgoJCWlmICgkdGhpcy0+cHJlZign b21pdF90cmFpbGluZ19zbGFzaCcpKQoJCQkkdXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCgkJ aWYgKCEkdXJpX2VtcHR5ICYmIGluX2FycmF5KHR4cGF0aC4nL3B1Ymxpc2gvcnNzLnBocCcs IGdldF9pbmNsdWRlZF9maWxlcygpKSB8fCBpbl9hcnJheSh0eHBhdGguJy9wdWJsaXNoL2F0 b20ucGhwJywgZ2V0X2luY2x1ZGVkX2ZpbGVzKCkpIHx8IHR4cGludGVyZmFjZSA9PSAnYWRt aW4nKSB7CgkJCSRob3N0ID0gcnRyaW0oc3RyX3JlcGxhY2UocnRyaW0oZG9TdHJpcChAJHBy ZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCSR1cmkgPSAkaG9z dCAuICR1cmk7CgkJfQoKCQlyZXR1cm4gKCR0aGlzLT5wcmVmKCdmb3JjZV9sb3dlcmNhc2Vf dXJscycpKSA/IHN0cnRvbG93ZXIoJHVyaSkgOiAkdXJpOwoJfQoKCWZ1bmN0aW9uIF9wYWdl bGlua3VybCAoJHBhcnRzKSB7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ3BhdGgnCQk9 PiAnaW5kZXgucGhwJywKCQkJJ3F1ZXJ5JwkJPT4gJycsCgkJCSdmcmFnbWVudCcJPT4gJycs CgkJKSwgcGFyc2VfdXJsKGh0bWxfZW50aXR5X2RlY29kZShzdHJfcmVwbGFjZSgnJiMzODsn LCAnJicsICRwYXJ0c1syXSkpKSkpOwoKCQkvLyBUaWR5IHVwIGxpbmtzIGJhY2sgdG8gdGhl IHNpdGUgaG9tZXBhZ2UKCQlpZiAoJHBhdGggPT0gJ2luZGV4LnBocCcgJiYgZW1wdHkoJHF1 ZXJ5KSkKCQkJcmV0dXJuICdocmVmPSInIC5odS4gJyInOwoKCQkvLyBGaXggbWF0Y2hlcyBs aWtlIGhyZWY9Ij9zPWZvbyIKCQllbHNlIGlmICgkcGF0aCAmJiBlbXB0eSgkcXVlcnkpICYm ICRwYXJ0c1sxXSA9PSAnPycpIHsKCQkJJHF1ZXJ5ID0gJHBhdGg7CgkJCSRwYXRoID0gJ2lu ZGV4LnBocCc7CgkJfQoKCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgcXVlcnkgdG8g d29yayB3aXRoLgoJCWVsc2UgaWYgKGVtcHR5KCRxdWVyeSkgfHwgJHBhdGggIT0gJ2luZGV4 LnBocCcgfHwgc3RycG9zKCRxdWVyeSwgJy8nKSA9PT0gdHJ1ZSkKCQkJcmV0dXJuICRwYXJ0 c1swXTsKCgkJLy8gJyZhbXA7JyB3aWxsIGJyZWFrIHBhcnNlX3N0cigpIGlmIHRoZXkgYXJl IGZvdW5kIGluIGEgcXVlcnkgc3RyaW5nCgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoJyZhbXA7 JywgJyYnLCAkcXVlcnkpOwoKCQlpZiAoJGZyYWdtZW50KQoJCQkkZnJhZ21lbnQgPSAnIycu JGZyYWdtZW50OwoKCQlnbG9iYWwgJHByZXRleHQ7CgkJcGFyc2Vfc3RyKCRxdWVyeSwgJHF1 ZXJ5X3BhcnQpOwoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncGcnLCAkcXVlcnlfcGFydCkp CgkJCSRxdWVyeV9wYXJ0WydwZyddID0gMDsKCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ2lk JywgJHF1ZXJ5X3BhcnQpKQoJCQkkcXVlcnlfcGFydFsnaWQnXSA9IDA7CgkJaWYgKCFhcnJh eV9rZXlfZXhpc3RzKCdyc3MnLCAkcXVlcnlfcGFydCkpCgkJCSRxdWVyeV9wYXJ0Wydyc3Mn XSA9IDA7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdhdG9tJywgJHF1ZXJ5X3BhcnQpKQoJ CQkkcXVlcnlfcGFydFsnYXRvbSddID0gMDsKCQlpZiAoJHRoaXMtPnByZWYoJ2pvaW5fcHJl dGV4dF90b19wYWdlbGlua3MnKSkKCQkJZXh0cmFjdChhcnJheV9tZXJnZSgkcHJldGV4dCwg JHF1ZXJ5X3BhcnQpKTsKCQllbHNlCgkJCWV4dHJhY3QoJHF1ZXJ5X3BhcnQpOwoKCQkvLyBX ZSBoYXZlIGEgaWQsIHBhc3MgdG8gcGVybWxpbmt1cmwoKQoJCWlmICgkaWQpIHsKCQkJaWYg KEAkcyA9PSAnZmlsZV9kb3dubG9hZCcpIHsKCQkJCSR0aXRsZSA9ICh2ZXJzaW9uX2NvbXBh cmUoJGRidmVyc2lvbiwgJzQuMicsICc+PScpKSA/IE5VTEwgOiBzYWZlX2ZpZWxkKCdmaWxl bmFtZScsICd0eHBfZmlsZScsICJpZCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAkdGhpcy0+ dG9nZ2xlX3Blcm1saW5rX21vZGUoJ2ZpbGVkb3dubG9hZHVybCcsIGFycmF5KCRpZCwgJHRp dGxlKSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQkkcnMgPSBzYWZlX3JvdygnKiwgSUQgYXMg dGhpc2lkLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHBvc3RlZCcsICd0ZXh0cGF0dGVy bicsICJJRCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAkdGhpcy0+X3Blcm1saW5rdXJsKCRy cywgUEVSTUxJTktVUkwpIC4gJGZyYWdtZW50OwoJCQl9CgkJCXJldHVybiAnaHJlZj0iJy4g JHVybCAuJyInOwoJCX0KCgkJaWYgKEAkcyA9PSAnZGVmYXVsdCcpCgkJCXVuc2V0KCRzKTsK CgkJLy8gU29tZSBUeFAgdGFncywgZS5nLiA8dHhwOmZlZWRfbGluayAvPiB1c2UgJ3NlY3Rp b24nIG9yICdjYXRlZ29yeScgaW5jb25zaXN0ZW50CgkJLy8gd2l0aCBtb3N0IG90aGVyIHRh Z3MuIFByb2Nlc3MgdGhlc2Ugbm93IHNvIHdlIG9ubHkgaGF2ZSB0byBjaGVjayAkcyBhbmQg JGMuCgkJaWYgKEAkc2VjdGlvbikgICRzID0gJHNlY3Rpb247CgkJaWYgKEAkY2F0ZWdvcnkp ICRjID0gJGNhdGVnb3J5OwoKCQkvLyBEZWJ1Z2dpbmcgZm9yIGJ1ZmZlcnMKCQkkdGhpcy0+ YnVmZmVyX2RlYnVnW10gPSAndXJsOiAnLnN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHBh cnRzWzFdLiRwYXJ0c1syXSk7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BhdGg6ICcu JHBhdGg7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3F1ZXJ5OiAnLiRxdWVyeTsKCQlp ZiAoJGZyYWdtZW50KSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnZnJhZ21lbnQ6ICcuJGZy YWdtZW50OwoKCQlpZiAoQCRpZCkgJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ2lkOiAnLiRp ZDsKCQlpZiAoQCRzKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnczogJy4kczsKCQlpZiAo QCRjKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnYzogJy4kYzsKCQlpZiAoQCRyc3MpICR0 aGlzLT5idWZmZXJfZGVidWdbXSA9ICdyc3M6ICcuJHJzczsKCQlpZiAoQCRhdG9tKSAkdGhp cy0+YnVmZmVyX2RlYnVnW10gPSAnYXRvbTogJy4kYXRvbTsKCQlpZiAoQCRwZykgJHRoaXMt PmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BnOiAnLiRwZzsKCQlpZiAoQCRxKSAkdGhpcy0+YnVmZmVy X2RlYnVnW10gPSAncTogJy4kcTsKCgkJaWYgKEAkcHJldGV4dFsncGVybWxpbmtfb3ZlcnJp ZGUnXSkgewoJCQkkb3ZlcnJpZGVfaWRzID0gZXhwbG9kZSgnLCcsICRwcmV0ZXh0WydwZXJt bGlua19vdmVycmlkZSddKTsKCQkJZm9yZWFjaCAoJG92ZXJyaWRlX2lkcyBhcyAkb3ZlcnJp ZGVfaWQpIHsKCQkJCSRwbCA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJG92ZXJyaWRlX2lkKTsK CQkJCWlmIChjb3VudCgkcGwpID4gMCkgJHBlcm1saW5rc1tdID0gJHBsOwoJCQl9CgkJfQoK CQlpZiAoZW1wdHkoJHBlcm1saW5rcykpIHsKCQkJJHBlcm1saW5rcyA9ICR0aGlzLT5nZXRf YWxsX3Blcm1saW5rcygxKTsKCgkJCSRwZXJtbGlua3NbJ2dicF9wZXJtYW5lbnRfbGlua3Nf ZGVmYXVsdCddID0gYXJyYXkoCgkJCQknY29tcG9uZW50cycgPT4gYXJyYXkoCgkJCQkJYXJy YXkoJ3R5cGUnID0+ICd0ZXh0JywgJ3RleHQnID0+IHN0cnRvbG93ZXIodXJsZW5jb2RlKGdU eHQoJ2NhdGVnb3J5JykpKSksCgkJCQkJYXJyYXkoJ3R5cGUnID0+ICdjYXRlZ29yeScpLAoJ CQkJKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXkoCgkJCQkJJ3BsX25hbWUnID0+ICdnYnBf cGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxfcHJlY2VkZW5jZScgPT4gJycsICdwbF9w cmV2aWV3JyA9PiAnJywKCQkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5 JyA9PiAnJywgJ2Rlc19zZWN0aW9uJyA9PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4gJycsCgkJ CQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycsICdkZXNfbG9jYXRp b24nID0+ICcnLAoJCQkpKTsKCQl9CgoJCSRjdXJyZW50X3NlZ21lbnRzID0gZXhwbG9kZSgn LycsIGx0cmltKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAnLycpKTsKCgkJJGhpZ2hlc3Rf bWF0Y2hfY291bnQgPSBudWxsOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtleSA9PiAk cGwpIHsKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ1Rlc3RpbmcgcGVybWxpbms6ICcu ICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSddIC4nIC0gJy4gJGtleTsKCQkJJHRoaXMtPmJ1 ZmZlcl9kZWJ1Z1tdID0gJ1ByZXZpZXc6ICcuICRwbFsnc2V0dGluZ3MnXVsncGxfcHJldmll dyddOwoJCQkkb3V0ID0gYXJyYXkoKTsgJGtleXMgPSBhcnJheSgpOyAkbWF0Y2hfY291bnQg PSAwOwoJCQlmb3JlYWNoICgkcGxbJ2NvbXBvbmVudHMnXSBhcyAkaSA9PiAkcGxfYykgewoJ CQkJc3dpdGNoICgkcGxfY1sndHlwZSddKSB7CgkJCQkJY2FzZSAndGV4dCc6CgkJCQkJCSRv dXRbXSA9ICRwbF9jWyd0ZXh0J107CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncmVnZXgnOgoJ CQkJCQkkb3V0W10gPSAkcHJldGV4dFsncGVybWxpbmtfcmVnZXhfJy4kcGxfY1snbmFtZSdd XTsKCQkJCQlicmVhazsKCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJaWYgKEAkcykgJG91 dFtdID0gJHM7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVhazsKCQkJCQljYXNlICdj YXRlZ29yeSc6CgkJCQkJCWlmIChAJGMpICRvdXRbXSA9ICRjOwoJCQkJCQllbHNlIGJyZWFr IDI7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZmVlZCc6CgkJCQkJCWlmIChAJHJzcykgJGtl eXNbXSA9ICRvdXRbXSA9ICdyc3MnOwoJCQkJCQllbHNlIGlmIChAJGF0b20pICRrZXlzW10g PSAkb3V0W10gPSAnYXRvbSc7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVhazsKCQkJ CQljYXNlICdzZWFyY2gnOgoJCQkJCQlpZiAoQCRxKSAkb3V0W10gPSAkcTsKCQkJCQkJZWxz ZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3BhZ2UnOgoJCQkJCQlpZiAoQCRw ZykgewoJCQkJCQkJJG91dFtdID0gJHBnOwoJCQkJCQkJJGtleXNbXSA9ICdwZyc7CgkJCQkJ CX0KCQkJCQkJZWxzZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6IGJyZWFr IDI7CgkJCQl9CgkJCQlpZiAoaW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXkoJ3RleHQn LCAncmVnZXgnKSkpIHsKCQkJCQlpZiAoJGN1cnJlbnRfc2VnbWVudHNbJGldID09IGVuZCgk b3V0KSAmJiBzdHJsZW4oZW5kKCRvdXQpKSA+IDApCgkJCQkJCSRtYXRjaF9jb3VudCArPSAk dGhpcy0+cHJlZigndGV4dF9hbmRfcmVnZXhfc2VnbWVudF9zY29yZXMnKTsKCQkJCX0KCQkJ CWVsc2VpZiAoIWluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFycmF5KCd0aXRsZScsICdpZCcp KSkKCQkJCQkkbWF0Y2hfY291bnQrKzsKCQkJCWVsc2UgYnJlYWs7CgkJCX0KCgkJCSR0aGlz LT5idWZmZXJfZGVidWdbXSA9ICdNYXRjaCBjb3VudDogJy4gJG1hdGNoX2NvdW50OwoKCQkJ Ly8gVG9kbzogU3RvcmUgYWNjb3JkaW5nIHRvIHRoZSBwcmVjZWRlbmNlIHZhbHVlCgkJCWlm IChjb3VudCgkb3V0KSA+IDAgJiYgKCRtYXRjaF9jb3VudCA+ICRoaWdoZXN0X21hdGNoX2Nv dW50IHx8ICFpc3NldCgkaGlnaGVzdF9tYXRjaF9jb3VudCkpICYmCgkJCSEoJGtleSA9PSAn Z2JwX3Blcm1hbmVudF9saW5rc19kZWZhdWx0JyAmJiAhJG1hdGNoX2NvdW50KSkgewoJCQkJ ZXh0cmFjdCgkcGxbJ3NldHRpbmdzJ10pOwoJCQkJaWYgKChlbXB0eSgkcykgJiYgZW1wdHko JGMpKSB8fAoJCQkJKGVtcHR5KCRjb25fc2VjdGlvbikgfHwgQCRzID09ICRjb25fc2VjdGlv bikgfHwKCQkJCShlbXB0eSgkY29uX2NhdGVnb3J5KSB8fCBAJGMgPT0gJGNvbl9jYXRlZ29y eSkpIHsKCQkJCQkkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnTmV3IGhpZ2hlc3QgbWF0Y2gh ICcuIGltcGxvZGUoJy8nLCAkb3V0KTsKCQkJCQkkaGlnaGVzdF9tYXRjaF9jb3VudCA9ICRt YXRjaF9jb3VudDsKCQkJCQkkbWF0Y2ggPSAkb3V0OwoJCQkJCSRtYXRjaF9rZXlzID0gJGtl eXM7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChlbXB0eSgkbWF0Y2gpICYmICghKEAkcGcgJiYg JHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycpKSB8fCAoQCRwZyAmJiBA JHEpKSkgewoJCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21vZGU7CgkJ CSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdObyBtYXRjaCc7CgkJCSR0aGlzLT5idWZmZXJf ZGVidWdbXSA9ICctLS0tJzsKCQkJJHByZXRleHRbJ3Blcm1saW5rX21vZGUnXSA9ICRwZXJt bGlua19tb2RlID0gJHByZWZzWydwZXJtbGlua19tb2RlJ107CgkJCSR1cmwgPSBwYWdlbGlu a3VybCgkcXVlcnlfcGFydCk7CgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVy bWxpbmtfbW9kZSA9ICdtZXNzeSc7CgkJCXJldHVybiAnaHJlZj0iJy4gJHVybCAuJyInOwoJ CX0KCgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ21hdGNoOiAnLiAgICAgIHNlcmlhbGl6 ZSgkbWF0Y2gpOwoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdtYXRjaF9rZXlzOiAnLiBz ZXJpYWxpemUoJG1hdGNoX2tleXMpOwoKCQkkdXJsID0gJy8nLmpvaW4oJy8nLCAkbWF0Y2gp OwoJCSR1cmwgPSBydHJpbShodSwgJy8nKS5ydHJpbSgkdXJsLCAnLycpLicvJzsKCgkJaWYg KCRyc3MgJiYgIWluX2FycmF5KCdyc3MnLCAkbWF0Y2hfa2V5cykpCgkJCSR1cmwgLj0gJ3Jz cyc7CgkJZWxzZSBpZiAoJGF0b20gJiYgIWluX2FycmF5KCdhdG9tJywgJG1hdGNoX2tleXMp KQoJCQkkdXJsIC49ICdhdG9tJzsKCQllbHNlIGlmICgkcGcgJiYgIWluX2FycmF5KCdwZycs ICRtYXRjaF9rZXlzKSkgewoJCQlpZiAoJHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2VfYXJjaGl2 ZV9saW5rcycpKQoJCQkJJHVybCAuPSAkcGc7CgkJCWVsc2UgewoJCQkJJHVybCAuPSAnP3Bn PScuICRwZzsKCQkJCSRvbWl0X3RyYWlsaW5nX3NsYXNoID0gdHJ1ZTsKCQkJfQoJCX0KCgkJ JHVybCA9IHJ0cmltKCR1cmwsICcvJykgLiAnLyc7CgoJCWlmIChAJG9taXRfdHJhaWxpbmdf c2xhc2ggfHwgJHRoaXMtPnByZWYoJ29taXRfdHJhaWxpbmdfc2xhc2gnKSkKCQkJJHVybCA9 IHJ0cmltKCR1cmwsICcvJyk7CgoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICR1cmw7CgkJ JHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJy0tLS0nOwoKCQlpZiAoJHBhdGggPT0gJ2luZGV4 LnBocCcgJiYgJHVybCAhPSBodSkKCQkJcmV0dXJuICdocmVmPSInLiAkdXJsIC4gJGZyYWdt ZW50IC4nIic7CgoJCS8qCgkJMSA9IGluZGV4LCB0ZXh0cGF0dGVybi9jc3MsIE5VTEwgKD1p bmRleCkKCQkyID0gaWQsIHMsIHNlY3Rpb24sIGMsIGNhdGVnb3J5LCByc3MsIGF0b20sIHBn LCBxLCAobiwgcCwgbW9udGgsIGF1dGhvcikKCQkqLwoKCQlyZXR1cm4gKCR0aGlzLT5wcmVm KCdmb3JjZV9sb3dlcmNhc2VfdXJscycpKSA/IHN0cnRvbG93ZXIoJHBhcnRzWzBdKSA6ICRw YXJ0c1swXTsKCX0KCglmdW5jdGlvbiBzZXRfcGVybWxpbmtfbW9kZSAoJHJlc2V0X2Z1bmN0 aW9uID0gZmFsc2UpIHsKCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21v ZGU7CgkJJHByZWZzWydjdXN0b21fdXJsX2Z1bmMnXSA9IGFycmF5KCYkdGhpcywgJ19wZXJt bGlua3VybCcpOwoKCQlpZiAoISRyZXNldF9mdW5jdGlvbikKCQkJJHByZXRleHRbJ3Blcm1s aW5rX21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0gJ21lc3N5JzsKCQllbHNlCgkJCSRwcmV0 ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICRwcmVmc1sncGVybWxp bmtfbW9kZSddOwoJfQoKCWZ1bmN0aW9uIHJlc2V0X3Blcm1saW5rX21vZGUgKCkgewoJCWds b2JhbCAkcHJlZnMsICRwcmV0ZXh0LCAkcGVybWxpbmtfbW9kZTsKCQl1bnNldCgkcHJlZnNb J2N1c3RvbV91cmxfZnVuYyddKTsKCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSddID0gJHBl cm1saW5rX21vZGUgPSAkcHJlZnNbJ3Blcm1saW5rX21vZGUnXTsKCX0KCglmdW5jdGlvbiB0 b2dnbGVfY3VzdG9tX3VybF9mdW5jICgkZnVuYywgJGF0dHMgPSBOVUxMLCAkdG9vZ2xlX3Bl cm1saW5rX21vZGUgPSBmYWxzZSwgJGV4cGFuZF9hcmd1bWVudHMgPSBmYWxzZSkgewoJCWds b2JhbCAkcHJlZnMsICRwcmV0ZXh0OwoKCQlpZiAoJHRvb2dsZV9wZXJtbGlua19tb2RlKSB7 CgkJCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCQkJJF9wZXJtbGlua19tb2RlID0gJHBlcm1s aW5rX21vZGU7CgkJfQoKCQkkX2NhbGxfdXNlcl9mdW5jID0gQCRwcmVmc1snY3VzdG9tX3Vy bF9mdW5jJ107CgoJCXVuc2V0KCRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10pOwoJCWlmICgk dG9vZ2xlX3Blcm1saW5rX21vZGUpCgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAk cGVybWxpbmtfbW9kZSA9ICRwcmVmc1sncGVybWxpbmtfbW9kZSddOwoKCQlpZiAoaXNfY2Fs bGFibGUoJGZ1bmMpKSB7CgkJCWlmIChpc19hcnJheSgkYXR0cykgYW5kICRleHBhbmRfYXJn dW1lbnRzKQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmMsICRhdHRzKTsK CQkJZWxzZQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmMoJGZ1bmMsICRhdHRzKTsKCQl9CgoJ CSRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10gPSAkX2NhbGxfdXNlcl9mdW5jOwoKCQlpZiAo JHRvb2dsZV9wZXJtbGlua19tb2RlKQoJCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSddID0g JHBlcm1saW5rX21vZGUgPSAkX3Blcm1saW5rX21vZGU7CgoJCXJldHVybiAkcnM7Cgl9CgoJ ZnVuY3Rpb24gdG9nZ2xlX3Blcm1saW5rX21vZGUgKCRmdW5jLCAkYXR0cyA9IE5VTEwsICRl eHBhbmRfYXJndW1lbnRzID0gZmFsc2UpIHsKCQlyZXR1cm4gJHRoaXMtPnRvZ2dsZV9jdXN0 b21fdXJsX2Z1bmMoJGZ1bmMsICRhdHRzLCB0cnVlLCAkZXhwYW5kX2FyZ3VtZW50cyk7Cgl9 CgoJZnVuY3Rpb24gZW5jb2RlX3VybCAoJHRleHQpIHsKCQlyZXR1cm4gdXJsZW5jb2RlKHRy aW0oZHVtYkRvd24odXJsZGVjb2RlKCR0ZXh0KSkpKTsKCX0KCglmdW5jdGlvbiBkZWJ1ZyAo KSB7CgkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpKSB7CgkJCWdsb2JhbCAkcHJvZHVjdGlv bl9zdGF0dXM7CgkJCSRhID0gZnVuY19nZXRfYXJncygpOwoKCQkJaWYgKEB0eHBpbnRlcmZh Y2UgPT0gJ2FkbWluJykKCQkJCWZvcmVhY2ggKCRhIGFzICR0aGluZykKCQkJCQlkbXAoJHRo aW5nKTsKCgkJCWlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnICYmIGluX2FycmF5KCRw cm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpCgkJCQlmb3Jl YWNoICgkYSBhcyAkdGhpbmcpCgkJCQkJZWNobyBjb21tZW50KGlzX3NjYWxhcigkdGhpbmcp ID8gc3RydmFsKCR0aGluZykgOiB2YXJfZXhwb3J0KCR0aGluZywgdHJ1ZSkpLG47CgkJfQoJ fQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0J1aWxkVGFiVmlldyBleHRlbmRzIEdCUEFkbWlu VGFiVmlldwp7CglmdW5jdGlvbiBwcmVsb2FkICgpIHsKCQlyZWdpc3Rlcl9jYWxsYmFjayhh cnJheSgmJHRoaXMsICdwb3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVudC0+ZXZl bnQsIGdicF9zYXZlLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMsICdw b3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVudC0+ZXZlbnQsIGdicF9wb3N0LCAx KTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQlnbG9iYWwgJHByZWZzOwoJCWV4dHJhY3Qo Z3BzYShhcnJheSgnc3RlcCcsIGdicF9pZCkpKTsKCgkJLy8gV2l0aCBoYXZlIGFuIElELCBl aXRoZXIgdGhlIHBlcm1saW5rIGhhcyBqdXN0IGJlZW4gc2F2ZWQgb3IgdGhlIHVzZXIgd2Fu dHMgdG8gZWRpdCBpdAoJCWlmICgkaWQpIHsKCQkJLy8gTmV3bHkgc2F2ZWQgb3IgYmVlbmlu ZyBlZGl0ZWQsIGVpdGhlciB3YXkgd2UncmUgZWRpdGluZyBhIHBlcm1saW5rCgkJCSRzdGVw ID0gZ2JwX3NhdmU7CgoJCQkvLyBVc2UgdGhlIElEIHRvIGdyYWIgdGhlIHBlcm1saW5rIGRh dGEgKGNvbXBvbmVudHMgJiBzZXR0aW5ncykKCQkJJHBlcm1saW5rID0gJHRoaXMtPnBhcmVu dC0+Z2V0X3Blcm1saW5rKCRpZCk7CgkJCSRjb21wb25lbnRzID0gJHRoaXMtPnBocEFycmF5 VG9Kc0FycmF5KCdjb21wb25lbnRzJywgJHBlcm1saW5rWydjb21wb25lbnRzJ10pOwoJCQkk c2V0dGluZ3MgPSAkcGVybWxpbmtbJ3NldHRpbmdzJ107CgkJfSBlbHNlIHsKCQkJLy8gQ3Jl YXRpbmcgYSBuZXcgSUQgYW5kIHBlcm1saW5rLgoJCQkkc3RlcCA9IGdicF9wb3N0OwoJCQkk aWQgPSB1bmlxaWQoJycpOwoKCQkJLy8gU2V0IHRoZSBkZWZhdWx0IHNldCBvZiBjb21wb25l bnRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGlzIHBhcmVudCBwZXJtbGluawoJCQkk Y29tcG9uZW50cyA9ICR0aGlzLT5waHBBcnJheVRvSnNBcnJheSgnY29tcG9uZW50cycsIGFy cmF5KAoJCQkJYXJyYXkoJ3R5cGUnID0+ICdzZWN0aW9uJywgJ3ByZWZpeCcgPT4gJycsICdz dWZmaXgnID0+ICcnLCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkJYXJyYXko J3R5cGUnID0+ICdjYXRlZ29yeScsICdwcmVmaXgnID0+ICcnLCAnc3VmZml4JyA9PiAnJywg J3JlZ2V4JyA9PiAnJywgJ3RleHQnID0+ICcnLCAnY2F0ZWdvcnknID0+ICcxJyksCgkJCQlh cnJheSgndHlwZScgPT4gJ3RpdGxlJywgJ3ByZWZpeCcgPT4gJycsICdzdWZmaXgnID0+ICcn LCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkpKTsKCgkJCSRzZXR0aW5ncyA9 IGFycmF5KAoJCQkJJ3BsX25hbWUnID0+ICdVbnRpdGxlZCcsICdwbF9wcmVjZWRlbmNlJyA9 PiAnMCcsCgkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5JyA9PiAnJywK CQkJCSdkZXNfc2VjdGlvbicgPT4gJycsICdkZXNfY2F0ZWdvcnknID0+ICcnLCAnZGVzX3Bh Z2UnID0+ICcnLAoJCQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycs ICdkZXNfbG9jYXRpb24nID0+ICcnLAoJCQkpOwoJCX0KCgkJLy8gRXh0cmFjdCBzZXR0aW5n cyAtIHRoaXMgd2lsbCBiZSB1c2VmdWwgd2hlbiBjcmVhdGluZyB0aGUgdXNlciBpbnRlcmZh Y2UKCQlleHRyYWN0KCRzZXR0aW5ncyk7CgoJCS8vIFBIUCAmIEphdmFzY3JpcHQgY29uc3Rh bnRzOwoJCSRzZXBhcmF0b3IgPSBnYnBfc2VwYXJhdG9yOwoJCSRjb21wb25lbnRzX2RpdiA9 ICdwZXJtbGlua19jb21wb25lbnRzX3VpJzsKCQkkY29tcG9uZW50c19mb3JtID0gJ3Blcm1s aW5rX2NvbXBvbmVudHMnOwoJCSRzZXR0aW5nc19mb3JtID0gJ3Blcm1saW5rX3NldHRpbmdz JzsKCQkkc2hvd19wcmVmaXggPSAkdGhpcy0+cHJlZignc2hvd19wcmVmaXgnKTsKCQkkc2hv d19zdWZmaXggPSAkdGhpcy0+cHJlZignc2hvd19zdWZmaXgnKTsKCgkJLy8gQSBsaXR0bGUg Y3JlZGl0IGhlcmUgYW5kIHRoZXJlIGRvZXNuJ3QgaHVydAoJCSRvdXRbXSA9ICI8IS0tIHsk dGhpcy0+cGFyZW50LT5wbHVnaW5fbmFtZX0gYnkgR3JhZW1lIFBvcnRlb3VzIC0tPiI7CgoJ CS8vIFRoZSBKYXZhc2NyaXB0CiRvdXRbXSA9IDw8PEhUTUwKCTxzY3JpcHQgdHlwZT0idGV4 dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgoJ Ly8gPCFbQ0RBVEFbCgoJLy8gR2xvYmFsIHZhcmlhYmxlcwp2YXIgeyRjb21wb25lbnRzfS8v IGNvbXBvbmVudHMgYXJyYXkgZm9yIGFsbCB0aGUgZGF0YQoKCXZhciBfY3VycmVudCA9IDA7 IC8vIEluZGV4IG9mIHRoZSBjb21wb25lbnRzIGFycmF5LCBvZiB0aGUgY3VycmVudGx5IHNl bGVjdGVkIGNvbXBvbmVudAoJdmFyIGNfdmFscyA9IG5ldyBBcnJheSgndHlwZScsICdjdXN0 b20nLCAnY2F0ZWdvcnknLCAnbmFtZScsICdwcmVmaXgnLCAnc3VmZml4JywgJ3JlZ2V4Jywg J3RleHQnKTsKCgl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CgkJY29tcG9uZW50X3Jl ZnJlc2hfYWxsKCk7CgkJY29tcG9uZW50X3N3aXRjaChjb21wb25lbnQoX2N1cnJlbnQpKTsK CX0KCglmdW5jdGlvbiBjb21wb25lbnRfYWRkICgpIHsKCQkvLyBDcmVhdGUgZGF0YSBzZXQK CQl2YXIgZGF0YSA9IG5ldyBBcnJheSgpOwoJCWZvciAoa2V5IGluIGNfdmFscykgewoJCQlk YXRhW2NfdmFsc1trZXldXSA9ICcnOwoJCX0KCgkJLy8gQWRkIGRhdGEKCQljb21wb25lbnRz LnB1c2goZGF0YSk7CgoJCS8vIFJlc2V0IGNvbXBvbmVudCB0eXBlIGxpc3QKCQlmb3JtKCd7 JGNvbXBvbmVudHNfZm9ybX0nKS50eXBlLnZhbHVlID0gJyc7CgoJCS8vIFN3aXRjaCB0byB0 aGUgbmV3IGNvbXBvbmVudAoJCV9jdXJyZW50ID0gY29tcG9uZW50cy5sZW5ndGggLSAxOwoK CQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJY29tcG9uZW50 X3VwZGF0ZSgpOwoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9yZWZyZXNoIChlbGVtZW50KSB7 CgkJdmFyIGMgPSBjb21wb25lbnRzW2VsZW1lbnQuaWRdOwoKCQkvLyBDU1MKCQlpZiAoX2N1 cnJlbnQgPT0gZWxlbWVudC5pZCkKCQkJZWxlbWVudC5zdHlsZVsnYmFja2dyb3VuZENvbG9y J10gPSAncmdiKDI0OSwgMjA2LCA3MyknOwoJCWVsc2UKCQkJZWxlbWVudC5zdHlsZVsnYmFj a2dyb3VuZENvbG9yJ10gPSAncmdiKDI1NSwgMjU0LCAyMTEpJzsKCQllbGVtZW50LnN0eWxl Wydjb2xvciddID0gJ3JnYigwLCAwLCAwKSc7CgkJZWxlbWVudC5zdHlsZVsnZm9udEZhbWls eSddID0gJ0FyaWFsJzsKCQllbGVtZW50LnN0eWxlWydmb250V2VpZ2h0J10gPSAnYm9sZCc7 CgkJZWxlbWVudC5zdHlsZVsndmVydGljYWxBbGlnbiddID0gJ21pZGRsZSc7CgkJZWxlbWVu dC5zdHlsZVsndGV4dEFsaWduJ10gPSAnY2VudGVyJzsKCQllbGVtZW50LnN0eWxlWydsaW5l SGVpZ2h0J10gPSAnMS41ZW0nOwoJCWVsZW1lbnQuc3R5bGVbJ2hlaWdodCddID0gJzEuNWVt JzsKCQllbGVtZW50LnN0eWxlWydwYWRkaW5nJ10gPSAnMCA1cHgnOwoJCWVsZW1lbnQuc3R5 bGVbJ21hcmdpblJpZ2h0J10gPSAnNXB4JzsKCQllbGVtZW50LnN0eWxlWydjc3NGbG9hdCdd ID0gJ2xlZnQnOwoJCWVsZW1lbnQuc3R5bGVbJ2Rpc3BsYXknXSA9ICdpbmxpbmUnOwoKCQkv LyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKGVsZW1lbnQuaGFzQ2hpbGROb2Rl cygpKSB7IGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTsgfQoKCQkv LyBDcmVhdGUgdGhlIHZpc2libGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGNvbXBvbmVu dAoJCXN3aXRjaCAoY1sndHlwZSddKSB7CgkJCWNhc2UgJycgOgoJCQkJc3RyaW5nID0gJy8n OwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCWNhc2UgJ3RleHQnIDoKCQkJCXN0 cmluZyA9IGNbY1sndHlwZSddXSArICcgLyc7CgkJCQlicmVhazsKCQkJY2FzZSAnZGF0ZScg OgoJCQkJc3RyaW5nID0gY1sndHlwZSddICsgJyAvJzsKCQkJCWJyZWFrOwoJCQljYXNlICdj dXN0b20nIDoKCQkJCXN0cmluZyA9IGNbJ3ByZWZpeCddICsgJ2N1c3RvbV8nICsgY1snY3Vz dG9tJ10gKyBjWydzdWZmaXgnXSArICcgLyc7CgkJCQlicmVhazsKCQkJZGVmYXVsdCA6CgkJ CQlzdHJpbmcgPSBjWydwcmVmaXgnXSArIGNbJ3R5cGUnXSArIGNbJ3N1ZmZpeCddICsgJyAv JzsKCQkJYnJlYWs7CgkJfQoKCQkvLyBTZXQgdGhlIHZpc2libGUgc3RyaW5nCgkJZWxlbWVu dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpKTsKCgkJcmV0 dXJuIGVsZW1lbnQ7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3JlZnJlc2hfYWxsICgpIHsK CQkvLyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKHBlcm1saW5rX2RpdigpLmhh c0NoaWxkTm9kZXMoKSkgeyBwZXJtbGlua19kaXYoKS5yZW1vdmVDaGlsZChwZXJtbGlua19k aXYoKS5maXJzdENoaWxkKTsgfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMu bGVuZ3RoOyBpKyspIHsKCQkJdmFyIGMgPSBjb21wb25lbnRzW2ldOwoKCQkJLy8gQ3JlYXRl IHRoZSBuZXcgY29tcG9uZW50CgkJCXZhciBuZXdfY29tcG9uZW50ID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCgnZGl2Jyk7CgoJCQkvLyBTZXQgdGhlIGlkIGludGVyZ2VyIGZvciB0aGlz IGNvbXBvbmVudAoJCQluZXdfY29tcG9uZW50LmlkID0gaTsKCgkJCS8vIEphdmFzY3JpcHQs IG9ubW91c2V1cCBzZXR0aW5nCgkJCW5ld19jb21wb25lbnQuc2V0QXR0cmlidXRlKCdvbm1v dXNlZG93bicsICdjb21wb25lbnRfc3dpdGNoKHRoaXMpOycpOwoJCQluZXdfY29tcG9uZW50 Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oKSB7IGNvbXBvbmVudF9zd2l0Y2godGhpcyk7IH07 CgoJCQkvLyBSZWZyZXNoIHRoZSBsb29rIG9mIHRoZSBjb21wb25lbnQKCQkJbmV3X2NvbXBv bmVudCA9IGNvbXBvbmVudF9yZWZyZXNoKG5ld19jb21wb25lbnQpOwoKCQkJLy8gQW5kIGFk ZCB0aGUgbmV3IGNvbXBvbmVudCB0byB0aGUgdWkKCQkJcGVybWxpbmtfZGl2KCkuYXBwZW5k Q2hpbGQobmV3X2NvbXBvbmVudCk7CgkJfQoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9yZW1v dmUgKCkgewoJCWlmIChjb21wb25lbnRzLmxlbmd0aCA+IDEpIHsKCQkJY29tcG9uZW50cy5z cGxpY2UoX2N1cnJlbnQsIDEpOwoKCQkJaWYgKF9jdXJyZW50ID49IGNvbXBvbmVudHMubGVu Z3RoKQoJCQkJX2N1cnJlbnQgPSBjb21wb25lbnRzLmxlbmd0aCAtIDE7CgoJCQljb21wb25l bnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3N3aXRjaCAo ZWxlbWVudCkgewoJCS8vIFVwZGF0ZSBjdXJyZW50IGluZGV4CgkJX2N1cnJlbnQgPSBlbGVt ZW50LmlkOwoKCQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgoJ CS8vIFNldCBmb3JtIGlucHV0IHZhbHVlcwoJCXZhciBjID0gY29tcG9uZW50c1tfY3VycmVu dF07CgkJZm9yIChrZXkgaW4gY192YWxzKSB7CgkJCXZhciBrID0gY192YWxzW2tleV07CgkJ CXZhciBlID0gZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykuZWxlbWVudHMubmFtZWRJdGVt KGspOwoKCQkJaWYgKGNba10pIGUudmFsdWUgPSBjW2tdOwoJCQllbHNlIGUudmFsdWUgPSAn JzsKCQl9CgoJCS8vIEhpZGUgdW5uZWVkZWQgZm9ybSBpbnB1dHMKCQljb21wb25lbnRfdXBk YXRlKCk7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3VwZGF0ZSAoZWxlbWVudCkgewoJCS8v IFN0b3JlIHRoZSBkYXRhIGluIGZvcm0gaW5wdXRzLCBhbmQgaGlkZSBhbGwgZm9ybSBpbnB1 dHMKCQl2YXIgYyA9IG5ldyBBcnJheSgpCgkJZm9yIChrZXkgaW4gY192YWxzKSB7CgkJCXZh ciBrID0gY192YWxzW2tleV07CgkJCXZhciBlID0gZm9ybSgneyRjb21wb25lbnRzX2Zvcm19 JykuZWxlbWVudHMubmFtZWRJdGVtKGspOwoKCQkJY1trXSA9IGUudmFsdWU7CgoJCQllLnBh cmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICdub25lJzsKCQl9CgoJCS8vIFJlc2hvdyB0 eXBlIG9wdGlvbiBsaXN0CgkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykudHlwZS5wYXJl bnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCgkJLy8gU2V0IG90aGVyIGZvcm0gaW5w dXRzIHRvIHRoZSBjb3JyZWN0IHZpc2liaWxpdHkgc3RhdGUsIGRlcGVuZGVudCBvbiB0eXBl CgkJc3dpdGNoIChjWyd0eXBlJ10pIHsKCQkJY2FzZSAnJyA6CgkJCWNhc2UgJ2RhdGUnIDog YnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCQlmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0n KS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZm9ybSgneyRj b21wb25lbnRzX2Zvcm19JykucmVnZXgucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0g Jyc7CgkJCWJyZWFrOwoJCQljYXNlICd0ZXh0JyA6CgkJCQlmb3JtKCd7JGNvbXBvbmVudHNf Zm9ybX0nKS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZm9y bSgneyRjb21wb25lbnRzX2Zvcm19JykudGV4dC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5 J10gPSAnJzsKCQkJYnJlYWs7CgkJCWNhc2UgJ2N1c3RvbScgOgoJCQkJZm9ybSgneyRjb21w b25lbnRzX2Zvcm19JykuY3VzdG9tLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcn OwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVhazsKCQkJY2FzZSAnY2F0ZWdvcnknIDoK CQkJCWZvcm0oJ3skY29tcG9uZW50c19mb3JtfScpLmNhdGVnb3J5LnBhcmVudE5vZGUuc3R5 bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVhazsKCQkJ ZGVmYXVsdCA6CgkJCQlkaXNwbGF5X2ZpeGVzKCk7CgkJCWJyZWFrOwoJCX0KCgkJLy8gU2F2 ZSBkYXRhCgkJY29tcG9uZW50c1tfY3VycmVudF0gPSBjOwoKCQkvLyBSZWZyZXNoIGNvbXBv bmVudCB0byByZWZsZWN0IG5ldyBkYXRhCgkJY29tcG9uZW50X3JlZnJlc2goY29tcG9uZW50 KF9jdXJyZW50KSk7CgoJCS8vIFJlLWZvY3VzIHRoZSBhY3RpdmUgZm9ybSBpbnB1dAoJCWlm IChlbGVtZW50KQoJCQllbGVtZW50LmZvY3VzKCk7Cgl9CgoJZnVuY3Rpb24gZGlzcGxheV9m aXhlcyAoKSB7CgkJaWYgKCd7JHNob3dfcHJlZml4fScpCgkJCWZvcm0oJ3skY29tcG9uZW50 c19mb3JtfScpLnByZWZpeC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCQlp ZiAoJ3skc2hvd19zdWZmaXh9JykKCQkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19Jykuc3Vm Zml4LnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJfQoKCWZ1bmN0aW9uIGNv bXBvbmVudF9sZWZ0ICgpIHsKCQlpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxICYmIF9jdXJy ZW50ID4gMCkgewoJCQkvLyBTdG9yZSBjdXJyZW50IGNvbXBvbmVudAoJCQl2YXIgYyA9IGNv bXBvbmVudHNbX2N1cnJlbnRdOwoKCQkJLy8gUmVtb3ZlIGN1cnJlbnQgY29tcG9uZW50CgkJ CWNvbXBvbmVudHMuc3BsaWNlKF9jdXJyZW50LCAxKTsKCgkJCS8vIFVwZGF0ZSBjdXJyZW50 IGluZGV4CgkJCV9jdXJyZW50LS07CgoJCQkvLyBSZS1hZGQgY3VycmVudCBjb21wb25lbnQK CQkJY29tcG9uZW50cy5zcGxpY2UoX2N1cnJlbnQsIDAsIGMpOwoKCQkJLy8gUmVmcmVzaCBV SQoJCQljb21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9u ZW50X3JpZ2h0ICgpIHsKCQlpZiAoX2N1cnJlbnQgPCBjb21wb25lbnRzLmxlbmd0aCAtIDEp IHsKCQkJLy8gU3RvcmUgY3VycmVudCBjb21wb25lbnQKCQkJdmFyIGMgPSBjb21wb25lbnRz W19jdXJyZW50XTsKCgkJCS8vIFJlbW92ZSBjdXJyZW50IGNvbXBvbmVudAoJCQljb21wb25l bnRzLnNwbGljZShfY3VycmVudCwgMSk7CgoJCQkvLyBVcGRhdGUgY3VycmVudCBpbmRleAoJ CQlfY3VycmVudCsrOwoKCQkJLy8gUmUtYWRkIGN1cnJlbnQgY29tcG9uZW50CgkJCWNvbXBv bmVudHMuc3BsaWNlKF9jdXJyZW50LCAwLCBjKTsKCgkJCS8vIFJlZnJlc2ggVUkKCQkJY29t cG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHNhdmUgKGZvcm0pIHsK CQl2YXIgYyA9ICcnOyB2YXIgaXNfcGVybWxpbmsgPSBmYWxzZTsgdmFyIGhhc19wYWdlX29y X3NlYXJjaCA9IGZhbHNlOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5n dGg7IGkrKykgewoJCQlpZiAoY29tcG9uZW50c1tpXVsndHlwZSddID09ICd0aXRsZScgfHwg Y29tcG9uZW50c1tpXVsndHlwZSddID09ICdpZCcpCgkJCQlpc19wZXJtbGluayA9IHRydWU7 CgkJCWlmIChjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0gJ3BhZ2UnIHx8IGNvbXBvbmVudHNb aV1bJ3R5cGUnXSA9PSAnZmVlZCcgfHwgY29tcG9uZW50c1tpXVsndHlwZSddID09ICdzZWFy Y2gnKQoJCQkJaGFzX3BhZ2VfZmVlZF9zZWFyY2ggPSB0cnVlOwoJCQljID0gYyArIGpzQXJy YXlUb1BocEFycmF5KGNvbXBvbmVudHNbaV0pICsgJ3skc2VwYXJhdG9yfSc7CgkJfQoKCQlp ZiAoaXNfcGVybWxpbmsgJiYgaGFzX3BhZ2Vfb3Jfc2VhcmNoKQoJCQlhbGVydCgiWW91ciBw ZXJtYW5lbnQgbGluayBjYW4ndCBjb250YWluIGVpdGhlciBhICdwYWdlJywgJ2ZlZWQnIG9y IGEgJ3NlYXJjaCcgY29tcG9uZW50IHdpdGggJ3RpdGxlJyBvciAnaWQnIGNvbXBvbmVudHMu Iik7CgoJCWVsc2UgaWYgKGlzX3Blcm1saW5rICYmIChmb3JtLnBsX25hbWUudmFsdWUgPT0g JycgfHwgZm9ybS5wbF9uYW1lLnZhbHVlID09ICdVbnRpdGxlZCcpKSB7CgkJCWRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncycpLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCQkJ Zm9ybS5wbF9uYW1lLnN0eWxlWydib3JkZXInXSA9ICczcHggc29saWQgcmdiKDIyMSwgMCwg MCknOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJyc7CgkJCWFs ZXJ0KCdQbGVhc2UgZW50ZXIgYSBuYW1lIGZvciB0aGlzIHBlcm1hbmVudCBsaW5rIHJ1bGUu Jyk7CgkJfSBlbHNlIGlmIChmb3JtLnBsX3ByZWNlZGVuY2UudmFsdWUgPT0gJycpIHsKCQkJ ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzJykuc3R5bGVbJ2Rpc3BsYXknXSA9 ICcnOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJzNweCBzb2xp ZCByZ2IoMjIxLCAwLCAwKSc7CgkJCWZvcm0ucGxfbmFtZS5zdHlsZVsnYm9yZGVyJ10gPSAn JzsKCQkJYWxlcnQoJ1BsZWFzZSBlbnRlciBhIHByZWNlZGVuY2UgdmFsdWUgZm9yIHRoaXMg cGVybWFuZW50IGxpbmsgcnVsZS4nKTsKCQl9IGVsc2UgewoJCQlmb3JtLmNvbXBvbmVudHMu dmFsdWUgPSBjOwoJCQlpZiAocGVybWxpbmtfZGl2KCkudGV4dENvbnRlbnQpCgkJCQlmb3Jt LnBsX3ByZXZpZXcudmFsdWUgPSBwZXJtbGlua19kaXYoKS50ZXh0Q29udGVudDsKCQkJZWxz ZSBpZiAocGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0KQoJCQkJZm9ybS5wbF9wcmV2aWV3LnZh bHVlID0gcGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJ CXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBqc0FycmF5VG9QaHBBcnJheSAoYXJyYXkp IHsKCQkvLyBodHRwOi8vZmFybS50dWNvd3MuY29tL2Jsb2cvX2FyY2hpdmVzLzIwMDUvNS8z MC84OTU5MDEuaHRtbAoJCXZhciBhcnJheV9waHAgPSAiIjsKCQl2YXIgdG90YWwgPSAwOwoJ CWZvciAodmFyIGtleSBpbiBhcnJheSkgewoJCQkrKyB0b3RhbDsKCQkJYXJyYXlfcGhwID0g YXJyYXlfcGhwICsgInM6IiArCgkJCQlTdHJpbmcoa2V5KS5sZW5ndGggKyAiOlwiIiArIFN0 cmluZyhrZXkpICsgIlwiO3M6IiArCgkJCQlTdHJpbmcoYXJyYXlba2V5XSkubGVuZ3RoICsg IjpcIiIgKyBTdHJpbmcoYXJyYXlba2V5XSkgKyAiXCI7IjsKCQl9CgkJYXJyYXlfcGhwID0g ImE6IiArIHRvdGFsICsgIjp7IiArIGFycmF5X3BocCArICJ9IjsKCQlyZXR1cm4gYXJyYXlf cGhwOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rX2RpdiAoKSB7CgkJLy8gUmV0dXJuIHRoZSBw ZXJtbGluayBydWxlIGVsZW1lbnQKCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo J3skY29tcG9uZW50c19kaXZ9Jyk7Cgl9CgoJZnVuY3Rpb24gZm9ybSAobmFtZSkgewoJCWlm ICghbmFtZSkKCQkJbmFtZSA9ICd7JGNvbXBvbmVudHNfZm9ybX0nCgkJLy8gUmV0dXJuIHRo ZSBmb3JtIGVsZW1lbnQgd2l0aCBuYW1lCgkJcmV0dXJuIGRvY3VtZW50LmZvcm1zLm5hbWVk SXRlbShuYW1lKTsKCX0KCglmdW5jdGlvbiBjb21wb25lbnQgKGluZGV4KSB7CgkJLy8gUmV0 dXJuIGNvbXBvbmVudCB3aXRoIGluZGV4CgkJcmV0dXJuIHBlcm1saW5rX2RpdigpLmNoaWxk Tm9kZXNbaW5kZXhdOwoJfQoKCS8vIF1dPgoJPC9zY3JpcHQ+CkhUTUw7CgoJCS8vIC0tLSBS dWxlIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJ1Blcm1hbmVudCBsaW5rIHJ1bGUnLCAyKTsK CQkkb3V0W10gPSAnPGRpdiBpZD0iJy4kY29tcG9uZW50c19kaXYuJyIgc3R5bGU9ImJhY2tn cm91bmQtY29sb3I6IHJnYigyMzAsIDIzMCwgMjMwKTsgd2lkdGg6IGF1dG87IGhlaWdodDog MS41ZW07IG1hcmdpbjogMTBweCAwOyBwYWRkaW5nOiA1cHg7Ij48L2Rpdj4nOwoJCSRvdXRb XSA9IGdyYWYKCQkJKAoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X2Fk ZCcsICdBZGQgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X2FkZCgp OycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X3JlbW92ZScs ICdSZW1vdmUgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X3JlbW92 ZSgpOycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X2xlZnQn LCAnTW92ZSBsZWZ0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X2xlZnQoKTsnKSku bi4KCQkJJHRoaXMtPmZJbnB1dCgnYnV0dG9uJywgJ2NvbXBvbmVudF9yaWdodCcsICdNb3Zl IHJpZ2h0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X3JpZ2h0KCk7JykpCgkJCSk7 CgoJCS8vIC0tLSBDb21wb25lbnQgZm9ybSAtLS0gLy8KCgkJJG91dFtdID0gJzxmb3JtIGFj dGlvbj0iaW5kZXgucGhwIiBuYW1lPSInLiRjb21wb25lbnRzX2Zvcm0uJyIgb25zdWJtaXQ9 InJldHVybiBmYWxzZTsiPic7CgoJCS8vIC0tLSBDb21wb25lbnQgdHlwZSAtLS0gLy8KCgkJ JGNvbXBvbmVudF90eXBlcyA9IGFycmF5ICgKCQkJJ3NlY3Rpb24nID0+ICdTZWN0aW9uJywg J2NhdGVnb3J5JyA9PiAnQ2F0ZWdvcnknLAoJCQkndGl0bGUnID0+ICdUaXRsZScsICdpZCcg PT4gJ0lEJywKCQkJJ2RhdGUnID0+ICdEYXRlICh5eXl5L21tL2RkKScsICd5ZWFyJyA9PiAn WWVhcicsCgkJCSdtb250aCcgPT4gJ01vbnRoJywgJ2RheScgPT4gJ0RheScsCgkJCSdhdXRo b3InID0+ICdBdXRob3IgKFJlYWwgbmFtZSknLCAnbG9naW4nID0+ICdBdXRob3IgKExvZ2lu KScsCgkJCSdjdXN0b20nID0+ICdDdXN0b20gRmllbGQnLCAncGFnZScgPT4gJ1BhZ2UgTnVt YmVyJywKCQkJJ2ZlZWQnID0+ICdGZWVkJywgJ3NlYXJjaCcgPT4gJ1NlYXJjaCByZXF1ZXN0 JywKCQkJJ3RleHQnID0+ICdQbGFpbiBUZXh0JywgJ3JlZ2V4JyA9PiAnUmVndWxhciBFeHBy ZXNzaW9uJwoJCSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZlNlbGVjdCgndHlwZScsICRj b21wb25lbnRfdHlwZXMsICcnLCAxLCAnQ29tcG9uZW50IHR5cGUnLCAnIG9uY2hhbmdlPSJj b21wb25lbnRfdXBkYXRlKCk7IicpKTsKCgkJLy8gLS0tIENvbXBvbmVudCBkYXRhIC0tLSAv LwoKCQkvLyBHcmFiIHRoZSBjdXN0b20gZmllbGQgdGl0bGVzCgkJJGN1c3RvbV9maWVsZHMg PSBhcnJheSgpOwoJCWZvciAoJGkgPSAxOyAkaSA8PSAxMDsgJGkrKykgewoJCQlpZiAoJHYg PSAkcHJlZnNbImN1c3RvbV97JGl9X3NldCJdKQoJCQkJJGN1c3RvbV9maWVsZHNbJGldID0g JHY7CgkJfQoKCQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2N1c3RvbScs ICRjdXN0b21fZmllbGRzLCAnJywgMCwgJ0N1c3RvbScsICcgb25jaGFuZ2U9ImNvbXBvbmVu dF91cGRhdGUodGhpcyk7IicpLm4uCgkJCSR0aGlzLT5mU2VsZWN0KCdjYXRlZ29yeScsIGFy cmF5KCcxJyA9PiAnQ2F0ZWdvcnkgMScsICcyJyA9PiAnQ2F0ZWdvcnkgMicpLCAnJywgMCwg J1ByaW1hcnkgQ2F0ZWdvcnknLCAnIG9uY2hhbmdlPSJjb21wb25lbnRfdXBkYXRlKHRoaXMp OyInKS5uLgoJCQkkdGhpcy0+ZklucHV0KCd0ZXh0JywgJ25hbWUnLCAnJywgYXJyYXkoJ2tl eXVwJyA9PiAnY29tcG9uZW50X3VwZGF0ZSh0aGlzKTsnKSwgJ05hbWUnKS5uLgoJCQkkdGhp cy0+ZklucHV0KCd0ZXh0JywgJ3ByZWZpeCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21w b25lbnRfdXBkYXRlKHRoaXMpOycpLCAnUHJlZml4Jykubi4KCQkJJHRoaXMtPmZJbnB1dCgn dGV4dCcsICdyZWdleCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRl KHRoaXMpOycpLCAnUmVndWxhciBFeHByZXNzaW9uJykubi4KCQkJJHRoaXMtPmZJbnB1dCgn dGV4dCcsICdzdWZmaXgnLCAnJywgYXJyYXkoJ2tleXVwJyA9PiAnY29tcG9uZW50X3VwZGF0 ZSh0aGlzKTsnKSwgJ1N1ZmZpeCcpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ3RleHQnLCAndGV4 dCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRlKHRoaXMpOycpLCAn VGV4dCcpCgkJKTsKCQkkaHIgPSAnPGhyIHN0eWxlPSJib3JkZXI6IDA7IGhlaWdodDogMXB4 OyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAwLCAyMDAsIDIwMCk7IGNvbG9yOiByZ2IoMjAw LCAyMDAsIDIwMCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IiAvPic7CgkJJG91dFtdID0gJGhy OwoJCSRvdXRbXSA9ICc8L2Zvcm0+JzsKCgkJLy8gLS0tIFNldHRpbmdzIGZvcm0gLS0tIC8v CgoJCSRvdXRbXSA9ICc8Zm9ybSBhY3Rpb249ImluZGV4LnBocCIgbWV0aG9kPSJwb3N0IiBu YW1lPSInLiRzZXR0aW5nc19mb3JtLiciIG9uc3VibWl0PSJyZXR1cm4gc2F2ZSh0aGlzKTsi Pic7CgoJCS8vIC0tLSBTZXR0aW5ncyAtLS0gLy8KCgkJJG91dFtdID0gaGVkKCc8YSBocmVm PSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnc2V0dGluZ3NcJyk7IHJldHVybiBmYWxz ZTsiPlNldHRpbmdzPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJzZXR0aW5ncyI+ JzsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQoJ3RleHQnLCAncGxfbmFtZScsICRw bF9uYW1lLCBOVUxMLCAnTmFtZScpKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQo J3RleHQnLCAncGxfcHJlY2VkZW5jZScsICRwbF9wcmVjZWRlbmNlLCBOVUxMLCAnUHJlY2Vk ZW5jZScpKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsKCQkkb3V0W10gPSAkaHI7CgoJCS8vIC0t LSBDb25kaXRpb25zIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJzxhIGhyZWY9IiMiIG9uY2xp Y2s9InRvZ2dsZURpc3BsYXkoXCdjb25kaXRpb25zXCcpOyByZXR1cm4gZmFsc2U7Ij5Db25k aXRpb25zPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJjb25kaXRpb25zIiBzdHls ZT0iZGlzcGxheTpub25lIj4nOwoJCSRvdXRbXSA9IGdyYWYoc3Ryb25nKCdPbmx5IHVzZSB0 aGlzIHBlcm1hbmVudCBsaW5rIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseS4u LicpKTsKCgkJLy8gR2VuZXJhdGUgYSBzZWN0aW9ucyBhcnJheSAobmFtZT0+dGl0bGUpCgkJ JHNlY3Rpb25zID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZlX3Jvd3MoJ25hbWUsIHRpdGxlJywg J3R4cF9zZWN0aW9uJywgIm5hbWUgIT0gJ2RlZmF1bHQnIG9yZGVyIGJ5IG5hbWUiKTsKCQlm b3JlYWNoICgkcnMgYXMgJHNlYykgewoJCQkkc2VjdGlvbnNbJHNlY1snbmFtZSddXSA9ICRz ZWNbJ3RpdGxlJ107CgkJfQoKCQkvLyBHZW5lcmF0ZSBhIGNhdGVnb3JpZXMgYXJyYXkgKG5h bWU9PnRpdGxlKQoJCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZlX3Jvd3Mo J25hbWUsIHRpdGxlJywgJ3R4cF9jYXRlZ29yeScsICJ0eXBlID0gJ2FydGljbGUnIGFuZCBu YW1lICE9ICdyb290JyBvcmRlciBieSBuYW1lIik7CgkJZm9yZWFjaCAoJHJzIGFzICRzZWMp IHsKCQkJJGNhdGVnb3JpZXNbJHNlY1snbmFtZSddXSA9ICRzZWNbJ3RpdGxlJ107CgkJfQoK CQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2Nvbl9zZWN0aW9uJywgJHNl Y3Rpb25zLCAkY29uX3NlY3Rpb24sIDEsICdXaXRoaW4gc2VjdGlvbicpLm4uCgkJCSR0aGlz LT5mU2VsZWN0KCdjb25fY2F0ZWdvcnknLCAkY2F0ZWdvcmllcywgJGNvbl9jYXRlZ29yeSwg MSwgJ1dpdGhpbiBjYXRlZ29yeScpCgkJKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsKCQkkb3V0 W10gPSAkaHI7CgoJCS8vIC0tLSBEZXN0aW5hdGlvbiAtLS0gLy8KCgkJJG91dFtdID0gaGVk KCc8YSBocmVmPSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnZGVzdGluYXRpb25cJyk7 IHJldHVybiBmYWxzZTsiPkRlc3RpbmF0aW9uPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2 IGlkPSJkZXN0aW5hdGlvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+JzsKCQkkb3V0W10gPSBn cmFmKHN0cm9uZygnRm9yd2FyZCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykpOwoJCSRv dXRbXSA9IGdyYWYgKAoJCQkkdGhpcy0+ZlNlbGVjdCgnZGVzX3NlY3Rpb24nLCAkc2VjdGlv bnMsICRkZXNfc2VjdGlvbiwgMSwgJ1NlY3Rpb24nKS5uLgoJCQkkdGhpcy0+ZlNlbGVjdCgn ZGVzX2NhdGVnb3J5JywgJGNhdGVnb3JpZXMsICRkZXNfY2F0ZWdvcnksIDEsICdDYXRlZ29y eScpCgkJKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mU2VsZWN0KCdkZXNfcGFnZScsIHNh ZmVfY29sdW1uKCduYW1lJywgJ3R4cF9wYWdlJywgIjEiKSwgQCRkZXNfcGFnZSwgMSwgJ1Bh Z2UnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZkJveGVzKCdkZXNfZmVlZCcsIGFycmF5 KCdyc3MnLCAnYXRvbScsICcnKSwgJGRlc19mZWVkLCBOVUxMLCBhcnJheSgnUlNTIGZlZWQn LCAnQXRvbSBmZWVkJywgJ05laXRoZXInKSkpOwoJCSRvdXRbXSA9IGdyYWYoc3Ryb25nKCdS ZWRpcmVjdCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykpOwoJCS8vIEdlbmVyYXRlIGEg cGVybWxpbmtzIGFycmF5CgkJJHBlcm1saW5rcyA9ICR0aGlzLT5wYXJlbnQtPmdldF9hbGxf cGVybWxpbmtzKDEpOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtleSA9PiAkcGwpIHsK CQkJJHBlcm1saW5rc1ska2V5XSA9ICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSddOwoJCX0K CQl1bnNldCgkcGVybWxpbmtzWyRpZF0pOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMtPmZTZWxl Y3QoJ2Rlc19wZXJtbGluaycsICRwZXJtbGlua3MsIEAkZGVzX3Blcm1saW5rLCAxLCAnUGVy bWFuZW50IGxpbmsnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZklucHV0KCd0ZXh0Jywg J2Rlc19sb2NhdGlvbicsICRkZXNfbG9jYXRpb24sIE5VTEwsICdIVFRQIGxvY2F0aW9uJykp OwoJCSRvdXRbXSA9ICc8L2Rpdj4nOwoJCSRvdXRbXSA9ICRocjsKCgkJLy8gU2F2ZSBidXR0 b24KCQkkb3V0W10gPSBmSW5wdXQoJ3N1Ym1pdCcsICcnLCAnU2F2ZSBwZXJtYW5lbnQgbGlu aycpOwoKCQkvLyBFeHRyYSBmb3JtIGlucHV0cyB3aGljaCBnZXQgZmlsbGVkIG9uIHN1Ym1p dAoJCSRvdXRbXSA9IGhJbnB1dCgnY29tcG9uZW50cycsICcnKTsKCQkkb3V0W10gPSBoSW5w dXQoJ3BsX3ByZXZpZXcnLCAnJyk7CgkJLy8gRXZlbnQgYW5kIHRhYiBmb3JtIGlucHV0cwoJ CSRvdXRbXSA9ICR0aGlzLT5mb3JtX2lucHV0cygpOwoJCS8vIFN0ZXAgYW5kIElEIGZvcm0g aW5wdXRzCgkJJG91dFtdID0gc0lucHV0KCRzdGVwKTsKCQkkb3V0W10gPSBoSW5wdXQoZ2Jw X2lkLCAkaWQpOwoKCQkkb3V0W10gPSAnPC9mb3JtPic7CgoJCS8vIExldHMgZWNobyBldmVy eXRoaW5nIG91dC4gWWFoIQoJCWVjaG8gam9pbihuLCAkb3V0KTsKCX0KCglmdW5jdGlvbiBm TGFiZWwgKCRsYWJlbCwgJGNvbnRlbnRzID0gJycsICRsYWJlbF9yaWdodCA9IGZhbHNlKSB7 CgkJLy8gPGxhYmVsPiB0aGUgY29udGVudHMgd2l0aCB0aGUgbmFtZSAkbGFibGUKCQkkY29u dGVudHMgPSAoJGxhYmVsX3JpZ2h0KQoJCT8gJGNvbnRlbnRzLiRsYWJlbAoJCTogJGxhYmVs LigkY29udGVudHMgPyAnOiAnLiRjb250ZW50cyA6ICcnKTsKCQlyZXR1cm4gdGFnKCRjb250 ZW50cywgJ2xhYmVsJyk7Cgl9CgoJZnVuY3Rpb24gZkJveGVzICgkbmFtZSA9ICcnLCAkdmFs dWUgPSAnJywgJGNoZWNrZWRfdmFsdWUgPSAnJywgJG9uID0gYXJyYXkoKSwgJGxhYmVsID0g JycpIHsKCQkkb3V0ID0gYXJyYXkoKTsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkk aSA9IDA7CgkJCWZvcmVhY2ggKCR2YWx1ZSBhcyAkdmFsKSB7CgkJCQkkbyA9ICc8aW5wdXQg dHlwZT0icmFkaW8iIG5hbWU9IicuJG5hbWUuJyIgdmFsdWU9IicuJHZhbC4nIic7CgkJCQkk byAuPSAoJGNoZWNrZWRfdmFsdWUgPT0gJHZhbCkgPyAnIGNoZWNrZWQ9ImNoZWNrZWQiJyA6 ICcnOwoJCQkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJ CQkJCSRvIC49ICgkb24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJCSRvIC49 ICcgLz4nOwoJCQkJJG91dFtdID0gJHRoaXMtPmZMYWJlbCgkbGFiZWxbJGkrK10sICRvLCB0 cnVlKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRvID0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIg bmFtZT0iJy4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwoJCQkkbyAuPSAoJGNoZWNr ZWRfdmFsdWUgPT0gJHZhbHVlKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7CgkJCWlm IChpc19hcnJheSgkb24pKSBmb3JlYWNoKCRvbiBhcyAkayA9PiAkdikKCQkJCSRvIC49ICgk b24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJJG8gLj0gJyAvPic7CgkJCSRv dXRbXSA9ICR0aGlzLT5mTGFiZWwoJGxhYmVsLCAkbywgdHJ1ZSk7CgkJfQoKCQlyZXR1cm4g am9pbignJywgJG91dCk7Cgl9CgoJZnVuY3Rpb24gZklucHV0ICgkdHlwZSwgJG5hbWUgPSAn JywgJHZhbHVlID0gJycsICRvbiA9IGFycmF5KCksICRsYWJlbCA9ICcnKSB7CgkJaWYgKCR0 eXBlID09ICdyYWRpbycgfHwgJHR5cGUgPT0gJ2NoZWNrYm94JykKCQkJcmV0dXJuICR0aGlz LT5mQm94ZXMoJG5hbWUsICR2YWx1ZSwgJG9uLCAkbGFiZWwpOwoKCQkkbyA9ICc8aW5wdXQg dHlwZT0iJy4kdHlwZS4nIiBuYW1lPSInLiRuYW1lLiciIHZhbHVlPSInLiR2YWx1ZS4nIic7 CgkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJCQkkbyAu PSAoJG9uKSA/ICcgb24nLiRrLic9IicuJHYuJyInIDogJyc7CgkJJG8gLj0gJyAvPic7CgkJ cmV0dXJuICgkbGFiZWwpID8gJHRoaXMtPmZMYWJlbCgkbGFiZWwsICRvKSA6ICRvOwoJfQoK CWZ1bmN0aW9uIGZTZWxlY3QgKCRuYW1lID0gJycsICRhcnJheSA9ICcnLCAkdmFsdWUgPSAn JywgJGJsYW5rX2ZpcnN0ID0gJycsICRsYWJlbCA9ICcnLCAkb25fc3VibWl0ID0gJycpIHsK CQkkbyA9IHNlbGVjdElucHV0KCRuYW1lLCAkYXJyYXksICR2YWx1ZSwgJGJsYW5rX2ZpcnN0 LCAkb25fc3VibWl0KTsKCQlyZXR1cm4gKCRsYWJlbCA/ICR0aGlzLT5mTGFiZWwoJGxhYmVs LCAkbykgOiAkbyk7Cgl9CgoJZnVuY3Rpb24gcG9zdF9zYXZlX3Blcm1saW5rICgpIHsKCQkv LyBUaGUgZnVuY3Rpb24gcG9zdHMgb3Igc2F2ZXMgYSBwZXJtYW5lbnQgbGluayB0byB0eHBf cHJlZnMKCgkJZXh0cmFjdChncHNhKGFycmF5KCdzdGVwJywgZ2JwX2lkKSkpOwoKCQkvLyBH cmFiIHRoZSB1c2VyIGRlZmluZWQgc2V0dGluZ3MgZnJvbSB0aGUgZm9ybSBQT1NUIGRhdGEK CQkkc2V0dGluZ3MgPSBncHNhKGFycmF5KAoJCQkncGxfbmFtZScsICdwbF9wcmVjZWRlbmNl JywgJ3BsX3ByZXZpZXcnLAoJCQknY29uX3NlY3Rpb24nLCAnY29uX2NhdGVnb3J5JywKCQkJ J2Rlc19zZWN0aW9uJywgJ2Rlc19jYXRlZ29yeScsICdkZXNfcGFnZScsCgkJCSdkZXNfcGVy bWxpbmsnLCAnZGVzX2ZlZWQnLCAnZGVzX2xvY2F0aW9uJywKCQkpKTsKCgkJLy8gUmVtb3Zl IHNwYWNlcyBmcm9tIHRoZSBwZXJtYW5lbnQgbGluayBwcmV2aWV3CgkJJHNldHRpbmdzWydw bF9wcmV2aWV3J10gPSBwcmVnX3JlcGxhY2UoJyVccysvXHMqJScsICcvJywgJHNldHRpbmdz WydwbF9wcmV2aWV3J10pOwoKCQkvLyBFeHBsb2RlIHRoZSBzZXBhcmF0ZWQgc3RyaW5nIG9m IHNlcmlhbGl6ZSBjb21wb25lbnRzIC0gdGhpcyB3YXMgbWFkZSBieSBKYXZhU2NyaXB0LgoJ CSRzZXJpYWxpemVfY29tcG9uZW50cyA9IGV4cGxvZGUoZ2JwX3NlcGFyYXRvciwgcnRyaW0o Z3BzKCdjb21wb25lbnRzJyksIGdicF9zZXBhcmF0b3IpKTsKCgkJLy8gVW5zZXJpYWxpemUg dGhlIGNvbXBvbmVudHMKCQkkY29tcG9uZW50cyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHNl cmlhbGl6ZV9jb21wb25lbnRzIGFzICRjKQoJCQkkY29tcG9uZW50c1tdID0gdW5zZXJpYWxp emUoc3RyaXBzbGFzaGVzKCRjKSk7CgoJCS8vIENvbXBsZXRlIHRoZSBwZXJtYW5lbnQgbGlu ayBhcnJheSAtIHRoaXMgaXMgZXhhY3RseSB3aGF0IG5lZWRzIHRvIGJlIHN0b3JlZCBpbiB0 aGUgZGIKCQkkcGVybWxpbmsgPSBhcnJheSgnc2V0dGluZ3MnID0+ICRzZXR0aW5ncywgJ2Nv bXBvbmVudHMnID0+ICRjb21wb25lbnRzKTsKCgkJLy8gU2F2ZSBpdAoJCSR0aGlzLT5zZXRf cHJlZmVyZW5jZSgkaWQsICRwZXJtbGluaywgJ2dicF9zZXJpYWxpemVkJyk7CgoJCSR0aGlz LT5wYXJlbnQtPm1lc3NhZ2UgPSBtZXNzZW5nZXIoJycsICRzZXR0aW5nc1sncGxfbmFtZSdd LCAnc2F2ZWQnKTsKCX0KCglmdW5jdGlvbiBwaHBBcnJheVRvSnNBcnJheSAoJG5hbWUsICRh cnJheSkgewoJCS8vIEZyb20gUEhQLm5ldAoJCWlmIChpc19hcnJheSgkYXJyYXkpKSB7CgkJ CSRyZXN1bHQgPSAkbmFtZS4nID0gbmV3IEFycmF5KCk7Jy5uOwoJCQlmb3JlYWNoICgkYXJy YXkgYXMgJGtleSA9PiAkdmFsdWUpCgkJCQkkcmVzdWx0IC49ICR0aGlzLT5waHBBcnJheVRv SnNBcnJheSgkbmFtZS4nW1wnJy4ka2V5LidcJ10nLCR2YWx1ZSwnJykubjsKCQl9IGVsc2Ug ewoJCQkkcmVzdWx0ID0gJG5hbWUuJyA9IFwnJy4kYXJyYXkuJ1wnOyc7CgkJfQoJCXJldHVy biAkcmVzdWx0OwoJfQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0xpc3RUYWJWaWV3IGV4dGVu ZHMgR0JQQWRtaW5UYWJWaWV3CnsKCWZ1bmN0aW9uIHByZWxvYWQgKCkgewoJCXJlZ2lzdGVy X2NhbGxiYWNrKGFycmF5KCYkdGhpcywgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19tdWx0aV9l ZGl0JyksICR0aGlzLT5wYXJlbnQtPmV2ZW50LCAkdGhpcy0+cGFyZW50LT5ldmVudC4nX211 bHRpX2VkaXQnLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMsICR0aGlz LT5wYXJlbnQtPmV2ZW50LidfY2hhbmdlX3BhZ2VieScpLCAkdGhpcy0+cGFyZW50LT5ldmVu dCwgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19jaGFuZ2VfcGFnZWJ5JywgMSk7Cgl9CgoJZnVu Y3Rpb24gbWFpbiAoKSB7CgkJZXh0cmFjdChncHNhKGFycmF5KCdwYWdlJywgJ3NvcnQnLCAn ZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcpKSk7CgoJCSRldmVudCA9ICR0aGlzLT5w YXJlbnQtPmV2ZW50OwoKCQkkcGVybWxpbmtzID0gJHRoaXMtPnBhcmVudC0+Z2V0X2FsbF9w ZXJtbGlua3MoKTsKCQkkdG90YWwgPSBjb3VudCgkcGVybWxpbmtzKTsKCgkJaWYgKCR0b3Rh bCA8IDEpIHsKCQkJZWNobyBncmFmKCdZb3UgaGF2ZW5cJ3QgY3JlYXRlZCBhbnkgY3VzdG9t IHBlcm1hbmVudCBsaW5rcyBydWxlcyB5ZXQuJywgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu dGVyOyInKS4KCQkJCSBncmFmKCc8YSBocmVmPSInLiR0aGlzLT51cmwoYXJyYXkoZ2JwX3Rh YiA9PiAnYnVpbGQnKSwgdHJ1ZSkuJyI+Q2xpY2sgaGVyZTwvYT4gdG8gYWRkIG9uZS4nLCAn IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IicpOwoJCQlyZXR1cm47CgkJfQoKCQkkbGlt aXQgPSBtYXgoJHRoaXMtPnByZWYoJ2xpc3RfcGFnZWJ5JyksIDE1KTsKCgkJbGlzdCgkcGFn ZSwgJG9mZnNldCwgJG51bVBhZ2VzKSA9ICR0aGlzLT5wYWdlcigkdG90YWwsICRsaW1pdCwg JHBhZ2UpOwoKCQlpZiAoZW1wdHkoJHNvcnQpKQoJCQkkc29ydCA9ICdwbF9wcmVjZWRlbmNl JzsKCgkJaWYgKGVtcHR5KCRkaXIpKQoJCQkkZGlyID0gJ2Rlc2MnOwoKCQkkZGlyID0gKCRk aXIgPT0gJ2Rlc2MnKSA/ICdkZXNjJyA6ICdhc2MnOwoKCQkvLyBTb3J0IHRoZSBwZXJtbGlu a3MgdmlhIHRoZSBzZWxlY3RlZCBjb2x1bW4gYW5kIHRoZW4gdGhlaXIgbmFtZXMuCgkJZm9y ZWFjaCAoJHBlcm1saW5rcyBhcyAkaWQgPT4gJHBlcm1saW5rKSB7CgkJCSRzb3J0X2tleXNb JGlkXSA9ICRwZXJtbGlua1snc2V0dGluZ3MnXVskc29ydF07CgkJCSRuYW1lWyRpZF0gPSAk cGVybWxpbmtbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXTsKCQl9CgkJYXJyYXlfbXVsdGlzb3J0 KCRzb3J0X2tleXMsICgoJGRpciA9PSAnZGVzYycpID8gU09SVF9ERVNDIDogU09SVF9BU0Mp LCAkbmFtZSwgU09SVF9BU0MsICRwZXJtbGlua3MpOwoKCQkkc3dpdGNoX2RpciA9ICgkZGly ID09ICdkZXNjJykgPyAnYXNjJyA6ICdkZXNjJzsKCgkJJHBlcm1saW5rcyA9IGFycmF5X3Ns aWNlKCRwZXJtbGlua3MsICRvZmZzZXQsICRsaW1pdCk7CgoJCWlmIChjb3VudCgkcGVybWxp bmtzKSkgewoJCQllY2hvIG4ubi4nPGZvcm0gbmFtZT0ibG9uZ2Zvcm0iIG1ldGhvZD0icG9z dCIgYWN0aW9uPSJpbmRleC5waHAiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0 KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoKCQkJCW4uc3RhcnRUYWJsZSgnbGlzdCcpLgoJ CQkJbi50cigKCQkJCQluLmNvbHVtbl9oZWFkKCduYW1lJywgJ3BsX25hbWUnLCAkZXZlbnQs IHRydWUsICRzd2l0Y2hfZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QpLgoJCQkJCWhDZWxs KCkuCgkJCQkJY29sdW1uX2hlYWQoJ3ByZXZpZXcnLCAncGxfcHJldmlldycsICRldmVudCwg dHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJY29sdW1u X2hlYWQoJ3ByZWNlZGVuY2UnLCAncGxfcHJlY2VkZW5jZScsICRldmVudCwgdHJ1ZSwgJHN3 aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJaENlbGwoKQoJCQkJKTsK CgkJCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3RhZ2hhbmRsZXJzLnBocCc7CgoJ CQlmb3JlYWNoICgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGVybWxpbmspIHsKCQkJCWV4dHJh Y3QoJHBlcm1saW5rWydzZXR0aW5ncyddKTsKCgkJCQkkbWFuYWdlID0gbi4nPHVsJy4odmVy c2lvbl9jb21wYXJlKCRHTE9CQUxTWyd0aGlzdmVyc2lvbiddLCAnNC4wLjMnLCAnPD0nKSA/ ICcgc3R5bGU9Im1hcmdpbjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlLXR5cGU6bm9uZTsiPicg OiAnPicpLgoJCQkJCQluLnQuJzxsaT4nLmhyZWYoZ1R4dCgnZWRpdCcpLCAkdGhpcy0+dXJs KGFycmF5KGdicF90YWIgPT4gJ2J1aWxkJywgZ2JwX2lkID0+ICRpZCksIHRydWUpKS4nPC9s aT4nLgoJCQkJCQluLic8L3VsPic7CgoJCQkJZWNobyBuLm4udHIoCgoJCQkJCXRkKAoJCQkJ CQlocmVmKCRwbF9uYW1lLCAkdGhpcy0+dXJsKGFycmF5KGdicF90YWIgPT4gJ2J1aWxkJywg Z2JwX2lkID0+ICRpZCksIHRydWUpKQoJCQkJCSwgNzUpLgoKCQkJCQl0ZCgkbWFuYWdlLCAz NSkuCgoJCQkJCXRkKCRwbF9wcmV2aWV3LCAxNzUpLgoJCQkJCXRkKCRwbF9wcmVjZWRlbmNl LicmbmJzcDsnLCA1MCkuCgoJCQkJCXRkKAoJCQkJCQlmSW5wdXQoJ2NoZWNrYm94JywgJ3Nl bGVjdGVkW10nLCAkaWQpCgkJCQkJKQoJCQkJKTsKCQkJfQoKCQkJZWNobyBuLm4udHIoCgkJ CQl0ZGEoCgkJCQkJc2VsZWN0X2J1dHRvbnMoKS4KCQkJCQkkdGhpcy0+cGVybWxpbmtzX211 bHRpZWRpdF9mb3JtKCRwYWdlLCAkc29ydCwgJGRpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9k KQoJCQkJLCcgY29sc3Bhbj0iNCIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyBib3JkZXI6 IG5vbmU7IicpCgkJCSkuCgoJCQluLmVuZFRhYmxlKCkuCgkJCW4uJzwvZm9ybT4nLgoKCQkJ bi4kdGhpcy0+bmF2X2Zvcm0oJGV2ZW50LCAkcGFnZSwgJG51bVBhZ2VzLCAkc29ydCwgJGRp ciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4KCgkJCW4ucGFnZWJ5X2Zvcm0oJGV2ZW50LCAk dGhpcy0+cHJlZignbGlzdF9wYWdlYnknKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHBhZ2VyICgk dG90YWwsICRsaW1pdCwgJHBhZ2UpIHsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdwYWdlcicp KQoJCQlyZXR1cm4gcGFnZXIoJHRvdGFsLCAkbGltaXQsICRwYWdlKTsKCgkJLy8gVGhpcyBp cyB0YWtlbiBmcm9tIHR4cGxpYl9taXNjLnBocCByMTU4OCBpdCBpcyByZXF1aXJlZCBmb3Ig NC4wLjMgY29tcGF0aWJpdGx5CgkJJG51bV9wYWdlcyA9IGNlaWwoJHRvdGFsIC8gJGxpbWl0 KTsKCQkkcGFnZSA9ICRwYWdlID8gKGludCkgJHBhZ2UgOiAxOwoJCSRwYWdlID0gbWluKG1h eCgkcGFnZSwgMSksICRudW1fcGFnZXMpOwoJCSRvZmZzZXQgPSBtYXgoKCRwYWdlIC0gMSkg KiAkbGltaXQsIDApOwoJCXJldHVybiBhcnJheSgkcGFnZSwgJG9mZnNldCwgJG51bV9wYWdl cyk7Cgl9CgoJZnVuY3Rpb24gbmF2X2Zvcm0gKCRldmVudCwgJHBhZ2UsICRudW1QYWdlcywg JHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygn bmF2X2Zvcm0nKSkKCQkJcmV0dXJuIG5hdl9mb3JtKCRldmVudCwgJHBhZ2UsICRudW1QYWdl cywgJHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKTsKCgkJLy8gVGhpcyBpcyBiYXNpY2Fs bHkgc3RvbGVuIGZyb20gdGhlIDQuMC4zIHZlcnNpb24gb2YgaW5jbHVkZXMvdHhwX2xpc3Qu cGhwCgkJLy8gLSBsaXN0X25hdl9mb3JtKCkgZm9yIDQuMC4zIGNvbXBhdGliaXRseQoJCSRu YXZbXSA9ICgkcGFnZSA+IDEpCgkJCT8gUHJldk5leHRMaW5rKCRldmVudCwgJHBhZ2UtMSwg Z1R4dCgncHJldicpLCAncHJldicsICRzb3J0LCAkZGlyKSA6ICcnOwoJCSRuYXZbXSA9IHNw LnNtYWxsKCRwYWdlLiAnLycuJG51bVBhZ2VzKS5zcDsKCQkkbmF2W10gPSAoJHBhZ2UgIT0g JG51bVBhZ2VzKQoJCQk/IFByZXZOZXh0TGluaygkZXZlbnQsICRwYWdlKzEsIGdUeHQoJ25l eHQnKSwgJ25leHQnLCAkc29ydCwgJGRpcikgOiAnJzsKCQlyZXR1cm4gKCRuYXYpCgkJCT8g Z3JhZihqb2luKCcnLCAkbmF2KSwgJyBhbGlnbj0iY2VudGVyIicpIDogJyc7Cgl9CgoJZnVu Y3Rpb24gcGVybWxpbmtzX211bHRpZWRpdF9mb3JtICgkcGFnZSwgJHNvcnQsICRkaXIsICRj cml0LCAkc2VhcmNoX21ldGhvZCkgewoJCSRtZXRob2RzID0gYXJyYXkoCgkJCSdkZWxldGUn ID0+IGdUeHQoJ2RlbGV0ZScpLAoJCSk7CgoJCXJldHVybiBldmVudF9tdWx0aWVkaXRfZm9y bSgkdGhpcy0+cGFyZW50LT5ldmVudCwgJG1ldGhvZHMsICRwYWdlLCAkc29ydCwgJGRpciwg JGNyaXQsICRzZWFyY2hfbWV0aG9kKTsKCX0KCglmdW5jdGlvbiBwZXJtbGlua3NfY2hhbmdl X3BhZ2VieSAoKSB7CgkJJHRoaXMtPnNldF9wcmVmZXJlbmNlKCdsaXN0X3BhZ2VieScsIGdw cygncXR5JykpOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rc19tdWx0aV9lZGl0ICgpIHsKCQkk bWV0aG9kID0gZ3BzKCdlZGl0X21ldGhvZCcpCgkJCT8gZ3BzKCdlZGl0X21ldGhvZCcpIC8v IEZyb20gVHhwIDQuMC40IGFuZCBncmVhdGVyCgkJCTogZ3BzKCdtZXRob2QnKTsgLy8gVXAg dG8gVHhwIDQuMC4zCgoJCXN3aXRjaCAoJG1ldGhvZCkgewoJCQljYXNlICdkZWxldGUnOgoJ CQkJZm9yZWFjaCAoZ3BzKCdzZWxlY3RlZCcpIGFzICRpZCkgewoJCQkJCQkJJGRlbGV0ZWRb XSA9ICR0aGlzLT5wYXJlbnQtPnJlbW92ZV9wZXJtbGluaygkaWQpOwoJCQkJfQoJCQlicmVh azsKCQl9CgoJCSR0aGlzLT5wYXJlbnQtPm1lc3NhZ2UgPSAoaXNzZXQoJGRlbGV0ZWQpICYm IGlzX2FycmF5KCRkZWxldGVkKSAmJiBjb3VudCgkZGVsZXRlZCkpCgkJCT8gbWVzc2VuZ2Vy KCcnLCBqb2luKCcsICcsICRkZWxldGVkKSAsJ2RlbGV0ZWQnKQoJCQk6IG1lc3Nlbmdlcign YW4gZXJyb3Igb2NjdXJyZWQnLCAnJywgJycpOwoJfQp9CgpnbG9iYWwgJGdicF9wbDsKJGdi cF9wbCA9IG5ldyBQZXJtYW5lbnRMaW5rcygnUGVybWFuZW50IExpbmtzJywgJ3Blcm1saW5r cycsICdhZG1pbicpOwppZiAoQHR4cGludGVyZmFjZSA9PSAncHVibGljJykgewoJcmVnaXN0 ZXJfY2FsbGJhY2soYXJyYXkoJiRnYnBfcGwsICdfZmVlZF9lbnRyeScpLCAncnNzX2VudHJ5 Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ19mZWVkX2VudHJ5Jyks ICdhdG9tX2VudHJ5Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ190 ZXh0cGF0dGVybicpLCAndGV4dHBhdHRlcm4nKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5 KCYkZ2JwX3BsLCAnX3RleHRwYXR0ZXJuX2VuZCcpLCAndGV4dHBhdHRlcm5fZW5kJyk7CgoJ ZnVuY3Rpb24gZ2JwX2lmX3JlZ2V4ICgkYXR0cywgJHRoaW5nKSB7CgkJZ2xvYmFsICRwcmV0 ZXh0OwoJCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJCSduYW1lJyA9PiAnJywKCQkJJ3ZhbCcg ID0+ICcnLAoJCSksJGF0dHMpKTsKCQkkbWF0Y2ggPSAoQCRwcmV0ZXh0WyJwZXJtbGlua19y ZWdleF97JG5hbWV9Il0gPT0gJHZhbCk7CgkJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGlu ZywgJG1hdGNoKSk7Cgl9CgoJZnVuY3Rpb24gZ2JwX2lmX3RleHQgKCRhdHRzLCAkdGhpbmcp IHsKCQlnbG9iYWwgJHByZXRleHQ7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ25hbWUn ID0+ICcnLAoJCQkndmFsJyAgPT4gJycsCgkJKSwkYXR0cykpOwoKCQkkbWF0Y2ggPSBmYWxz ZTsKCQlpZiAoIWVtcHR5KCRuYW1lKSkgewoJCQlpZiAoZW1wdHkoJHZhbCkpCgkJCQkkbWF0 Y2ggPSAoaXNzZXQoJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdKSk7CgkJCWVs c2UKCQkJCSRtYXRjaCA9IChAJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdID09 ICR2YWwpOwoJCX0KCQlyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkbWF0Y2gpKTsK CX0KCglmdW5jdGlvbiBnYnBfdXNlX3BhZ2VsaW5rICgkYXR0cywgJHRoaW5nID0gJycpIHsK CQlnbG9iYWwgJGdicF9wbDsKCQlleHRyYWN0KGxBdHRzKGFycmF5KAoJCQkncnVsZScgPT4g JycsCgkJKSwkYXR0cykpOwoJCXJldHVybiAkZ2JwX3BsLT5fdGV4dHBhdHRlcm5fZW5kX2Nh bGxiYWNrKHBhcnNlKCR0aGluZyksICRydWxlKTsKCX0KCglmdW5jdGlvbiBnYnBfZGlzYWJs ZV9wZXJtbGlua3MgKCRhdHRzLCAkdGhpbmcgPSAnJykgewoJCWdsb2JhbCAkZ2JwX3BsOwoJ CXJldHVybiAkZ2JwX3BsLT50b2dnbGVfcGVybWxpbmtfbW9kZSgncGFyc2UnLCAkdGhpbmcp OwoJfQp9IjtzOjg6ImhlbHBfcmF3IjtzOjE1MToiaDEuIGdicF9wZXJtYW5lbnRfbGlua3Mu CgpUaGVyZSBpcyBubyBwbHVnaW4gZG9jdW1lbnRhdGlvbi4gRm9yIGhlbHAgcGxlYXNlIHVz ZSB0aGUgImZvcnVtIHRocmVhZCI6aHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3 dG9waWMucGhwP2lkPTE4OTE4LiI7czozOiJtZDUiO3M6MzI6IjAxMDU0NjFmZjA4OTNmODli YWNiZDRlODllMGZiMjIyIjt9