ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCA1NmFlMDRmLi5lNjg3OWZkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC0yMzMsNiArMjMzLDcgQEAKIFxpbnB1dHtsaWJiYXNlaHR0cH0KIFxpbnB1dHtsaWJzaW1wbGVodHRwfQogXGlucHV0e2xpYmNnaWh0dHB9CitcaW5wdXR7bGliY29va2llbGlifQogXGlucHV0e2xpYmNvb2tpZX0KIFxpbnB1dHtsaWJ4bWxycGNsaWJ9CiBcaW5wdXR7bGlic2ltcGxleG1scnBjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb29raWUudGV4IGIvRG9jL2xpYi9saWJjb29raWUudGV4CmluZGV4IGY4NzJlZDIuLmJiYTljNzkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29va2llLnRleAorKysgYi9Eb2MvbGliL2xpYmNvb2tpZS50ZXgKQEAgLTY4LDYgKzY4LDEwIEBACiAKIAogXGJlZ2lue3NlZWFsc299CisgIFxzZWVtb2R1bGV7Y29va2llbGlifXtIVFRQIGNvb2tpZSBoYW5kbGluZyBmb3IgZm9yIHdlYgorICAgIFxlbXBoe2NsaWVudHN9LiAgVGhlIFxtb2R1bGV7Y29va2llbGlifSBhbmQgXG1vZHVsZXtDb29raWV9CisgICAgbW9kdWxlcyBkbyBub3QgZGVwZW5kIG9uIGVhY2ggb3RoZXIufQorCiAgIFxzZWVyZmN7MjEwOX17SFRUUCBTdGF0ZSBNYW5hZ2VtZW50IE1lY2hhbmlzbX17VGhpcyBpcyB0aGUgc3RhdGUKICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50IHNwZWNpZmljYXRpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyBtb2R1bGUufQogXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4IGIvRG9jL2xpYi9saWJjb29raWVsaWIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDI1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXgKQEAgLTAsMCArMSw2NzkgQEAKK1xzZWN0aW9ue1xtb2R1bGV7Y29va2llbGlifSAtLS0KKyAgICAgICAgIENvb2tpZSBoYW5kbGluZyBmb3IgSFRUUCBjbGllbnRzfQorCitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y29va2llbGlifQorXG1vZHVsZWF1dGhvcntKb2huIEouIExlZX17ampsQHBvYm94LmNvbX0KK1xzZWN0aW9uYXV0aG9ye0pvaG4gSi4gTGVlfXtqamxAcG9ib3guY29tfQorCitcbW9kdWxlc3lub3BzaXN7Q29va2llIGhhbmRsaW5nIGZvciBIVFRQIGNsaWVudHN9CisKK1RoZSBcbW9kdWxle2Nvb2tpZWxpYn0gbW9kdWxlIGRlZmluZXMgY2xhc3NlcyBmb3IgYXV0b21hdGljIGhhbmRsaW5nCitvZiBIVFRQIGNvb2tpZXMuICBJdCBpcyB1c2VmdWwgZm9yIGFjY2Vzc2luZyB3ZWIgc2l0ZXMgdGhhdCByZXF1aXJlCitzbWFsbCBwaWVjZXMgb2YgZGF0YSAtLSBcZGZue2Nvb2tpZXN9IC0tIHRvIGJlIHNldCBvbiB0aGUgY2xpZW50CittYWNoaW5lIGJ5IGFuIEhUVFAgcmVzcG9uc2UgZnJvbSBhIHdlYiBzZXJ2ZXIsIGFuZCB0aGVuIHJldHVybmVkIHRvCit0aGUgc2VydmVyIGluIGxhdGVyIEhUVFAgcmVxdWVzdHMuCisKK0JvdGggdGhlIHJlZ3VsYXIgTmV0c2NhcGUgY29va2llIHByb3RvY29sIGFuZCB0aGUgcHJvdG9jb2wgZGVmaW5lZCBieQorXHJmY3syOTY1fSBhcmUgaGFuZGxlZC4gIFJGQyAyOTY1IGhhbmRsaW5nIGlzIHN3aXRjaGVkIG9mZiBieSBkZWZhdWx0LgorXHJmY3syMTA5fSBjb29raWVzIGFyZSBwYXJzZWQgYXMgTmV0c2NhcGUgY29va2llcyBhbmQgc3Vic2VxdWVudGx5Cit0cmVhdGVkIGFzIFJGQyAyOTY1IGNvb2tpZXMuICBOb3RlIHRoYXQgdGhlIGdyZWF0IG1ham9yaXR5IG9mIGNvb2tpZXMKK29uIHRoZSBJbnRlcm5ldCBhcmUgTmV0c2NhcGUgY29va2llcy4gIFxtb2R1bGV7Y29va2llbGlifSBhdHRlbXB0cyB0bworZm9sbG93IHRoZSBkZS1mYWN0byBOZXRzY2FwZSBjb29raWUgcHJvdG9jb2wgKHdoaWNoIGRpZmZlcnMKK3N1YnN0YW50aWFsbHkgZnJvbSB0aGF0IHNldCBvdXQgaW4gdGhlIG9yaWdpbmFsIE5ldHNjYXBlCitzcGVjaWZpY2F0aW9uKSwgaW5jbHVkaW5nIHRha2luZyBub3RlIG9mIHRoZSBcY29kZXttYXgtYWdlfSBhbmQKK1xjb2Rle3BvcnR9IGNvb2tpZS1hdHRyaWJ1dGVzIGludHJvZHVjZWQgd2l0aCBSRkMgMjEwOS4gIFxub3Rle1RoZQordmFyaW91cyBuYW1lZCBwYXJhbWV0ZXJzIGZvdW5kIGluIFxtYWlsaGVhZGVye1NldC1Db29raWV9IGFuZAorXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGhlYWRlcnMgKGVnLiBcY29kZXtkb21haW59IGFuZAorXGNvZGV7ZXhwaXJlc30pIGFyZSBjb252ZW50aW9uYWxseSByZWZlcnJlZCB0byBhcyBcZGZue2F0dHJpYnV0ZXN9LgorVG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIFB5dGhvbiBhdHRyaWJ1dGVzLCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcworbW9kdWxlIHVzZXMgdGhlIHRlcm0gXGRmbntjb29raWUtYXR0cmlidXRlfSBpbnN0ZWFkfS4KKworCitUaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBleGNlcHRpb246CisKK1xiZWdpbntleGNkZXNjfXtMb2FkRXJyb3J9CitJbnN0YW5jZXMgb2YgXGNsYXNze0ZpbGVDb29raWVKYXJ9IHJhaXNlIHRoaXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUgdG8KK2xvYWQgY29va2llcyBmcm9tIGEgZmlsZS4KK1xlbmR7ZXhjZGVzY30KKworCitUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHByb3ZpZGVkOgorCitcYmVnaW57Y2xhc3NkZXNjfXtDb29raWVKYXJ9e3BvbGljeT1cY29uc3RhbnR7Tm9uZX19CitcdmFye3BvbGljeX0gaXMgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgXGNsYXNze0Nvb2tpZVBvbGljeX0KK2ludGVyZmFjZS4KKworVGhlIFxjbGFzc3tDb29raWVKYXJ9IGNsYXNzIHN0b3JlcyBIVFRQIGNvb2tpZXMuICBJdCBleHRyYWN0cyBjb29raWVzCitmcm9tIEhUVFAgcmVxdWVzdHMsIGFuZCByZXR1cm5zIHRoZW0gaW4gSFRUUCByZXNwb25zZXMuCitcY2xhc3N7Q29va2llSmFyfSBpbnN0YW5jZXMgYXV0b21hdGljYWxseSBleHBpcmUgY29udGFpbmVkIGNvb2tpZXMKK3doZW4gbmVjZXNzYXJ5LiAgU3ViY2xhc3NlcyBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3Igc3RvcmluZyBhbmQKK3JldHJpZXZpbmcgY29va2llcyBmcm9tIGEgZmlsZSBvciBkYXRhYmFzZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtGaWxlQ29va2llSmFyfXtmaWxlbmFtZSwgZGVsYXlsb2FkPVxjb25zdGFudHtOb25lfSwKKyBwb2xpY3k9XGNvbnN0YW50e05vbmV9fQorXHZhcntwb2xpY3l9IGlzIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIFxjbGFzc3tDb29raWVQb2xpY3l9CitpbnRlcmZhY2UuICBGb3IgdGhlIG90aGVyIGFyZ3VtZW50cywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKK2NvcnJlc3BvbmRpbmcgYXR0cmlidXRlcy4KKworQSBcY2xhc3N7Q29va2llSmFyfSB3aGljaCBjYW4gbG9hZCBjb29raWVzIGZyb20sIGFuZCBwZXJoYXBzIHNhdmUKK2Nvb2tpZXMgdG8sIGEgZmlsZSBvbiBkaXNrLiAgQ29va2llcyBhcmUgXHN0cm9uZ3tOT1R9IGxvYWRlZCBmcm9tIHRoZQorbmFtZWQgZmlsZSB1bnRpbCBlaXRoZXIgdGhlIFxtZXRob2R7bG9hZCgpfSBvciBcbWV0aG9ke3JldmVydCgpfQorbWV0aG9kIGlzIGNhbGxlZC4gIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBhcmUgZG9jdW1lbnRlZCBpbiBzZWN0aW9uCitccmVme2ZpbGUtY29va2llLWphci1jbGFzc2VzfS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtDb29raWVQb2xpY3l9e30KK1RoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIHdoZXRoZXIgZWFjaCBjb29raWUgc2hvdWxkIGJlCithY2NlcHRlZCBmcm9tIC8gcmV0dXJuZWQgdG8gdGhlIHNlcnZlci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtEZWZhdWx0Q29va2llUG9saWN5fXsKKyAgICBibG9ja2VkX2RvbWFpbnM9XGNvbnN0YW50e05vbmV9LAorICAgIGFsbG93ZWRfZG9tYWlucz1cY29uc3RhbnR7Tm9uZX0sCisgICAgbmV0c2NhcGU9XGNvbnN0YW50e1RydWV9LCByZmMyOTY1PVxjb25zdGFudHtGYWxzZX0sCisgICAgaGlkZV9jb29raWUyPVxjb25zdGFudHtGYWxzZX0sCisgICAgc3RyaWN0X2RvbWFpbj1cY29uc3RhbnR7RmFsc2V9LAorICAgIHN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZT1cY29uc3RhbnR7VHJ1ZX0sCisgICAgc3RyaWN0X25zX3VudmVyaWZpYWJsZT1cY29uc3RhbnR7RmFsc2V9LAorICAgIHN0cmljdF9uc19kb21haW49XGNvbnN0YW50e0RlZmF1bHRDb29raWVQb2xpY3kuRG9tYWluTGliZXJhbH0sCisgICAgc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhcj1cY29uc3RhbnR7RmFsc2V9LAorICAgIHN0cmljdF9uc19zZXRfcGF0aD1cY29uc3RhbnR7RmFsc2V9CisgIH0KKworQ29uc3RydWN0b3IgYXJndW1lbnRzIHNob3VsZCBiZSBwYXNzZWQgYXMga2V5d29yZCBhcmd1bWVudHMgb25seS4KK1x2YXJ7YmxvY2tlZF9kb21haW5zfSBpcyBhIHNlcXVlbmNlIG9mIGRvbWFpbiBuYW1lcyB0aGF0IHdlIG5ldmVyCithY2NlcHQgY29va2llcyBmcm9tLCBub3IgcmV0dXJuIGNvb2tpZXMgdG8uIFx2YXJ7YWxsb3dlZF9kb21haW5zfSBpZgorbm90IFxjb25zdGFudHtOb25lfSwgdGhpcyBpcyBhIHNlcXVlbmNlIG9mIHRoZSBvbmx5IGRvbWFpbnMgZm9yIHdoaWNoCit3ZSBhY2NlcHQgYW5kIHJldHVybiBjb29raWVzLiAgRm9yIGFsbCBvdGhlciBhcmd1bWVudHMsIHNlZSB0aGUKK2RvY3VtZW50YXRpb24gZm9yIFxjbGFzc3tDb29raWVQb2xpY3l9IGFuZCBcY2xhc3N7RGVmYXVsdENvb2tpZVBvbGljeX0KK29iamVjdHMuCisKK1xjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBhY2NlcHQgLyByZWplY3QKK3J1bGVzIGZvciBOZXRzY2FwZSBhbmQgUkZDIDI5NjUgY29va2llcy4gIFJGQyAyMTA5IGNvb2tpZXMKKyhpZS4gY29va2llcyByZWNlaXZlZCBpbiBhIFxtYWlsaGVhZGVye1NldC1Db29raWV9IGhlYWRlciB3aXRoIGEKK3ZlcnNpb24gY29va2llLWF0dHJpYnV0ZSBvZiAxKSBhcmUgdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFJGQyAyOTY1CitydWxlcy4gIFxjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBhbHNvIHByb3ZpZGVzIHNvbWUgcGFyYW1ldGVycyB0bworYWxsb3cgc29tZSBmaW5lLXR1bmluZyBvZiBwb2xpY3kuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317Q29va2llfXt9CitUaGlzIGNsYXNzIHJlcHJlc2VudHMgTmV0c2NhcGUsIFJGQyAyMTA5IGFuZCBSRkMgMjk2NSBjb29raWVzLiAgSXQgaXMKK25vdCBleHBlY3RlZCB0aGF0IHVzZXJzIG9mIFxtb2R1bGV7Y29va2llbGlifSBjb25zdHJ1Y3QgdGhlaXIgb3duCitcY2xhc3N7Q29va2llfSBpbnN0YW5jZXMuICBJbnN0ZWFkLCBpZiBuZWNlc3NhcnksIGNhbGwKK1xtZXRob2R7bWFrZV9jb29raWVzKCl9IG9uIGEgXGNsYXNze0Nvb2tpZUphcn0gaW5zdGFuY2UuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVtb2R1bGV7dXJsbGliMn17VVJMIG9wZW5pbmcgd2l0aCBhdXRvbWF0aWMgY29va2llIGhhbmRsaW5nLn0KKworXHNlZW1vZHVsZXtDb29raWV9e0hUVFAgY29va2llIGNsYXNzZXMsIHByaW5jaXBhbGx5IHVzZWZ1bCBmb3IKK3NlcnZlci1zaWRlIGNvZGUuICBUaGUgXG1vZHVsZXtjb29raWVsaWJ9IGFuZCBcbW9kdWxle0Nvb2tpZX0gbW9kdWxlcworZG8gbm90IGRlcGVuZCBvbiBlYWNoIG90aGVyLn0KKworXHNlZXVybHtodHRwOi8vd3d3c2VhcmNoLnNmLm5ldC9DbGllbnRDb29raWUvfXtFeHRlbnNpb25zIHRvIHRoaXMKK21vZHVsZSwgaW5jbHVkaW5nIGEgY2xhc3MgZm9yIHJlYWRpbmcgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyCitjb29raWVzIG9uIFdpbmRvd3MufQorCitcc2VldXJse2h0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWx9e1RoZQorc3BlY2lmaWNhdGlvbiBvZiB0aGUgb3JpZ2luYWwgTmV0c2NhcGUgY29va2llIHByb3RvY29sLiAgVGhvdWdoIHRoaXMKK2lzIHN0aWxsIHRoZSBkb21pbmFudCBwcm90b2NvbCwgdGhlICdOZXRzY2FwZSBjb29raWUgcHJvdG9jb2wnCitpbXBsZW1lbnRlZCBieSBhbGwgdGhlIG1ham9yIGJyb3dzZXJzIChhbmQgXG1vZHVsZXtjb29raWVsaWJ9KSBvbmx5CitiZWFycyBhIHBhc3NpbmcgcmVzZW1ibGFuY2UgdG8gdGhlIG9uZSBza2V0Y2hlZCBvdXQgaW4KK1xjb2Rle2Nvb2tpZV9zcGVjLmh0bWx9Ln0KKworXHNlZXJmY3syMTA5fXtIVFRQIFN0YXRlIE1hbmFnZW1lbnQgTWVjaGFuaXNtfXtPYnNvbGV0ZWQgYnkgUkZDIDI5NjUuCitVc2VzIFxtYWlsaGVhZGVye1NldC1Db29raWV9IHdpdGggdmVyc2lvbj0xLn0KKworXHNlZXJmY3syOTY1fXtIVFRQIFN0YXRlIE1hbmFnZW1lbnQgTWVjaGFuaXNtfXtUaGUgTmV0c2NhcGUgcHJvdG9jb2wKK3dpdGggdGhlIGJ1Z3MgZml4ZWQuICBVc2VzIFxtYWlsaGVhZGVye1NldC1Db29raWUyfSBpbiBwbGFjZSBvZgorXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0uICBOb3Qgd2lkZWx5IHVzZWQufQorCitcc2VldXJse2h0dHA6Ly9rcmlzdG9sLm9yZy9jb29raWUvZXJyYXRhLmh0bWx9e1VuZmluaXNoZWQgZXJyYXRhIHRvCitSRkMgMjk2NS59CisKK1xzZWVyZmN7Mjk2NH17VXNlIG9mIEhUVFAgU3RhdGUgTWFuYWdlbWVudH17fQorCitcZW5ke3NlZWFsc299CisKKworXHN1YnNlY3Rpb257Q29va2llSmFyIGFuZCBGaWxlQ29va2llSmFyIE9iamVjdHMgXGxhYmVse2Nvb2tpZS1qYXItb2JqZWN0c319CisKK1xjbGFzc3tDb29raWVKYXJ9IG9iamVjdHMgc3VwcG9ydCB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuCisKK1xjbGFzc3tDb29raWVKYXJ9IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde2FkZF9jb29raWVfaGVhZGVyfXtyZXF1ZXN0fQorQWRkIGNvcnJlY3QgXG1haWxoZWFkZXJ7Q29va2llfSBoZWFkZXIgdG8gXHZhcntyZXF1ZXN0fS4KKworSWYgdGhlIENvb2tpZVBvbGljeSBhbGxvd3MgKGllLiB0aGUgXGNsYXNze0Nvb2tpZVBvbGljeX0gaW5zdGFuY2UncworXG1lbWJlcntyZmMyOTY1fSBhbmQgXG1lbWJlcntoaWRlX2Nvb2tpZTJ9IGF0dHJpYnV0ZXMgYXJlIHRydWUgYW5kCitmYWxzZSByZXNwZWN0aXZlbHkpLCB0aGUgXG1haWxoZWFkZXJ7Q29va2llMn0gaGVhZGVyIGlzIGFsc28gYWRkZWQKK3doZW4gYXBwcm9wcmlhdGUuCisKK1RoZSBcdmFye3JlcXVlc3R9IG9iamVjdCAodXN1YWxseSBhIFxjbGFzc3t1cmxsaWIyLlJlcXVlc3R9IGluc3RhbmNlKQorbXVzdCBzdXBwb3J0IHRoZSBtZXRob2RzIFxtZXRob2R7Z2V0X2Z1bGxfdXJsKCl9LCBcbWV0aG9ke2dldF9ob3N0KCl9LAorXG1ldGhvZHtnZXRfdHlwZSgpfSwgXG1ldGhvZHt1bnZlcmlmaWFibGUoKX0sCitcbWV0aG9ke2dldF9vcmlnaW5fcmVxX2hvc3QoKX0sIFxtZXRob2R7aGFzX2hlYWRlcigpfSwKK1xtZXRob2R7Z2V0X2hlYWRlcigpfSwgXG1ldGhvZHtoZWFkZXJfaXRlbXMoKX0sIGFuZAorXG1ldGhvZHthZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigpfSxhcyBkb2N1bWVudGVkIGJ5IFxtb2R1bGV7dXJsbGliMn0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde2V4dHJhY3RfY29va2llc317cmVzcG9uc2UsIHJlcXVlc3R9CitFeHRyYWN0IGNvb2tpZXMgZnJvbSBIVFRQIFx2YXJ7cmVzcG9uc2V9IGFuZCBzdG9yZSB0aGVtIGluIHRoZQorXGNsYXNze0Nvb2tpZUphcn0sIHdoZXJlIGFsbG93ZWQgYnkgcG9saWN5LgorCitUaGUgXGNsYXNze0Nvb2tpZUphcn0gd2lsbCBsb29rIGZvciBhbGxvd2FibGUgXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0KK2FuZCBcbWFpbGhlYWRlcntTZXQtQ29va2llMn0gaGVhZGVycyBpbiB0aGUgXHZhcntyZXNwb25zZX0gYXJndW1lbnQsCithbmQgc3RvcmUgY29va2llcyBhcyBhcHByb3ByaWF0ZSAoc3ViamVjdCB0byB0aGUKK1xtZXRob2R7Q29va2llUG9saWN5LnNldF9vaygpfSBtZXRob2QncyBhcHByb3ZhbCkuCisKK1RoZSBcdmFye3Jlc3BvbnNlfSBvYmplY3QgKHVzdWFsbHkgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8KK1xtZXRob2R7dXJsbGliMi51cmxvcGVuKCl9LCBvciBzaW1pbGFyKSBzaG91bGQgc3VwcG9ydCBhbgorXG1ldGhvZHtpbmZvKCl9IG1ldGhvZCwgd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhCitcbWV0aG9ke2dldGFsbG1hdGNoaW5naGVhZGVycygpfSBtZXRob2QgKHVzdWFsbHkgYQorXGNsYXNze21pbWV0b29scy5NZXNzYWdlfSBpbnN0YW5jZSkuCisKK1RoZSBcdmFye3JlcXVlc3R9IG9iamVjdCAodXN1YWxseSBhIFxjbGFzc3t1cmxsaWIyLlJlcXVlc3R9IGluc3RhbmNlKQorbXVzdCBzdXBwb3J0IHRoZSBtZXRob2RzIFxtZXRob2R7Z2V0X2Z1bGxfdXJsKCl9LCBcbWV0aG9ke2dldF9ob3N0KCl9LAorXG1ldGhvZHt1bnZlcmlmaWFibGUoKX0sIGFuZCBcbWV0aG9ke2dldF9vcmlnaW5fcmVxX2hvc3QoKX0sIGFzCitkb2N1bWVudGVkIGJ5IFxtb2R1bGV7dXJsbGliMn0uICBUaGUgcmVxdWVzdCBpcyB1c2VkIHRvIHNldCBkZWZhdWx0Cit2YWx1ZXMgZm9yIGNvb2tpZS1hdHRyaWJ1dGVzIGFzIHdlbGwgYXMgZm9yIGNoZWNraW5nIHRoYXQgdGhlIGNvb2tpZQoraXMgYWxsb3dlZCB0byBiZSBzZXQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVKYXJde3NldF9wb2xpY3l9e3BvbGljeX0KK1NldCB0aGUgXGNsYXNze0Nvb2tpZVBvbGljeX0gaW5zdGFuY2UgdG8gYmUgdXNlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZUphcl17bWFrZV9jb29raWVzfXtyZXNwb25zZSwgcmVxdWVzdH0KK1JldHVybiBzZXF1ZW5jZSBvZiBcY2xhc3N7Q29va2llfSBvYmplY3RzIGV4dHJhY3RlZCBmcm9tCitcdmFye3Jlc3BvbnNlfSBvYmplY3QuCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgXG1ldGhvZHtleHRyYWN0X2Nvb2tpZXN9IGZvciB0aGUgaW50ZXJmYWNlcworcmVxdWlyZWQgb2YgdGhlIFx2YXJ7cmVzcG9uc2V9IGFuZCBcdmFye3JlcXVlc3R9IGFyZ3VtZW50cy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZUphcl17c2V0X2Nvb2tpZV9pZl9va317Y29va2llLCByZXF1ZXN0fQorU2V0IGEgXGNsYXNze0Nvb2tpZX0gaWYgcG9saWN5IHNheXMgaXQncyBPSyB0byBkbyBzby4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZUphcl17c2V0X2Nvb2tpZX17Y29va2llfQorU2V0IGEgXGNsYXNze0Nvb2tpZX0sIHdpdGhvdXQgY2hlY2tpbmcgd2l0aCBwb2xpY3kgdG8gc2VlIHdoZXRoZXIgb3IKK25vdCBpdCBzaG91bGQgYmUgc2V0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29va2llSmFyXXtjbGVhcn17XG9wdGlvbmFse2RvbWFpblxvcHRpb25hbHssCisgICAgICBwYXRoXG9wdGlvbmFseywgbmFtZX19fX0KK0NsZWFyIHNvbWUgY29va2llcy4KKworSWYgaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgY2xlYXIgYWxsIGNvb2tpZXMuICBJZiBnaXZlbiBhIHNpbmdsZQorYXJndW1lbnQsIG9ubHkgY29va2llcyBiZWxvbmdpbmcgdG8gdGhhdCBcdmFye2RvbWFpbn0gd2lsbCBiZSByZW1vdmVkLgorSWYgZ2l2ZW4gdHdvIGFyZ3VtZW50cywgY29va2llcyBiZWxvbmdpbmcgdG8gdGhlIHNwZWNpZmllZAorXHZhcntkb21haW59IGFuZCBVUkwgXHZhcntwYXRofSBhcmUgcmVtb3ZlZC4gIElmIGdpdmVuIHRocmVlCithcmd1bWVudHMsIHRoZW4gdGhlIGNvb2tpZSB3aXRoIHRoZSBzcGVjaWZpZWQgXHZhcntkb21haW59LCBcdmFye3BhdGh9CithbmQgXHZhcntuYW1lfSBpcyByZW1vdmVkLgorCitSYWlzZXMgXGV4Y2VwdGlvbntLZXlFcnJvcn0gaWYgbm8gbWF0Y2hpbmcgY29va2llIGV4aXN0cy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZUphcl17Y2xlYXJfc2Vzc2lvbl9jb29raWVzfXt9CitEaXNjYXJkIGFsbCBzZXNzaW9uIGNvb2tpZXMuCisKK0Rpc2NhcmRzIGFsbCBjb250YWluZWQgY29va2llcyB0aGF0IGhhdmUgYSB0cnVlIFxtZW1iZXJ7ZGlzY2FyZH0KK2F0dHJpYnV0ZSAodXN1YWxseSBiZWNhdXNlIHRoZXkgaGFkIGVpdGhlciBubyBcY29kZXttYXgtYWdlfSBvcgorXGNvZGV7ZXhwaXJlc30gY29va2llLWF0dHJpYnV0ZSwgb3IgYW4gZXhwbGljaXQgXGNvZGV7ZGlzY2FyZH0KK2Nvb2tpZS1hdHRyaWJ1dGUpLiAgRm9yIGludGVyYWN0aXZlIGJyb3dzZXJzLCB0aGUgZW5kIG9mIGEgc2Vzc2lvbgordXN1YWxseSBjb3JyZXNwb25kcyB0byBjbG9zaW5nIHRoZSBicm93c2VyIHdpbmRvdy4KKworTm90ZSB0aGF0IHRoZSBcbWV0aG9ke3NhdmUoKX0gbWV0aG9kIHdvbid0IHNhdmUgc2Vzc2lvbiBjb29raWVzCithbnl3YXksIHVubGVzcyB5b3UgYXNrIG90aGVyd2lzZSBieSBwYXNzaW5nIGEgdHJ1ZQorXHZhcntpZ25vcmVfZGlzY2FyZH0gYXJndW1lbnQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xjbGFzc3tGaWxlQ29va2llSmFyfSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY31bRmlsZUNvb2tpZUphcl17c2F2ZX17ZmlsZW5hbWU9XGNvbnN0YW50e05vbmV9LAorICAgIGlnbm9yZV9kaXNjYXJkPVxjb25zdGFudHtGYWxzZX0sIGlnbm9yZV9leHBpcmVzPVxjb25zdGFudHtGYWxzZX19CitTYXZlIGNvb2tpZXMgdG8gYSBmaWxlLgorCitUaGlzIGJhc2UgY2xhc3MgcmFpc2VzIFxjbGFzc3tOb3RJbXBsZW1lbnRlZEVycm9yfS4gIFN1YmNsYXNzZXMgbWF5CitsZWF2ZSB0aGlzIG1ldGhvZCB1bmltcGxlbWVudGVkLgorCitcdmFye2ZpbGVuYW1lfSBpcyB0aGUgbmFtZSBvZiBmaWxlIGluIHdoaWNoIHRvIHNhdmUgY29va2llcy4gIElmCitcdmFye2ZpbGVuYW1lfSBpcyBub3Qgc3BlY2lmaWVkLCBcbWVtYmVye3NlbGYuZmlsZW5hbWV9IGlzIHVzZWQgKHdob3NlCitkZWZhdWx0IGlzIHRoZSB2YWx1ZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpZiBhbnkpOyBpZgorXG1lbWJlcntzZWxmLmZpbGVuYW1lfSBpcyBcY29uc3RhbnR7Tm9uZX0sIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaXMKK3JhaXNlZC4KKworXHZhcntpZ25vcmVfZGlzY2FyZH06IHNhdmUgZXZlbiBjb29raWVzIHNldCB0byBiZSBkaXNjYXJkZWQuCitcdmFye2lnbm9yZV9leHBpcmVzfTogc2F2ZSBldmVuIGNvb2tpZXMgdGhhdCBoYXZlIGV4cGlyZWQKKworVGhlIGZpbGUgaXMgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMsIHRodXMgd2lwaW5nIGFsbCB0aGUKK2Nvb2tpZXMgaXQgY29udGFpbnMuICBTYXZlZCBjb29raWVzIGNhbiBiZSByZXN0b3JlZCBsYXRlciB1c2luZyB0aGUKK1xtZXRob2R7bG9hZCgpfSBvciBcbWV0aG9ke3JldmVydCgpfSBtZXRob2RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRmlsZUNvb2tpZUphcl17bG9hZH17ZmlsZW5hbWU9XGNvbnN0YW50e05vbmV9LAorICAgIGlnbm9yZV9kaXNjYXJkPVxjb25zdGFudHtGYWxzZX0sIGlnbm9yZV9leHBpcmVzPVxjb25zdGFudHtGYWxzZX19CitMb2FkIGNvb2tpZXMgZnJvbSBhIGZpbGUuCisKK09sZCBjb29raWVzIGFyZSBrZXB0IHVubGVzcyBvdmVyd3JpdHRlbiBieSBuZXdseSBsb2FkZWQgb25lcy4KKworQXJndW1lbnRzIGFyZSBhcyBmb3IgXG1ldGhvZHtzYXZlKCl9LgorCitUaGUgbmFtZWQgZmlsZSBtdXN0IGJlIGluIHRoZSBmb3JtYXQgdW5kZXJzdG9vZCBieSB0aGUgY2xhc3MsIG9yCitcZXhjZXB0aW9ue0xvYWRFcnJvcn0gd2lsbCBiZSByYWlzZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtGaWxlQ29va2llSmFyXXtyZXZlcnR9e2ZpbGVuYW1lPVxjb25zdGFudHtOb25lfSwKKyAgICBpZ25vcmVfZGlzY2FyZD1cY29uc3RhbnR7RmFsc2V9LCBpZ25vcmVfZXhwaXJlcz1cY29uc3RhbnR7RmFsc2V9fQorQ2xlYXIgYWxsIGNvb2tpZXMgYW5kIHJlbG9hZCBjb29raWVzIGZyb20gYSBzYXZlZCBmaWxlLgorCitSYWlzZXMgXGV4Y2VwdGlvbntjb29raWVsaWIuTG9hZEVycm9yfSBvciBcZXhjZXB0aW9ue0lPRXJyb3J9IGlmCityZXZlcnNpb24gaXMgbm90IHN1Y2Nlc3NmdWw7IHRoZSBvYmplY3QncyBzdGF0ZSB3aWxsIG5vdCBiZSBhbHRlcmVkIGlmCit0aGlzIGhhcHBlbnMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xjbGFzc3tGaWxlQ29va2llSmFyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHB1YmxpYyBhdHRyaWJ1dGVzOgorCitcYmVnaW57bWVtYmVyZGVzY317ZmlsZW5hbWV9CitGaWxlbmFtZSBvZiBkZWZhdWx0IGZpbGUgaW4gd2hpY2ggdG8ga2VlcCBjb29raWVzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZGVsYXlsb2FkfQorSWYgdHJ1ZSwgbG9hZCBjb29raWVzIGxhemlseSBmcm9tIGRpc2suICBUaGlzIGlzIG9ubHkgYSBoaW50LCBzaW5jZQordGhpcyBvbmx5IGFmZmVjdHMgcGVyZm9ybWFuY2UsIG5vdCBiZWhhdmlvdXIgKHVubGVzcyB0aGUgY29va2llcyBvbgorZGlzayBhcmUgY2hhbmdpbmcpLiAgQSBcY2xhc3N7Q29va2llSmFyfSBvYmplY3QgbWF5IGlnbm9yZSBpdC4gIE5vbmUKK29mIHRoZSBcY2xhc3N7RmlsZUNvb2tpZUphcn0gY2xhc3NlcyBpbmNsdWRlZCBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeQorbGF6aWx5IGxvYWRzIGNvb2tpZXMuCitcZW5ke21lbWJlcmRlc2N9CisKKworXHN1YnNlY3Rpb257RmlsZUNvb2tpZUphciBzdWJjbGFzc2VzIGFuZCBjby1vcGVyYXRpb24gd2l0aCB3ZWIgYnJvd3NlcnMKKyAgXGxhYmVse2ZpbGUtY29va2llLWphci1jbGFzc2VzfX0KKworVGhlIGZvbGxvd2luZyBcY2xhc3N7Q29va2llSmFyfSBzdWJjbGFzc2VzIGFyZSBwcm92aWRlZCBmb3IgcmVhZGluZworYW5kIHdyaXRpbmcgLiAgRnVydGhlciBcY2xhc3N7Q29va2llSmFyfSBzdWJjbGFzc2VzLCBpbmNsdWRpbmcgb25lCit0aGF0IHJlYWRzIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciBjb29raWVzLCBhcmUgYXZhaWxhYmxlIGF0CitcdXJse2h0dHA6Ly93d3dzZWFyY2guc2YubmV0L0NsaWVudENvb2tpZS99LgorCitcYmVnaW57Y2xhc3NkZXNjfXtNb3ppbGxhQ29va2llSmFyfXtmaWxlbmFtZSwgZGVsYXlsb2FkPVxjb25zdGFudHtOb25lfSwKKyBwb2xpY3k9XGNvbnN0YW50e05vbmV9fQorQSBcY2xhc3N7RmlsZUNvb2tpZUphcn0gdGhhdCBjYW4gbG9hZCBmcm9tIGFuZCBzYXZlIGNvb2tpZXMgdG8gZGlzayBpbgordGhlIE1vemlsbGEgXGNvZGV7Y29va2llcy50eHR9IGZpbGUgZm9ybWF0ICh3aGljaCBpcyBhbHNvIHVzZWQgYnkgdGhlCitseW54IGFuZCBOZXRzY2FwZSBicm93c2VycykuICBcbm90ZXtUaGlzIGxvc2VzIGluZm9ybWF0aW9uIGFib3V0IFJGQworMjk2NSBjb29raWVzLCBhbmQgYWxzbyBhYm91dCBuZXdlciBvciBub24tc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMKK3N1Y2ggYXMgXGNvZGV7cG9ydH0ufQorCitcd2FybmluZ3tCYWNrIHVwIHlvdXIgY29va2llcyBiZWZvcmUgc2F2aW5nIGlmIHlvdSBoYXZlIGNvb2tpZXMgd2hvc2UKK2xvc3MgLyBjb3JydXB0aW9uIHdvdWxkIGJlIGluY29udmVuaWVudCAodGhlcmUgYXJlIHNvbWUgc3VidGxldGllcword2hpY2ggbWF5IGxlYWQgdG8gc2xpZ2h0IGNoYW5nZXMgaW4gdGhlIGZpbGUgb3ZlciBhIGxvYWQgLyBzYXZlCityb3VuZC10cmlwKS59CisKK0Fsc28gbm90ZSB0aGF0IGNvb2tpZXMgc2F2ZWQgd2hpbGUgTW96aWxsYSBpcyBydW5uaW5nIHdpbGwgZ2V0CitjbG9iYmVyZWQgYnkgTW96aWxsYS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtMV1BDb29raWVKYXJ9e2ZpbGVuYW1lLCBkZWxheWxvYWQ9XGNvbnN0YW50e05vbmV9LAorIHBvbGljeT1cY29uc3RhbnR7Tm9uZX19CitBIFxjbGFzc3tGaWxlQ29va2llSmFyfSB0aGF0IGNhbiBsb2FkIGZyb20gYW5kIHNhdmUgY29va2llcyB0byBkaXNrIGluCitmb3JtYXQgY29tcGF0aWJsZSB3aXRoIHRoZSBsaWJ3d3ctcGVybCBsaWJyYXJ5J3MgXGNvZGV7U2V0LUNvb2tpZTN9CitmaWxlIGZvcm1hdC4gIFRoaXMgaXMgY29udmVuaWVudCBpZiB5b3Ugd2FudCB0byBzdG9yZSBjb29raWVzIGluIGEKK2h1bWFuLXJlYWRhYmxlIGZpbGUuCitcZW5ke2NsYXNzZGVzY30KKworCitcc3Vic2VjdGlvbntDb29raWVQb2xpY3kgT2JqZWN0cyBcbGFiZWx7Y29va2llLXBvbGljeS1vYmplY3RzfX0KKworT2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIFxjbGFzc3tDb29raWVQb2xpY3l9IGludGVyZmFjZSBoYXZlIHRoZQorZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVQb2xpY3lde3NldF9va317Y29va2llLCByZXF1ZXN0fQorUmV0dXJuIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGNvb2tpZSBzaG91bGQgYmUgYWNjZXB0ZWQgZnJvbSBzZXJ2ZXIuCisKK1x2YXJ7Y29va2llfSBpcyBhIFxjbGFzc3tjb29raWVsaWIuQ29va2llfSBpbnN0YW5jZS4gIFx2YXJ7cmVxdWVzdH0gaXMKK2FuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBkZWZpbmVkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIGZvcgorXG1ldGhvZHtDb29raWVKYXIuZXh0cmFjdF9jb29raWVzKCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29va2llUG9saWN5XXtyZXR1cm5fb2t9e2Nvb2tpZSwgcmVxdWVzdH0KK1JldHVybiBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBjb29raWUgc2hvdWxkIGJlIHJldHVybmVkIHRvIHNlcnZlci4KKworXHZhcntjb29raWV9IGlzIGEgXGNsYXNze2Nvb2tpZWxpYi5Db29raWV9IGluc3RhbmNlLiAgXHZhcntyZXF1ZXN0fSBpcworYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gZm9yCitcbWV0aG9ke0Nvb2tpZUphci5hZGRfY29va2llX2hlYWRlcigpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZVBvbGljeV17ZG9tYWluX3JldHVybl9va317ZG9tYWluLCByZXF1ZXN0fQorUmV0dXJuIGZhbHNlIGlmIGNvb2tpZXMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCwgZ2l2ZW4gY29va2llIGRvbWFpbi4KKworVGhpcyBtZXRob2QgaXMgYW4gb3B0aW1pemF0aW9uLiAgSXQgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgY2hlY2tpbmcKK2V2ZXJ5IGNvb2tpZSB3aXRoIGEgcGFydGljdWxhciBkb21haW4gKHdoaWNoIG1pZ2h0IGludm9sdmUgcmVhZGluZworbWFueSBmaWxlcykuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YKK1xtZXRob2R7ZG9tYWluX3JldHVybl9vaygpfSBhbmQgXG1ldGhvZHtwYXRoX3JldHVybl9vaygpfQorKFxzYW1we3JldHVybiBUcnVlfSkgbGVhdmUgYWxsIHRoZSB3b3JrIHRvIFxtZXRob2R7cmV0dXJuX29rKCl9LgorCitJZiBcbWV0aG9ke2RvbWFpbl9yZXR1cm5fb2soKX0gcmV0dXJucyB0cnVlIGZvciB0aGUgY29va2llIGRvbWFpbiwKK1xtZXRob2R7cGF0aF9yZXR1cm5fb2soKX0gaXMgY2FsbGVkIGZvciB0aGUgY29va2llIHBhdGguICBPdGhlcndpc2UsCitcbWV0aG9ke3BhdGhfcmV0dXJuX29rKCl9IGFuZCBcbWV0aG9ke3JldHVybl9vaygpfSBhcmUgbmV2ZXIgY2FsbGVkCitmb3IgdGhhdCBjb29raWUgZG9tYWluLiAgSWYgXG1ldGhvZHtwYXRoX3JldHVybl9vaygpfSByZXR1cm5zIHRydWUsCitcbWV0aG9ke3JldHVybl9vaygpfSBpcyBjYWxsZWQgd2l0aCB0aGUgXGNsYXNze0Nvb2tpZX0gb2JqZWN0IGl0c2VsZgorZm9yIGEgZnVsbCBjaGVjay4gIE90aGVyd2lzZSwgXG1ldGhvZHtyZXR1cm5fb2soKX0gaXMgbmV2ZXIgY2FsbGVkIGZvcgordGhhdCBjb29raWUgcGF0aC4KKworTm90ZSB0aGF0IFxtZXRob2R7ZG9tYWluX3JldHVybl9vaygpfSBpcyBjYWxsZWQgZm9yIGV2ZXJ5CitcZW1waHtjb29raWV9IGRvbWFpbiwgbm90IGp1c3QgZm9yIHRoZSBcZW1waHtyZXF1ZXN0fSBkb21haW4uICBGb3IKK2V4YW1wbGUsIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgd2l0aCBib3RoIFxjb2RleyIuZXhhbXBsZS5jb20ifQorYW5kIFxjb2RleyJ3d3cuZXhhbXBsZS5jb20ifSBpZiB0aGUgcmVxdWVzdCBkb21haW4gaXMKK1xjb2RleyJ3d3cuZXhhbXBsZS5jb20ifS4gIFRoZSBzYW1lIGdvZXMgZm9yCitcbWV0aG9ke3BhdGhfcmV0dXJuX29rKCl9LgorCitUaGUgXHZhcntyZXF1ZXN0fSBhcmd1bWVudCBpcyBhcyBkb2N1bWVudGVkIGZvciBcbWV0aG9ke3JldHVybl9vaygpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZVBvbGljeV17cGF0aF9yZXR1cm5fb2t9e3BhdGgsIHJlcXVlc3R9CitSZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgcGF0aC4KKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBcbWV0aG9ke2RvbWFpbl9yZXR1cm5fb2soKX0uCitcZW5ke21ldGhvZGRlc2N9CisKKworSW4gYWRkaXRpb24gdG8gaW1wbGVtZW50aW5nIHRoZSBtZXRob2RzIGFib3ZlLCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCitcY2xhc3N7Q29va2llUG9saWN5fSBpbnRlcmZhY2UgbXVzdCBhbHNvIHN1cHBseSB0aGUgZm9sbG93aW5nCithdHRyaWJ1dGVzLCBpbmRpY2F0aW5nIHdoaWNoIHByb3RvY29scyBzaG91bGQgYmUgdXNlZCwgYW5kIGhvdy4gIEFsbAorb2YgdGhlc2UgYXR0cmlidXRlcyBtYXkgYmUgYXNzaWduZWQgdG8uCisKK1xiZWdpbnttZW1iZXJkZXNjfXtuZXRzY2FwZX0KK0ltcGxlbWVudCBuZXRzY2FwZSBwcm90b2NvbC4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfXtyZmMyOTY1fQorSW1wbGVtZW50IFJGQyAyOTY1IHByb3RvY29sLgorXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9e2hpZGVfY29va2llMn0KK0Rvbid0IGFkZCBDb29raWUyIGhlYWRlciB0byByZXF1ZXN0cyAodGhlIHByZXNlbmNlIG9mIHRoaXMgaGVhZGVyCitpbmRpY2F0ZXMgdG8gdGhlIHNlcnZlciB0aGF0IHdlIHVuZGVyc3RhbmQgUkZDIDI5NjUgY29va2llcykuCitcZW5ke21lbWJlcmRlc2N9CisKK1RoZSBtb3N0IHVzZWZ1bCB3YXkgdG8gZGVmaW5lIGEgXGNsYXNze0Nvb2tpZVBvbGljeX0gY2xhc3MgaXMgYnkKK3N1YmNsYXNzaW5nIGZyb20gXGNsYXNze0RlZmF1bHRDb29raWVQb2xpY3l9IGFuZCBvdmVycmlkaW5nIHNvbWUgb3IKK2FsbCBvZiB0aGUgbWV0aG9kcyBhYm92ZS4gIFxjbGFzc3tDb29raWVQb2xpY3l9IGl0c2VsZiBtYXkgYmUgdXNlZCBhcworYSAnbnVsbCBwb2xpY3knIHRvIGFsbG93IHNldHRpbmcgYW5kIHJlY2VpdmluZyBhbnkgYW5kIGFsbCBjb29raWVzLgorCisKK1xzdWJzZWN0aW9ue0RlZmF1bHRDb29raWVQb2xpY3kgT2JqZWN0cyBcbGFiZWx7ZGVmYXVsdC1jb29raWUtcG9saWN5LW9iamVjdHN9fQorCitJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYWNjZXB0aW5nIGFuZCByZXR1cm5pbmcgY29va2llcy4KKworQm90aCBSRkMgMjk2NSBhbmQgTmV0c2NhcGUgY29va2llcyBhcmUgY292ZXJlZC4gIFJGQyAyOTY1IGhhbmRsaW5nIGlzCitzd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdC4KKworVGhlIGVhc2llc3Qgd2F5IHRvIHByb3ZpZGUgeW91ciBvd24gcG9saWN5IGlzIHRvIG92ZXJyaWRlIHRoaXMgY2xhc3MKK2FuZCBjYWxsIGl0cyBtZXRob2RzIGluIHlvdXIgb3ZlcnJpZGVuIGltcGxlbWVudGF0aW9ucyBiZWZvcmUgYWRkaW5nCit5b3VyIG93biBhZGRpdGlvbmFsIGNoZWNrczoKKworXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IGNvb2tpZWxpYgorY2xhc3MgTXlDb29raWVQb2xpY3koY29va2llbGliLkRlZmF1bHRDb29raWVQb2xpY3kpOgorICAgIGRlZiBzZXRfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgbm90IGNvb2tpZWxpYi5EZWZhdWx0Q29va2llUG9saWN5LnNldF9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGlfZG9udF93YW50X3RvX3N0b3JlX3RoaXNfY29va2llKGNvb2tpZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKK1xlbmR7dmVyYmF0aW19CisKK0luIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhlCitcY2xhc3N7Q29va2llUG9saWN5fSBpbnRlcmZhY2UsIHRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byBibG9jayBhbmQKK2FsbG93IGRvbWFpbnMgZnJvbSBzZXR0aW5nIGFuZCByZWNlaXZpbmcgY29va2llcy4gIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3N0cmljdG5lc3Mgc3dpdGNoZXMgdGhhdCBhbGxvdyB5b3UgdG8gdGlnaHRlbiB1cCB0aGUgcmF0aGVyIGxvb3NlCitOZXRzY2FwZSBwcm90b2NvbCBydWxlcyBhIGxpdHRsZSBiaXQgKGF0IHRoZSBjb3N0IG9mIGJsb2NraW5nIHNvbWUKK2JlbmlnbiBjb29raWVzKS4KKworQSBkb21haW4gYmxhY2tsaXN0IGFuZCB3aGl0ZWxpc3QgaXMgcHJvdmlkZWQgKGJvdGggb2ZmIGJ5IGRlZmF1bHQpLgorT25seSBkb21haW5zIG5vdCBpbiB0aGUgYmxhY2tsaXN0IGFuZCBwcmVzZW50IGluIHRoZSB3aGl0ZWxpc3QgKGlmIHRoZQord2hpdGVsaXN0IGlzIGFjdGl2ZSkgcGFydGljaXBhdGUgaW4gY29va2llIHNldHRpbmcgYW5kIHJldHVybmluZy4gIFVzZQordGhlIFx2YXJ7YmxvY2tlZF9kb21haW5zfSBjb25zdHJ1Y3RvciBhcmd1bWVudCwgYW5kCitcbWV0aG9ke2Jsb2NrZWRfZG9tYWlucygpfSBhbmQgXG1ldGhvZHtzZXRfYmxvY2tlZF9kb21haW5zKCl9IG1ldGhvZHMKKyhhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgYW5kIG1ldGhvZHMgZm9yCitcdmFye2FsbG93ZWRfZG9tYWluc30pLiAgSWYgeW91IHNldCBhIHdoaXRlbGlzdCwgeW91IGNhbiB0dXJuIGl0IG9mZgorYWdhaW4gYnkgc2V0dGluZyBpdCB0byBcY29uc3RhbnR7Tm9uZX0uCisKK0RvbWFpbnMgaW4gYmxvY2sgb3IgYWxsb3cgbGlzdHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBhIGRvdCBtdXN0IGJlCitlcXVhbC4gIEZvciBleGFtcGxlLCBcY29kZXsiZXhhbXBsZS5jb20ifSBtYXRjaGVzIGEgYmxhY2tsaXN0IGVudHJ5IG9mCitcY29kZXsiZXhhbXBsZS5jb20ifSwgYnV0IFxjb2RleyJ3d3cuZXhhbXBsZS5jb20ifSBkb2VzIG5vdC4gIERvbWFpbnMKK3RoYXQgZG8gc3RhcnQgd2l0aCBhIGRvdCBhcmUgbWF0Y2hlZCBieSBtb3JlIHNwZWNpZmljIGRvbWFpbnMgdG9vLgorRm9yIGV4YW1wbGUsIGJvdGggXGNvZGV7Ind3dy5leGFtcGxlLmNvbSJ9IGFuZAorXGNvZGV7Ind3dy5jb3lvdGUuZXhhbXBsZS5jb20ifSBtYXRjaCBcY29kZXsiLmV4YW1wbGUuY29tIn0gKGJ1dAorXGNvZGV7ImV4YW1wbGUuY29tIn0gaXRzZWxmIGRvZXMgbm90KS4gIElQIGFkZHJlc3NlcyBhcmUgYW4gZXhjZXB0aW9uLAorYW5kIG11c3QgbWF0Y2ggZXhhY3RseS4gIEZvciBleGFtcGxlLCBpZiBibG9ja2VkX2RvbWFpbnMgY29udGFpbnMKK1xjb2RleyIxOTIuMTY4LjEuMiJ9IGFuZCBcY29kZXsiLjE2OC4xLjIifSwgMTkyLjE2OC4xLjIgaXMgYmxvY2tlZCwKK2J1dCAxOTMuMTY4LjEuMiBpcyBub3QuCisKK1xjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAorbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde2Jsb2NrZWRfZG9tYWluc317fQorUmV0dXJuIHRoZSBzZXF1ZW5jZSBvZiBibG9ja2VkIGRvbWFpbnMgKGFzIGEgdHVwbGUpLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17c2V0X2Jsb2NrZWRfZG9tYWluc30KKyAge2Jsb2NrZWRfZG9tYWluc30KK1NldCB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17aXNfYmxvY2tlZH17ZG9tYWlufQorUmV0dXJuIHdoZXRoZXIgXHZhcntkb21haW59IGlzIG9uIHRoZSBibGFja2xpc3QgZm9yIHNldHRpbmcgb3IKK3JlY2VpdmluZyBjb29raWVzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17YWxsb3dlZF9kb21haW5zfXt9CitSZXR1cm4gXGNvbnN0YW50e05vbmV9LCBvciB0aGUgc2VxdWVuY2Ugb2YgYWxsb3dlZCBkb21haW5zIChhcyBhIHR1cGxlKS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RlZmF1bHRDb29raWVQb2xpY3lde3NldF9hbGxvd2VkX2RvbWFpbnN9CisgIHthbGxvd2VkX2RvbWFpbnN9CitTZXQgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucywgb3IgXGNvbnN0YW50e05vbmV9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGVmYXVsdENvb2tpZVBvbGljeV17aXNfbm90X2FsbG93ZWR9e2RvbWFpbn0KK1JldHVybiB3aGV0aGVyIFx2YXJ7ZG9tYWlufSBpcyBub3Qgb24gdGhlIHdoaXRlbGlzdCBmb3Igc2V0dGluZyBvcgorcmVjZWl2aW5nIGNvb2tpZXMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xjbGFzc3tEZWZhdWx0Q29va2llUG9saWN5fSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMsCit3aGljaCBhcmUgYWxsIGluaXRpYWxpc2VkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiB0aGUgc2FtZQorbmFtZSwgYW5kIHdoaWNoIG1heSBhbGwgYmUgYXNzaWduZWQgdG8uCisKK0dlbmVyYWwgc3RyaWN0bmVzcyBzd2l0Y2hlczoKKworXGJlZ2lue21lbWJlcmRlc2N9e3N0cmljdF9kb21haW59CitEb24ndCBhbGxvdyBzaXRlcyB0byBzZXQgdHdvLWNvbXBvbmVudCBkb21haW5zIHdpdGggY291bnRyeS1jb2RlCit0b3AtbGV2ZWwgZG9tYWlucyBsaWtlIFxjb2Rley5jby51a30sIFxjb2Rley5nb3YudWt9LAorXGNvZGV7LmNvLm56fS5ldGMuICBUaGlzIGlzIGZhciBmcm9tIHBlcmZlY3QgYW5kIGlzbid0IGd1YXJhbnRlZWQgdG8KK3dvcmshCitcZW5ke21lbWJlcmRlc2N9CisKK1JGQyAyOTY1IHByb3RvY29sIHN0cmljdG5lc3Mgc3dpdGNoZXM6CisKK1xiZWdpbnttZW1iZXJkZXNjfXtzdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGV9CitGb2xsb3cgUkZDIDI5NjUgcnVsZXMgb24gdW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9ucyAodXN1YWxseSwgYW4KK3VudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiBpcyBvbmUgcmVzdWx0aW5nIGZyb20gYSByZWRpcmVjdCBvciBhIHJlcXVlc3QKK2ZvciBhbiBpbWFnZSBob3N0ZWQgb24gYW5vdGhlciBzaXRlKS4gIElmIHRoaXMgaXMgZmFsc2UsIGNvb2tpZXMgYXJlCitcZW1waHtuZXZlcn0gYmxvY2tlZCBvbiB0aGUgYmFzaXMgb2YgdmVyaWZpYWJpbGl0eQorXGVuZHttZW1iZXJkZXNjfQorCitOZXRzY2FwZSBwcm90b2NvbCBzdHJpY3RuZXNzIHN3aXRjaGVzOgorCitcYmVnaW57bWVtYmVyZGVzY317c3RyaWN0X25zX3VudmVyaWZpYWJsZX0KK2FwcGx5IFJGQyAyOTY1IHJ1bGVzIG9uIHVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbnMgZXZlbiB0byBOZXRzY2FwZQorY29va2llcworXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9e3N0cmljdF9uc19kb21haW59CitGbGFncyBpbmRpY2F0aW5nIGhvdyBzdHJpY3QgdG8gYmUgd2l0aCBkb21haW4tbWF0Y2hpbmcgcnVsZXMgZm9yCitOZXRzY2FwZSBjb29raWVzLiAgU2VlIGJlbG93IGZvciBhY2NlcHRhYmxlIHZhbHVlcy4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfXtzdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyfQorSWdub3JlIGNvb2tpZXMgaW4gU2V0LUNvb2tpZTogaGVhZGVycyB0aGF0IGhhdmUgbmFtZXMgc3RhcnRpbmcgd2l0aAorXGNvZGV7J1wkJ30uCitcZW5ke21lbWJlcmRlc2N9CitcYmVnaW57bWVtYmVyZGVzY317c3RyaWN0X25zX3NldF9wYXRofQorRG9uJ3QgYWxsb3cgc2V0dGluZyBjb29raWVzIHdob3NlIHBhdGggZG9lc24ndCBwYXRoLW1hdGNoIHJlcXVlc3QgVVJJLgorXGVuZHttZW1iZXJkZXNjfQorCitcbWVtYmVye3N0cmljdF9uc19kb21haW59IGlzIGEgY29sbGVjdGlvbiBvZiBmbGFncy4gIEl0cyB2YWx1ZSBpcworY29uc3RydWN0ZWQgYnkgb3ItaW5nIHRvZ2V0aGVyIChmb3IgZXhhbXBsZSwKK1xjb2Rle0RvbWFpblN0cmljdE5vRG90c3xEb21haW5TdHJpY3ROb25Eb21haW59IG1lYW5zIGJvdGggZmxhZ3MgYXJlCitzZXQpLgorCitcYmVnaW57bWVtYmVyZGVzY317RG9tYWluU3RyaWN0Tm9Eb3RzfQorV2hlbiBzZXR0aW5nIGNvb2tpZXMsIHRoZSAnaG9zdCBwcmVmaXgnIG11c3Qgbm90IGNvbnRhaW4gYSBkb3QKKyhlZy4gXGNvZGV7d3d3LmZvby5iYXIuY29tfSBjYW4ndCBzZXQgYSBjb29raWUgZm9yIFxjb2Rley5iYXIuY29tfSwKK2JlY2F1c2UgXGNvZGV7d3d3LmZvb30gY29udGFpbnMgYSBkb3QpLgorXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9e0RvbWFpblN0cmljdE5vbkRvbWFpbn0KK0Nvb2tpZXMgdGhhdCBkaWQgbm90IGV4cGxpY2l0bHkgc3BlY2lmeSBhIFxjb2Rle2RvbWFpbn0KK2Nvb2tpZS1hdHRyaWJ1dGUgY2FuIG9ubHkgYmUgcmV0dXJuZWQgdG8gYSBkb21haW4gdGhhdCBzdHJpbmctY29tcGFyZXMKK2VxdWFsIHRvIHRoZSBkb21haW4gdGhhdCBzZXQgdGhlIGNvb2tpZSAoZWcuIFxjb2Rle3NwYW0uZXhhbXBsZS5jb219Cit3b24ndCBiZSByZXR1cm5lZCBjb29raWVzIGZyb20gXGNvZGV7ZXhhbXBsZS5jb219IHRoYXQgaGFkIG5vCitcY29kZXtkb21haW59IGNvb2tpZS1hdHRyaWJ1dGUpLgorXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9e0RvbWFpblJGQzI5NjVNYXRjaH0KK1doZW4gc2V0dGluZyBjb29raWVzLCByZXF1aXJlIGEgZnVsbCBSRkMgMjk2NSBkb21haW4tbWF0Y2guCitcZW5ke21lbWJlcmRlc2N9CisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlLCBhbmQgYXJlIHRoZQorbW9zdCB1c2VmdWwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBmbGFnczoKKworXGJlZ2lue21lbWJlcmRlc2N9e0RvbWFpbkxpYmVyYWx9CitFcXVpdmFsZW50IHRvIDAgKGllLiBhbGwgb2YgdGhlIGFib3ZlIE5ldHNjYXBlIGRvbWFpbiBzdHJpY3RuZXNzIGZsYWdzCitzd2l0Y2hlZCBvZmYpLgorXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9e0RvbWFpblN0cmljdH0KK0VxdWl2YWxlbnQgdG8gXGNvZGV7RG9tYWluU3RyaWN0Tm9Eb3RzfERvbWFpblN0cmljdE5vbkRvbWFpbn0uCitcZW5ke21lbWJlcmRlc2N9CisKKworXHN1YnNlY3Rpb257Q29va2llIE9iamVjdHMgXGxhYmVse2Nvb2tpZS1qYXItb2JqZWN0c319CisKK1xjbGFzc3tDb29raWV9IGluc3RhbmNlcyBoYXZlIFB5dGhvbiBhdHRyaWJ1dGVzIHJvdWdobHkgY29ycmVzcG9uZGluZwordG8gdGhlIHN0YW5kYXJkIGNvb2tpZS1hdHRyaWJ1dGVzIHNwZWNpZmllZCBpbiB0aGUgdmFyaW91cyBjb29raWUKK3N0YW5kYXJkcy4gIFRoZSBjb3JyZXNwb25kZW5jZSBpcyBub3Qgb25lLXRvLW9uZSwgYmVjYXVzZSB0aGVyZSBhcmUKK2NvbXBsaWNhdGVkIHJ1bGVzIGZvciBhc3NpZ25pbmcgZGVmYXVsdCB2YWx1ZXMsIGFuZCBiZWNhdXNlIHRoZQorXGNvZGV7bWF4LWFnZX0gYW5kIFxjb2Rle2V4cGlyZXN9IGNvb2tpZS1hdHRyaWJ1dGVzIGNvbnRhaW4gZXF1aXZhbGVudAoraW5mb3JtYXRpb24uCisKK0Fzc2lnbm1lbnQgdG8gdGhlc2UgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBvdGhlciB0aGFuIGluCityYXJlIGNpcmN1bXN0YW5jZXMgaW4gYSBcY2xhc3N7Q29va2llUG9saWN5fSBtZXRob2QuICBUaGUgY2xhc3MgZG9lcworbm90IGVuZm9yY2UgaW50ZXJuYWwgY29uc2lzdGVuY3ksIHNvIHlvdSBzaG91bGQga25vdyB3aGF0IHlvdSdyZQorZG9pbmcgaWYgeW91IGRvIHRoYXQuCisKK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3ZlcnNpb259CitJbnRlZ2VyIG9yIFxjb25zdGFudHtOb25lfS4gIE5ldHNjYXBlIGNvb2tpZXMgaGF2ZSB2ZXJzaW9uIDAuICBSRkMKKzI5NjUgYW5kIFJGQyAyMTA5IGNvb2tpZXMgaGF2ZSB2ZXJzaW9uIDEuCitcZW5ke21lbWJlcmRlc2N9CitcYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtuYW1lfQorQ29va2llIG5hbWUgKGEgc3RyaW5nKSwgb3IgXGNvbnN0YW50e05vbmV9LgorXGVuZHttZW1iZXJkZXNjfQorXGJlZ2lue21lbWJlcmRlc2N9W0Nvb2tpZV17dmFsdWV9CitDb29raWUgdmFsdWUgKGEgc3RyaW5nKS4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3BvcnR9CitTdHJpbmcgcmVwcmVzZW50aW5nIGEgcG9ydCBvciBhIHNldCBvZiBwb3J0cyAoZWcuICc4MCcsIG9yICc4MCw4MDgwJyksCitvciBcY29uc3RhbnR7Tm9uZX0uCitcZW5ke21lbWJlcmRlc2N9CitcYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtwYXRofQorQ29va2llIHBhdGggKGEgc3RyaW5nLCBlZy4gJy9hY21lL3JvY2tldF9sYXVuY2hlcnMnKS4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3NlY3VyZX0KK1RydWUgaWYgY29va2llIHNob3VsZCBvbmx5IGJlIHJldHVybmVkIG92ZXIgYSBzZWN1cmUgY29ubmVjdGlvbi4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2V4cGlyZXN9CitJbnRlZ2VyIGV4cGlyeSBkYXRlIGluIHNlY29uZHMgc2luY2UgZXBvY2gsIG9yIFxjb25zdGFudHtOb25lfS4gIFNlZQorYWxzbyB0aGUgXG1ldGhvZHtpc19leHBpcmVkKCl9IG1ldGhvZC4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2Rpc2NhcmR9CitUcnVlIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvb2tpZS4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2NvbW1lbnR9CitTdHJpbmcgY29tbWVudCBmcm9tIHRoZSBzZXJ2ZXIgZXhwbGFpbmluZyB0aGUgZnVuY3Rpb24gb2YgdGhpcyBjb29raWUsCitvciBcY29uc3RhbnR7Tm9uZX0uCitcZW5ke21lbWJlcmRlc2N9CitcYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtjb21tZW50X3VybH0KK1VSTCBsaW5raW5nIHRvIGEgY29tbWVudCBmcm9tIHRoZSBzZXJ2ZXIgZXhwbGFpbmluZyB0aGUgZnVuY3Rpb24gb2YKK3RoaXMgY29va2llLCBvciBcY29uc3RhbnR7Tm9uZX0uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde3BvcnRfc3BlY2lmaWVkfQorVHJ1ZSBpZiBhIHBvcnQgb3Igc2V0IG9mIHBvcnRzIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyCisoaW4gdGhlIFxtYWlsaGVhZGVye1NldC1Db29raWV9IC8gXG1haWxoZWFkZXJ7U2V0LUNvb2tpZTJ9IGhlYWRlcikuCitcZW5ke21lbWJlcmRlc2N9CitcYmVnaW57bWVtYmVyZGVzY31bQ29va2llXXtkb21haW5fc3BlY2lmaWVkfQorVHJ1ZSBpZiBhIGRvbWFpbiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHNlcnZlci4KK1xlbmR7bWVtYmVyZGVzY30KK1xiZWdpbnttZW1iZXJkZXNjfVtDb29raWVde2RvbWFpbl9pbml0aWFsX2RvdH0KK1RydWUgaWYgdGhlIGRvbWFpbiBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUgc2VydmVyIGJlZ2FuIHdpdGggYQorZG90ICgnLicpLgorXGVuZHttZW1iZXJkZXNjfQorCitDb29raWVzIG1heSBoYXZlIGFkZGl0aW9uYWwgbm9uLXN0YW5kYXJkIGNvb2tpZS1hdHRyaWJ1dGVzLiAgVGhlc2UgbWF5CitiZSBhY2Nlc3NlZCB1c2luZyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVde2hhc19ub25zdGFuZGFyZF9hdHRyfXtuYW1lfQorUmV0dXJuIHRydWUgaWYgY29va2llIGhhcyB0aGUgbmFtZWQgY29va2llLWF0dHJpYnV0ZS4KK1xlbmR7bWV0aG9kZGVzY30KK1xiZWdpbnttZXRob2RkZXNjfVtDb29raWVde2dldF9ub25zdGFuZGFyZF9hdHRyfXtuYW1lLCBkZWZhdWx0PVxjb25zdGFudHtOb25lfX0KK0lmIGNvb2tpZSBoYXMgdGhlIG5hbWVkIGNvb2tpZS1hdHRyaWJ1dGUsIHJldHVybiBpdHMgdmFsdWUuCitPdGhlcndpc2UsIHJldHVybiBcdmFye2RlZmF1bHR9LgorXGVuZHttZXRob2RkZXNjfQorXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZV17c2V0X25vbnN0YW5kYXJkX2F0dHJ9e25hbWUsIHZhbHVlfQorU2V0IHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgY29va2llLWF0dHJpYnV0ZS4KK1xlbmR7bWV0aG9kZGVzY30KKworVGhlIFxjbGFzc3tDb29raWV9IGNsYXNzIGFsc28gZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvb2tpZV17aXNfZXhwaXJlZH17XG9wdGlvbmFse25vdz1cY29uc3RhbnR7Tm9uZX19fQorVHJ1ZSBpZiBjb29raWUgaGFzIHBhc3NlZCB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlcXVlc3RlZCBpdAorc2hvdWxkIGV4cGlyZS4gIElmIFx2YXJ7bm93fSBpcyBnaXZlbiAoaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpLAorcmV0dXJuIHdoZXRoZXIgdGhlIGNvb2tpZSBoYXMgZXhwaXJlZCBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCitcZW5ke21ldGhvZGRlc2N9CisKKworXHN1YnNlY3Rpb257RXhhbXBsZXMgXGxhYmVse2Nvb2tpZWxpYi1leGFtcGxlc319CisKK1RoZSBmaXJzdCBleGFtcGxlIHNob3dzIHRoZSBtb3N0IGNvbW1vbiB1c2FnZSBvZiBcbW9kdWxle2Nvb2tpZWxpYn06CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBjb29raWVsaWIsIHVybGxpYjIKK2NqID0gY29va2llbGliLkNvb2tpZUphcigpCitvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opKQorciA9IG9wZW5lci5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKK1xlbmR7dmVyYmF0aW19CisKK1RoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgdG8gb3BlbiBhIFVSTCB1c2luZyB5b3VyIE5ldHNjYXBlLAorTW96aWxsYSwgb3IgbHlueCBjb29raWVzIChhc3N1bWVzIFxVTklYe30gY29udmVudGlvbiBmb3IgbG9jYXRpb24gb2YKK3RoZSBjb29raWVzIGZpbGUpOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgb3MsIGNvb2tpZWxpYiwgdXJsbGliMgorY2ogPSBjb29raWVsaWIuTW96aWxsYUNvb2tpZUphcigpCitjai5sb2FkKG9zLnBhdGguam9pbihvcy5lbnZpcm9uWyJIT01FIl0sICIvLm5ldHNjYXBlL2Nvb2tpZXMudHh0IikpCitvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opKQorciA9IG9wZW5lci5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBuZXh0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBcY2xhc3N7RGVmYXVsdENvb2tpZVBvbGljeX0uCitUdXJuIG9uIFJGQyAyOTY1IGNvb2tpZXMsIGJlIG1vcmUgc3RyaWN0IGFib3V0IGRvbWFpbnMgd2hlbiBzZXR0aW5nCithbmQgcmV0dXJuaW5nIE5ldHNjYXBlIGNvb2tpZXMsIGFuZCBibG9jayBzb21lIGRvbWFpbnMgZnJvbSBzZXR0aW5nCitjb29raWVzIG9yIGhhdmluZyB0aGVtIHJldHVybmVkOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgdXJsbGliMgorZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeSBhcyBQb2xpY3kKK3BvbGljeSA9IFBvbGljeShyZmMyOTY1PVRydWUsIHN0cmljdF9uc19kb21haW49UG9saWN5LkRvbWFpblN0cmljdCwKKyAgICAgICAgICAgICAgICBibG9ja2VkX2RvbWFpbnM9WyJhZHMubmV0IiwgIi5hZHMubmV0Il0pCitjaiA9IENvb2tpZUphcihwb2xpY3kpCitvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opKQorciA9IG9wZW5lci5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAppbmRleCAyMzk5NjQ1Li4zY2U5NWZiIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4CisrKyBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKQEAgLTEwLDE0ICsxMCwxMyBAQAogCiBUaGUgXG1vZHVsZXt1cmxsaWIyfSBtb2R1bGUgZGVmaW5lcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgd2hpY2ggaGVscAogaW4gb3BlbmluZyBVUkxzIChtb3N0bHkgSFRUUCkgaW4gYSBjb21wbGV4IHdvcmxkIC0tLSBiYXNpYyBhbmQgZGlnZXN0Ci1hdXRoZW50aWNhdGlvbiwgcmVkaXJlY3Rpb25zIGFuZCBtb3JlLgorYXV0aGVudGljYXRpb24sIHJlZGlyZWN0aW9ucywgY29va2llcyBhbmQgbW9yZS4KIAogVGhlIFxtb2R1bGV7dXJsbGliMn0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKIFxiZWdpbntmdW5jZGVzY317dXJsb3Blbn17dXJsXG9wdGlvbmFseywgZGF0YX19CiBPcGVuIHRoZSBVUkwgXHZhcnt1cmx9LCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgXGNsYXNze1JlcXVlc3R9Ci1vYmplY3QgKGN1cnJlbnRseSB0aGUgY29kZSBjaGVja3MgdGhhdCBpdCByZWFsbHkgaXMgYSBcY2xhc3N7UmVxdWVzdH0KLWluc3RhbmNlLCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIFxjbGFzc3tSZXF1ZXN0fSkuCitvYmplY3QuCiAKIFx2YXJ7ZGF0YX0gc2hvdWxkIGJlIGEgc3RyaW5nLCB3aGljaCBzcGVjaWZpZXMgYWRkaXRpb25hbCBkYXRhIHRvCiBzZW5kIHRvIHRoZSBzZXJ2ZXIuIEluIEhUVFAgcmVxdWVzdHMsIHdoaWNoIGFyZSB0aGUgb25seSBvbmVzIHRoYXQKQEAgLTg3LDEzICs4NiwzMiBAQAogCiBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHByb3ZpZGVkOgogCi1cYmVnaW57Y2xhc3NkZXNjfXtSZXF1ZXN0fXt1cmxcb3B0aW9uYWx7LCBkYXRhXG9wdGlvbmFseywgaGVhZGVyc319fQorXGJlZ2lue2NsYXNzZGVzY317UmVxdWVzdH17dXJsXG9wdGlvbmFseywgZGF0YX1cb3B0aW9uYWx7LCBoZWFkZXJzfQorICAgIFxvcHRpb25hbHssIG9yaWdpbl9yZXFfaG9zdH1cb3B0aW9uYWx7LCB1bnZlcmlmaWFibGV9fQogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhIFVSTCByZXF1ZXN0LgogCiBcdmFye3VybH0gc2hvdWxkIGJlIGEgc3RyaW5nIHdoaWNoIGlzIGEgdmFsaWQgVVJMLiAgRm9yIGEgZGVzY3JpcHRpb24KIG9mIFx2YXJ7ZGF0YX0gc2VlIHRoZSBcbWV0aG9ke2FkZF9kYXRhKCl9IGRlc2NyaXB0aW9uLgogXHZhcntoZWFkZXJzfSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmCiBcbWV0aG9ke2FkZF9oZWFkZXIoKX0gd2FzIGNhbGxlZCB3aXRoIGVhY2gga2V5IGFuZCB2YWx1ZSBhcyBhcmd1bWVudHMuCisKK1RoZSBmaW5hbCB0d28gYXJndW1lbnRzIGFyZSBvbmx5IG9mIGludGVyZXN0IGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mCit0aGlyZC1wYXJ0eSBIVFRQIGNvb2tpZXM6CisKK1x2YXJ7b3JpZ2luX3JlcV9ob3N0fSBzaG91bGQgYmUgdGhlIHJlcXVlc3QtaG9zdCBvZiB0aGUgb3JpZ2luCit0cmFuc2FjdGlvbiwgYXMgZGVmaW5lZCBieSBccmZjezI5NjV9LiAgSXQgZGVmYXVsdHMgdG8KK1xjb2Rle2Nvb2tpZWxpYi5yZXF1ZXN0X2hvc3Qoc2VsZil9LiAgVGhpcyBpcyB0aGUgaG9zdCBuYW1lIG9yIElQCithZGRyZXNzIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRoYXQgd2FzIGluaXRpYXRlZCBieSB0aGUgdXNlci4gIEZvcgorZXhhbXBsZSwgaWYgdGhlIHJlcXVlc3QgaXMgZm9yIGFuIGltYWdlIGluIGFuIEhUTUwgZG9jdW1lbnQsIHRoaXMKK3Nob3VsZCBiZSB0aGUgcmVxdWVzdC1ob3N0IG9mIHRoZSByZXF1ZXN0IGZvciB0aGUgcGFnZSBjb250YWluaW5nIHRoZQoraW1hZ2UuCisKK1x2YXJ7dW52ZXJpZmlhYmxlfSBzaG91bGQgaW5kaWNhdGUgd2hldGhlciB0aGUgcmVxdWVzdCBpcwordW52ZXJpZmlhYmxlLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LiAgSXQgZGVmYXVsdHMgdG8gRmFsc2UuICBBbgordW52ZXJpZmlhYmxlIHJlcXVlc3QgaXMgb25lIHdob3NlIFVSTCB0aGUgdXNlciBkaWQgbm90IGhhdmUgdGhlIG9wdGlvbgordG8gYXBwcm92ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVxdWVzdCBpcyBmb3IgYW4gaW1hZ2UgaW4gYW4gSFRNTAorZG9jdW1lbnQsIGFuZCB0aGUgdXNlciBoYWQgbm8gb3B0aW9uIHRvIGFwcHJvdmUgdGhlIGF1dG9tYXRpYyBmZXRjaGluZworb2YgdGhlIGltYWdlLCB0aGlzIHNob3VsZCBiZSB0cnVlLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e09wZW5lckRpcmVjdG9yfXt9CkBAIC0xMTYsNiArMTM0LDEwIEBACiBBIGNsYXNzIHRvIGhhbmRsZSByZWRpcmVjdGlvbnMuCiBcZW5ke2NsYXNzZGVzY30KIAorXGJlZ2lue2NsYXNzZGVzY317SFRUUENvb2tpZVByb2Nlc3Nvcn17XG9wdGlvbmFse2Nvb2tpZWphcn19CitBIGNsYXNzIHRvIGhhbmRsZSBIVFRQIENvb2tpZXMuCitcZW5ke2NsYXNzZGVzY30KKwogXGJlZ2lue2NsYXNzZGVzY317UHJveHlIYW5kbGVyfXtcb3B0aW9uYWx7cHJveGllc319CiBDYXVzZSByZXF1ZXN0cyB0byBnbyB0aHJvdWdoIGEgcHJveHkuCiBJZiBcdmFye3Byb3hpZXN9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nCkBAIC0yMTcsMTAgKzIzOSwxMCBAQAogYW5kIHNvIGFsbCBtdXN0IGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3Nlcy4KIAogXGJlZ2lue21ldGhvZGRlc2N9W1JlcXVlc3Rde2FkZF9kYXRhfXtkYXRhfQotU2V0IHRoZSBcY2xhc3N7UmVxdWVzdH0gZGF0YSB0byBcdmFye2RhdGF9LiAgVGhpcyBpcyBpZ25vcmVkCi1ieSBhbGwgaGFuZGxlcnMgZXhjZXB0IEhUVFAgaGFuZGxlcnMgLS0tIGFuZCB0aGVyZSBpdCBzaG91bGQgYmUgYW4KLVxtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLWVuY29kZWR9IGJ1ZmZlciwgYW5kIHdpbGwgY2hhbmdlIHRoZQotcmVxdWVzdCB0byBiZSBcY29kZXtQT1NUfSByYXRoZXIgdGhhbiBcY29kZXtHRVR9LiAKK1NldCB0aGUgXGNsYXNze1JlcXVlc3R9IGRhdGEgdG8gXHZhcntkYXRhfS4gIFRoaXMgaXMgaWdub3JlZCBieSBhbGwKK2hhbmRsZXJzIGV4Y2VwdCBIVFRQIGhhbmRsZXJzIC0tLSBhbmQgdGhlcmUgaXQgc2hvdWxkIGJlIGEgYnl0ZQorc3RyaW5nLCBhbmQgd2lsbCBjaGFuZ2UgdGhlIHJlcXVlc3QgdG8gYmUgXGNvZGV7UE9TVH0gcmF0aGVyIHRoYW4KK1xjb2Rle0dFVH0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtnZXRfbWV0aG9kfXt9CkBAIC0yODIsNiArMzA0LDE3IEBACiBzZWxlY3RvciB3aWxsIGJlIHRoZSBvcmlnaW5hbCBVUkwgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY31bUmVxdWVzdF17Z2V0X29yaWdpbl9yZXFfaG9zdH17fQorUmV0dXJuIHRoZSByZXF1ZXN0LWhvc3Qgb2YgdGhlIG9yaWdpbiB0cmFuc2FjdGlvbiwgYXMgZGVmaW5lZCBieQorXHJmY3syOTY1fS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxjbGFzc3tSZXF1ZXN0fQorY29uc3RydWN0b3IuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtSZXF1ZXN0XXtpc191bnZlcmlmaWFibGV9e30KK1JldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IGlzIHVudmVyaWZpYWJsZSwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NS4KK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIFxjbGFzc3tSZXF1ZXN0fSBjb25zdHJ1Y3Rvci4KK1xlbmR7bWV0aG9kZGVzY30KKwogCiBcc3Vic2VjdGlvbntPcGVuZXJEaXJlY3RvciBPYmplY3RzIFxsYWJlbHtvcGVuZXItZGlyZWN0b3Itb2JqZWN0c319CiAKQEAgLTI4OSwxNCArMzIyLDE4IEBACiAKIFxiZWdpbnttZXRob2RkZXNjfVtPcGVuZXJEaXJlY3Rvcl17YWRkX2hhbmRsZXJ9e2hhbmRsZXJ9CiBcdmFye2hhbmRsZXJ9IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBcY2xhc3N7QmFzZUhhbmRsZXJ9LiAgVGhlCi1mb2xsb3dpbmcgbWV0aG9kcyBhcmUgc2VhcmNoZWQsIGFuZCBhZGRlZCB0byB0aGUgcG9zc2libGUgY2hhaW5zLgorZm9sbG93aW5nIG1ldGhvZHMgYXJlIHNlYXJjaGVkLCBhbmQgYWRkZWQgdG8gdGhlIHBvc3NpYmxlIGNoYWlucyAobm90ZQordGhhdCBIVFRQIGVycm9ycyBhcmUgYSBzcGVjaWFsIGNhc2UpLgogCiBcYmVnaW57aXRlbWl6ZX0KICAgXGl0ZW0gXG1ldGhvZHtcdmFye3Byb3RvY29sfV9vcGVuKCl9IC0tLQogICAgIHNpZ25hbCB0aGF0IHRoZSBoYW5kbGVyIGtub3dzIGhvdyB0byBvcGVuIFx2YXJ7cHJvdG9jb2x9IFVSTHMuCi0gIFxpdGVtIFxtZXRob2R7XHZhcntwcm90b2NvbH1fZXJyb3JfXHZhcnt0eXBlfSgpfSAtLS0KLSAgICBzaWduYWwgdGhhdCB0aGUgaGFuZGxlciBrbm93cyBob3cgdG8gaGFuZGxlIFx2YXJ7dHlwZX0gZXJyb3JzIGZyb20KLSAgICBcdmFye3Byb3RvY29sfS4KKyAgXGl0ZW0gXG1ldGhvZHtodHRwX2Vycm9yX1x2YXJ7dHlwZX0oKX0gLS0tCisgICAgc2lnbmFsIHRoYXQgdGhlIGhhbmRsZXIga25vd3MgaG93IHRvIGhhbmRsZSBIVFRQIGVycm9ycyB3aXRoIEhUVFAKKyAgICBlcnJvciBjb2RlIFx2YXJ7dHlwZX0uCisgIFxpdGVtIFxtZXRob2R7XHZhcntwcm90b2NvbH1fZXJyb3IoKX0gLS0tCisgICAgc2lnbmFsIHRoYXQgdGhlIGhhbmRsZXIga25vd3MgaG93IHRvIGhhbmRsZSBlcnJvcnMgZnJvbQorICAgIChub24tXGNvZGV7aHR0cH0pIFx2YXJ7cHJvdG9jb2x9LgogICBcaXRlbSBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X3JlcXVlc3QoKX0gLS0tCiAgICAgc2lnbmFsIHRoYXQgdGhlIGhhbmRsZXIga25vd3MgaG93IHRvIHByZS1wcm9jZXNzIFx2YXJ7cHJvdG9jb2x9CiAgICAgcmVxdWVzdHMuCkBAIC0zMDYsMjYgKzM0MywxNyBAQAogXGVuZHtpdGVtaXplfQogXGVuZHttZXRob2RkZXNjfQogCi1cYmVnaW57bWV0aG9kZGVzY31bT3BlbmVyRGlyZWN0b3Jde2Nsb3NlfXt9Ci1FeHBsaWNpdGx5IGJyZWFrIGN5Y2xlcywgYW5kIGRlbGV0ZSBhbGwgdGhlIGhhbmRsZXJzLgotQmVjYXVzZSB0aGUgXGNsYXNze09wZW5lckRpcmVjdG9yfSBuZWVkcyB0byBrbm93IHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLAotYW5kIGEgaGFuZGxlciBuZWVkcyB0byBrbm93IHdobyB0aGUgXGNsYXNze09wZW5lckRpcmVjdG9yfSB3aG8gY2FsbGVkCi1pdCBpcywgdGhlcmUgaXMgYSByZWZlcmVuY2UgY3ljbGUuICBFdmVuIHRob3VnaCByZWNlbnQgdmVyc2lvbnMgb2YgUHl0aG9uCi1oYXZlIGN5Y2xlLWNvbGxlY3Rpb24sIGl0IGlzIHNvbWV0aW1lcyBwcmVmZXJhYmxlIHRvIGV4cGxpY2l0bHkgYnJlYWsKLXRoZSBjeWNsZXMuCi1cZW5ke21ldGhvZGRlc2N9Ci0KIFxiZWdpbnttZXRob2RkZXNjfVtPcGVuZXJEaXJlY3Rvcl17b3Blbn17dXJsXG9wdGlvbmFseywgZGF0YX19CiBPcGVuIHRoZSBnaXZlbiBcdmFye3VybH0gKHdoaWNoIGNhbiBiZSBhIHJlcXVlc3Qgb2JqZWN0IG9yIGEgc3RyaW5nKSwKIG9wdGlvbmFsbHkgcGFzc2luZyB0aGUgZ2l2ZW4gXHZhcntkYXRhfS4KIEFyZ3VtZW50cywgcmV0dXJuIHZhbHVlcyBhbmQgZXhjZXB0aW9ucyByYWlzZWQgYXJlIHRoZSBzYW1lIGFzIHRob3NlCiBvZiBcZnVuY3Rpb257dXJsb3BlbigpfSAod2hpY2ggc2ltcGx5IGNhbGxzIHRoZSBcbWV0aG9ke29wZW4oKX0gbWV0aG9kCi1vbiB0aGUgZGVmYXVsdCBpbnN0YWxsZWQgXGNsYXNze09wZW5lckRpcmVjdG9yfSkuCitvbiB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBnbG9iYWwgXGNsYXNze09wZW5lckRpcmVjdG9yfSkuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtPcGVuZXJEaXJlY3Rvcl17ZXJyb3J9e3Byb3RvXG9wdGlvbmFseywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xvcHRpb25hbHssIFxtb3JlYXJnc319fQotSGFuZGxlIGFuIGVycm9yIGluIGEgZ2l2ZW4gcHJvdG9jb2wuICBUaGlzIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZAorSGFuZGxlIGFuIGVycm9yIG9mIHRoZSBnaXZlbiBwcm90b2NvbC4gIFRoaXMgd2lsbCBjYWxsIHRoZSByZWdpc3RlcmVkCiBlcnJvciBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHByb3RvY29sIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyAod2hpY2gKIGFyZSBwcm90b2NvbCBzcGVjaWZpYykuICBUaGUgSFRUUCBwcm90b2NvbCBpcyBhIHNwZWNpYWwgY2FzZSB3aGljaAogdXNlcyB0aGUgSFRUUCByZXNwb25zZSBjb2RlIHRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgZXJyb3IgaGFuZGxlcjsKQEAgLTMzNSw2ICszNjMsNDUgQEAKIG9mIFxmdW5jdGlvbnt1cmxvcGVuKCl9LgogXGVuZHttZXRob2RkZXNjfQogCitPcGVuZXJEaXJlY3RvciBvYmplY3RzIG9wZW4gVVJMcyBpbiB0aHJlZSBzdGFnZXM6CisKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIEV2ZXJ5IGhhbmRsZXIgd2l0aCBhIG1ldGhvZCBuYW1lZCBsaWtlCisgICAgXG1ldGhvZHtcdmFye3Byb3RvY29sfV9yZXF1ZXN0KCl9IGhhcyB0aGF0IG1ldGhvZCBjYWxsZWQgdG8KKyAgICBwcmUtcHJvY2VzcyB0aGUgcmVxdWVzdC4KKworICAgIFRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieQorICAgIHNvcnRpbmcgdGhlIGhhbmRsZXIgaW5zdGFuY2VzIGJ5IHRoZSBcbWVtYmVyey5wcm9jZXNzb3Jfb3JkZXJ9CisgICAgYXR0cmlidXRlLgorCisgIFxpdGVtIEhhbmRsZXJzIHdpdGggYSBtZXRob2QgbmFtZWQgbGlrZQorICAgIFxtZXRob2R7XHZhcntwcm90b2NvbH1fb3BlbigpfSBhcmUgY2FsbGVkIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4KKyAgICBUaGlzIHN0YWdlIGVuZHMgd2hlbiBhIGhhbmRsZXIgZWl0aGVyIHJldHVybnMgYQorICAgIG5vbi1cY29uc3RhbnR7Tm9uZX0gdmFsdWUgKGllLiBhIHJlc3BvbnNlKSwgb3IgcmFpc2VzIGFuIGV4Y2VwdGlvbgorICAgICh1c3VhbGx5IFVSTEVycm9yKS4gIEV4Y2VwdGlvbnMgYXJlIGFsbG93ZWQgdG8gcHJvcGFnYXRlLgorCisgICAgSW4gZmFjdCwgdGhlIGFib3ZlIGFsZ29yaXRobSBpcyBmaXJzdCB0cmllZCBmb3IgbWV0aG9kcyBuYW1lZAorICAgIFxtZXRob2R7ZGVmYXVsdF9vcGVufS4gIElmIGFsbCBzdWNoIG1ldGhvZHMgcmV0dXJuCisgICAgXGNvbnN0YW50e05vbmV9LCB0aGUgYWxnb3JpdGhtIGlzIHJlcGVhdGVkIGZvciBtZXRob2RzIG5hbWVkIGxpa2UKKyAgICBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X29wZW4oKX0uICBJZiBhbGwgc3VjaCBtZXRob2RzIHJldHVybgorICAgIFxjb25zdGFudHtOb25lfSwgdGhlIGFsZ29yaXRobSBpcyByZXBlYXRlZCBmb3IgbWV0aG9kcyBuYW1lZAorICAgIFxtZXRob2R7dW5rbm93bl9vcGVuKCl9LgorCisgICAgTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzIG1heSBpbnZvbHZlIGNhbGxzIG9mCisgICAgdGhlIHBhcmVudCBcY2xhc3N7T3BlbmVyRGlyZWN0b3J9IGluc3RhbmNlJ3MgXG1ldGhvZHsub3BlbigpfSBhbmQKKyAgICBcbWV0aG9key5lcnJvcigpfSBtZXRob2RzLgorCisgICAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBpcyBkZXRlcm1pbmVkIGJ5CisgICAgc29ydGluZyB0aGUgaGFuZGxlciBpbnN0YW5jZXMuCisKKyAgXGl0ZW0gRXZlcnkgaGFuZGxlciB3aXRoIGEgbWV0aG9kIG5hbWVkIGxpa2UKKyAgICBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X3Jlc3BvbnNlKCl9IGhhcyB0aGF0IG1ldGhvZCBjYWxsZWQgdG8KKyAgICBwb3N0LXByb2Nlc3MgdGhlIHJlc3BvbnNlLgorCisgICAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBpcyBkZXRlcm1pbmVkIGJ5CisgICAgc29ydGluZyB0aGUgaGFuZGxlciBpbnN0YW5jZXMgYnkgdGhlIFxtZW1iZXJ7LnByb2Nlc3Nvcl9vcmRlcn0KKyAgICBhdHRyaWJ1dGUuCitcZW5ke2VudW1lcmF0ZX0KIAogXHN1YnNlY3Rpb257QmFzZUhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7YmFzZS1oYW5kbGVyLW9iamVjdHN9fQogCkBAIC0zNTEsNyArNDE4LDExIEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBhbmQgbWV0aG9kcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMKLWRlcml2ZWQgZnJvbSBcY2xhc3N7QmFzZUhhbmRsZXJ9OgorZGVyaXZlZCBmcm9tIFxjbGFzc3tCYXNlSGFuZGxlcn0uICBcbm90ZXtUaGUgY29udmVudGlvbiBoYXMgYmVlbgorYWRvcHRlZCB0aGF0IHN1YmNsYXNzZXMgZGVmaW5pbmcgXG1ldGhvZHtcdmFye3Byb3RvY29sfV9yZXF1ZXN0KCl9IG9yCitcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X3Jlc3BvbnNlKCl9IG1ldGhvZHMgYXJlIG5hbWVkCitcY2xhc3N7KlByb2Nlc3Nvcn07IGFsbCBvdGhlcnMgYXJlIG5hbWVkIFxjbGFzc3sqSGFuZGxlcn0ufQorCiAKIFxiZWdpbnttZW1iZXJkZXNjfVtCYXNlSGFuZGxlcl17cGFyZW50fQogQSB2YWxpZCBcY2xhc3N7T3BlbmVyRGlyZWN0b3J9LCB3aGljaCBjYW4gYmUgdXNlZCB0byBvcGVuIHVzaW5nIGEKQEAgLTQyMyw2ICs0OTQsMjkgQEAKIGZvciBcbWV0aG9ke2h0dHBfZXJyb3JfZGVmYXVsdCgpfS4KIFxlbmR7bWV0aG9kZGVzY30KIAorXGJlZ2lue21ldGhvZGRlc2NuaX1bQmFzZUhhbmRsZXJde1x2YXJ7cHJvdG9jb2x9X3JlcXVlc3R9e3JlcX0KK1RoaXMgbWV0aG9kIGlzIFxlbXBoe25vdH0gZGVmaW5lZCBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQKK3N1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBpdCBpZiB0aGV5IHdhbnQgdG8gcHJlLXByb2Nlc3MgcmVxdWVzdHMgb2YKK3RoZSBnaXZlbiBwcm90b2NvbC4KKworVGhpcyBtZXRob2QsIGlmIGRlZmluZWQsIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBwYXJlbnQKK1xjbGFzc3tPcGVuZXJEaXJlY3Rvcn0uICBcdmFye3JlcX0gd2lsbCBiZSBhIFxjbGFzc3tSZXF1ZXN0fSBvYmplY3QuCitUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBhIFxjbGFzc3tSZXF1ZXN0fSBvYmplY3QuCitcZW5ke21ldGhvZGRlc2NuaX0KKworXGJlZ2lue21ldGhvZGRlc2NuaX1bQmFzZUhhbmRsZXJde1x2YXJ7cHJvdG9jb2x9X3Jlc3BvbnNlfXtyZXEsIHJlc3BvbnNlfQorVGhpcyBtZXRob2QgaXMgXGVtcGh7bm90fSBkZWZpbmVkIGluIFxjbGFzc3tCYXNlSGFuZGxlcn0sIGJ1dAorc3ViY2xhc3NlcyBzaG91bGQgZGVmaW5lIGl0IGlmIHRoZXkgd2FudCB0byBwb3N0LXByb2Nlc3MgcmVzcG9uc2VzIG9mCit0aGUgZ2l2ZW4gcHJvdG9jb2wuCisKK1RoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgcGFyZW50CitcY2xhc3N7T3BlbmVyRGlyZWN0b3J9LiAgXHZhcntyZXF9IHdpbGwgYmUgYSBcY2xhc3N7UmVxdWVzdH0gb2JqZWN0LgorXHZhcntyZXNwb25zZX0gd2lsbCBiZSBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBzYW1lIGludGVyZmFjZSBhcwordGhlIHJldHVybiB2YWx1ZSBvZiBcZnVuY3Rpb257dXJsb3BlbigpfS4gIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkCitpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YKK1xmdW5jdGlvbnt1cmxvcGVuKCl9LgorXGVuZHttZXRob2RkZXNjbml9CisKIFxzdWJzZWN0aW9ue0hUVFBSZWRpcmVjdEhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7aHR0cC1yZWRpcmVjdC1oYW5kbGVyfX0KIAogXG5vdGV7U29tZSBIVFRQIHJlZGlyZWN0aW9ucyByZXF1aXJlIGFjdGlvbiBmcm9tIHRoaXMgbW9kdWxlJ3MgY2xpZW50CkBAIC00MzQsMTIgKzUyOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcCwgY29kZSwgbXNnLCBoZHJzfQogUmV0dXJuIGEgXGNsYXNze1JlcXVlc3R9IG9yIFxjb2Rle05vbmV9IGluIHJlc3BvbnNlIHRvIGEgcmVkaXJlY3QuCiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi1cbWV0aG9ke2h0dHBfZXJyb3JfMzAqKCl9IG1ldGhvZHMgd2hlbiBhIHJlZGlyZWN0aW9uIGlzIHJlY2VpdmVkCi1mcm9tIHRoZSBzZXJ2ZXIuICBJZiBhIHJlZGlyZWN0aW9uIHNob3VsZCB0YWtlIHBsYWNlLCByZXR1cm4gYSBuZXcKK1xtZXRob2R7aHR0cF9lcnJvcl8zMCooKX0gbWV0aG9kcyB3aGVuIGEgcmVkaXJlY3Rpb24gaXMgcmVjZWl2ZWQgZnJvbQordGhlIHNlcnZlci4gIElmIGEgcmVkaXJlY3Rpb24gc2hvdWxkIHRha2UgcGxhY2UsIHJldHVybiBhIG5ldwogXGNsYXNze1JlcXVlc3R9IHRvIGFsbG93IFxtZXRob2R7aHR0cF9lcnJvcl8zMCooKX0gdG8gcGVyZm9ybSB0aGUKLXJlZGlyZWN0LiAgT3RoZXJ3aXNlLCByYWlzZSBcZXhjZXB0aW9ue0hUVFBFcnJvcn0gaWYgbm8gb3RoZXIKLVxjbGFzc3tIYW5kbGVyfSBzaG91bGQgdHJ5IHRvIGhhbmRsZSB0aGlzIFVSTCwgb3IgcmV0dXJuIFxjb2Rle05vbmV9Ci1pZiB5b3UgY2FuJ3QgYnV0IGFub3RoZXIgXGNsYXNze0hhbmRsZXJ9IG1pZ2h0LgorcmVkaXJlY3QuICBPdGhlcndpc2UsIHJhaXNlIFxleGNlcHRpb257SFRUUEVycm9yfSBpZiBubyBvdGhlciBoYW5kbGVyCitzaG91bGQgdHJ5IHRvIGhhbmRsZSB0aGlzIFVSTCwgb3IgcmV0dXJuIFxjb2Rle05vbmV9IGlmIHlvdSBjYW4ndCBidXQKK2Fub3RoZXIgaGFuZGxlciBtaWdodC4KIAogXGJlZ2lue25vdGljZX0KICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzdHJpY3RseQpAQCAtNDc4LDYgKzU3MiwxNSBAQAogXGVuZHttZXRob2RkZXNjfQogCiAKK1xzdWJzZWN0aW9ue0hUVFBDb29raWVQcm9jZXNzb3IgT2JqZWN0cyBcbGFiZWx7aHR0cC1jb29raWUtcHJvY2Vzc29yfX0KKworXGNsYXNze0hUVFBDb29raWVQcm9jZXNzb3J9IGluc3RhbmNlcyBoYXZlIG9uZSBhdHRyaWJ1dGU6CisKK1xiZWdpbnttZW1iZXJkZXNjfXtjb29raWVqYXJ9CitUaGUgXGNsYXNze2Nvb2tpZWxpYi5Db29raWVKYXJ9IGluIHdoaWNoIGNvb2tpZXMgYXJlIHN0b3JlZC4KK1xlbmR7bWVtYmVyZGVzY30KKworCiBcc3Vic2VjdGlvbntQcm94eUhhbmRsZXIgT2JqZWN0cyBcbGFiZWx7cHJveHktaGFuZGxlcn19CiAKIFxiZWdpbnttZXRob2RkZXNjbml9W1Byb3h5SGFuZGxlcl17XHZhcntwcm90b2NvbH1fb3Blbn17cmVxdWVzdH0KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleAppbmRleCBiY2I5MTM0Li5hMzk0OTcxIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CkBAIC01NjksNiArNTY5LDI1IEBACiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogJSB3aG9sZSBuZXcgbW9kdWxlcyBnZXQgZGVzY3JpYmVkIGluIFxzdWJzZWN0aW9ucyBoZXJlCiAKK1xzdWJzZWN0aW9ue2Nvb2tpZWxpYn0KKworVGhlIFxtb2R1bGV7Y29va2llbGlifSBsaWJyYXJ5IHN1cHBvcnRzIGNsaWVudC1zaWRlIGhhbmRsaW5nIGZvciBIVFRQCitjb29raWVzLCBqdXN0IGFzIHRoZSBcbW9kdWxle0Nvb2tpZX0gcHJvdmlkZXMgc2VydmVyLXNpZGUgY29va2llCitzdXBwb3J0IGluIENHSSBzY3JpcHRzLiBUaGlzIGxpYnJhcnkgbWFuYWdlcyBjb29raWVzIGluIGEgd2F5IHNpbWlsYXIKK3RvIHdlYiBicm93c2Vycy4gQ29va2llcyBhcmUgc3RvcmVkIGluIGNvb2tpZSBqYXJzOyB0aGUgbGlicmFyeQordHJhbnNwYXJlbnRseSBzdG9yZXMgY29va2llcyBvZmZlcmVkIGJ5IHRoZSB3ZWIgc2VydmVyIGluIHRoZSBjb29raWUKK2phciwgYW5kIGZldGNoZXMgdGhlIGNvb2tpZSBmcm9tIHRoZSBqYXIgd2hlbiBjb25uZWN0aW5nIHRvIHRoZQorc2VydmVyLiBTaW1pbGFyIHRvIHdlYiBicm93c2VycywgcG9saWN5IG9iamVjdHMgY29udHJvbCB3aGV0aGVyCitjb29raWVzIGFyZSBhY2NlcHRlZCBvciBub3QuCisKK0luIG9yZGVyIHRvIHN0b3JlIGNvb2tpZXMgYWNyb3NzIHNlc3Npb25zLCB0d28gaW1wbGVtZW50YXRpb25zIG9mCitjb29raWUgamFycyBhcmUgcHJvdmlkZWQ6IG9uZSB0aGF0IHN0b3JlcyBjb29raWVzIGluIHRoZSBOZXRzY2FwZQorZm9ybWF0LCBzbyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGUgTW96aWxsYSBvciBMeW54IGNvb2tpZSBqYXJzLCBhbmQKK29uZSB0aGF0IHN0b3JlcyBjb29raWVzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgUGVybCBsaWJ3d3cgbGliYXJ5LgorCitcbW9kdWxle3VybGxpYjJ9IGhhcyBiZWVuIGNoYW5nZWQgdG8gaW50ZXJhY3Qgd2l0aCBcbW9kdWxle2Nvb2tpZWxpYn06CitcY2xhc3N7SFRUUENvb2tpZVByb2Nlc3Nvcn0gbWFuYWdlcyBhIGNvb2tpZSBqYXIgdGhhdCBpcyB1c2VkIHdoZW4KK2FjY2Vzc2luZyBVUkxzLgogCiAlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzfQpkaWZmIC0tZ2l0IGEvTGliL19MV1BDb29raWVKYXIucHkgYi9MaWIvX0xXUENvb2tpZUphci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI4M2E2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL19MV1BDb29raWVKYXIucHkKQEAgLTAsMCArMSwxNzEgQEAKKyIiIkxvYWQgLyBzYXZlIHRvIGxpYnd3dy1wZXJsIChMV1ApIGZvcm1hdCBmaWxlcy4KKworQWN0dWFsbHksIHRoZSBmb3JtYXQgaXMgc2xpZ2h0bHkgZXh0ZW5kZWQgZnJvbSB0aGF0IHVzZWQgYnkgTFdQJ3MKKyhsaWJ3d3ctcGVybCdzKSBIVFRQOjpDb29raWVzLCB0byBhdm9pZCBsb3Npbmcgc29tZSBSRkMgMjk2NSBpbmZvcm1hdGlvbgorbm90IHJlY29yZGVkIGJ5IExXUC4KKworSXQgdXNlcyB0aGUgdmVyc2lvbiBzdHJpbmcgIjIuMCIsIHRob3VnaCByZWFsbHkgdGhlcmUgaXNuJ3QgYW4gTFdQIENvb2tpZXMKKzIuMCBmb3JtYXQuICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGV4dHJhIGluZm9ybWF0aW9uIGluIGhlcmUKKyhkb21haW5fZG90IGFuZCAjIHBvcnRfc3BlYykgd2hpbGUgc3RpbGwgYmVpbmcgY29tcGF0aWJsZSB3aXRoCitsaWJ3d3ctcGVybCwgSSBob3BlLgorCisiIiIKKworaW1wb3J0IHRpbWUsIHJlLCBsb2dnaW5nCitmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zLCBGaWxlQ29va2llSmFyLCBDb29raWUsIFwKKyAgICAgTUlTU0lOR19GSUxFTkFNRV9URVhULCBqb2luX2hlYWRlcl93b3Jkcywgc3BsaXRfaGVhZGVyX3dvcmRzLCBcCisgICAgIGlzbzJ0aW1lLCB0aW1lMmlzb3oKKworZGVmIGx3cF9jb29raWVfc3RyKGNvb2tpZSk6CisgICAgIiIiUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDb29raWUgaW4gYW4gdGhlIExXUCBjb29raWUgZmlsZSBmb3JtYXQuCisKKyAgICBBY3R1YWxseSwgdGhlIGZvcm1hdCBpcyBleHRlbmRlZCBhIGJpdCAtLSBzZWUgbW9kdWxlIGRvY3N0cmluZy4KKworICAgICIiIgorICAgIGggPSBbKGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpLAorICAgICAgICAgKCJwYXRoIiwgY29va2llLnBhdGgpLAorICAgICAgICAgKCJkb21haW4iLCBjb29raWUuZG9tYWluKV0KKyAgICBpZiBjb29raWUucG9ydCBpcyBub3QgTm9uZTogaC5hcHBlbmQoKCJwb3J0IiwgY29va2llLnBvcnQpKQorICAgIGlmIGNvb2tpZS5wYXRoX3NwZWNpZmllZDogaC5hcHBlbmQoKCJwYXRoX3NwZWMiLCBOb25lKSkKKyAgICBpZiBjb29raWUucG9ydF9zcGVjaWZpZWQ6IGguYXBwZW5kKCgicG9ydF9zcGVjIiwgTm9uZSkpCisgICAgaWYgY29va2llLmRvbWFpbl9pbml0aWFsX2RvdDogaC5hcHBlbmQoKCJkb21haW5fZG90IiwgTm9uZSkpCisgICAgaWYgY29va2llLnNlY3VyZTogaC5hcHBlbmQoKCJzZWN1cmUiLCBOb25lKSkKKyAgICBpZiBjb29raWUuZXhwaXJlczogaC5hcHBlbmQoKCJleHBpcmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMmlzb3ooZmxvYXQoY29va2llLmV4cGlyZXMpKSkpCisgICAgaWYgY29va2llLmRpc2NhcmQ6IGguYXBwZW5kKCgiZGlzY2FyZCIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5jb21tZW50OiBoLmFwcGVuZCgoImNvbW1lbnQiLCBjb29raWUuY29tbWVudCkpCisgICAgaWYgY29va2llLmNvbW1lbnRfdXJsOiBoLmFwcGVuZCgoImNvbW1lbnR1cmwiLCBjb29raWUuY29tbWVudF91cmwpKQorCisgICAga2V5cyA9IGNvb2tpZS5fcmVzdC5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgIGZvciBrIGluIGtleXM6CisgICAgICAgIGguYXBwZW5kKChrLCBzdHIoY29va2llLl9yZXN0W2tdKSkpCisKKyAgICBoLmFwcGVuZCgoInZlcnNpb24iLCBzdHIoY29va2llLnZlcnNpb24pKSkKKworICAgIHJldHVybiBqb2luX2hlYWRlcl93b3JkcyhbaF0pCisKK2NsYXNzIExXUENvb2tpZUphcihGaWxlQ29va2llSmFyKToKKyAgICAiIiIKKyAgICBUaGUgTFdQQ29va2llSmFyIHNhdmVzIGEgc2VxdWVuY2Ugb2YiU2V0LUNvb2tpZTMiIGxpbmVzLgorICAgICJTZXQtQ29va2llMyIgaXMgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBsaWJ3d3ctcGVybCBsaWJhcnksIG5vdCBrbm93bgorICAgIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgYnJvd3NlciwgYnV0IHdoaWNoIGlzIGVhc3kgdG8gcmVhZCBhbmQKKyAgICBkb2Vzbid0IGxvc2UgaW5mb3JtYXRpb24gYWJvdXQgUkZDIDI5NjUgY29va2llcy4KKworICAgIEFkZGl0aW9uYWwgbWV0aG9kcworCisgICAgYXNfbHdwX3N0cihpZ25vcmVfZGlzY2FyZD1UcnVlLCBpZ25vcmVfZXhwaXJlZD1UcnVlKQorCisgICAgIiIiCisKKyAgICBkZWYgYXNfbHdwX3N0cihzZWxmLCBpZ25vcmVfZGlzY2FyZD1UcnVlLCBpZ25vcmVfZXhwaXJlcz1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIGNvb2tpZXMgYXMgYSBzdHJpbmcgb2YgIlxuIi1zZXBhcmF0ZWQgIlNldC1Db29raWUzIiBoZWFkZXJzLgorCisgICAgICAgIGlnbm9yZV9kaXNjYXJkIGFuZCBpZ25vcmVfZXhwaXJlczogc2VlIGRvY3N0cmluZyBmb3IgRmlsZUNvb2tpZUphci5zYXZlCisKKyAgICAgICAgIiIiCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHIgPSBbXQorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6CisgICAgICAgICAgICBpZiBub3QgaWdub3JlX2Rpc2NhcmQgYW5kIGNvb2tpZS5kaXNjYXJkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgaWdub3JlX2V4cGlyZXMgYW5kIGNvb2tpZS5pc19leHBpcmVkKG5vdyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHIuYXBwZW5kKCJTZXQtQ29va2llMzogJXMiICUgbHdwX2Nvb2tpZV9zdHIoY29va2llKSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyK1siIl0pCisKKyAgICBkZWYgc2F2ZShzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZTogZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICAgICBlbHNlOiByYWlzZSBWYWx1ZUVycm9yKE1JU1NJTkdfRklMRU5BTUVfVEVYVCkKKworICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRoZXJlIHJlYWxseSBpc24ndCBhbiBMV1AgQ29va2llcyAyLjAgZm9ybWF0LCBidXQgdGhpcyBpbmRpY2F0ZXMKKyAgICAgICAgICAgICMgdGhhdCB0aGVyZSBpcyBleHRyYSBpbmZvcm1hdGlvbiBpbiBoZXJlIChkb21haW5fZG90IGFuZAorICAgICAgICAgICAgIyBwb3J0X3NwZWMpIHdoaWxlIHN0aWxsIGJlaW5nIGNvbXBhdGlibGUgd2l0aCBsaWJ3d3ctcGVybCwgSSBob3BlLgorICAgICAgICAgICAgZi53cml0ZSgiI0xXUC1Db29raWVzLTIuMFxuIikKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5hc19sd3Bfc3RyKGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBfcmVhbGx5X2xvYWQoc2VsZiwgZiwgZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcyk6CisgICAgICAgIG1hZ2ljID0gZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCByZS5zZWFyY2goc2VsZi5tYWdpY19yZSwgbWFnaWMpOgorICAgICAgICAgICAgbXNnID0gIiVzIGRvZXMgbm90IHNlZW0gdG8gY29udGFpbiBjb29raWVzIiAlIGZpbGVuYW1lCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKG1zZykKKworICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIGhlYWRlciA9ICJTZXQtQ29va2llMzoiCisgICAgICAgIGJvb2xlYW5fYXR0cnMgPSAoInBvcnRfc3BlYyIsICJwYXRoX3NwZWMiLCAiZG9tYWluX2RvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY3VyZSIsICJkaXNjYXJkIikKKyAgICAgICAgdmFsdWVfYXR0cnMgPSAoInZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICJwYXRoIiwgImRvbWFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBpcmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbW1lbnQiLCAiY29tbWVudHVybCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAiIjogYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKGhlYWRlcik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbGVuKGhlYWRlcik6XS5zdHJpcCgpCisKKyAgICAgICAgICAgICAgICBmb3IgZGF0YSBpbiBzcGxpdF9oZWFkZXJfd29yZHMoW2xpbmVdKToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBkYXRhWzBdCisgICAgICAgICAgICAgICAgICAgICMgbmFtZSBhbmQgdmFsdWUgYXJlIGFuIGV4Y2VwdGlvbiBoZXJlLCBzaW5jZSBhIHBsYWluICJmb28iCisgICAgICAgICAgICAgICAgICAgICMgKHdpdGggbm8gIj0iLCB1bmxpa2UgImJhcj1mb28iKSBtZWFucyBhIGNvb2tpZSB3aXRoIG5vCisgICAgICAgICAgICAgICAgICAgICMgbmFtZSBhbmQgdmFsdWUgImZvbyIuICBXaXRoIGFsbCBvdGhlciBjb29raWUtYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2l0dWF0aW9uIGlzIHJldmVyc2VkOiAiZm9vIiBtZWFucyBhbiBhdHRyaWJ1dGUgbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgIyAiZm9vIiB3aXRoIG5vIHZhbHVlIQorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSB2YWx1ZSwgbmFtZQorICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IHt9CisgICAgICAgICAgICAgICAgICAgIHJlc3QgPSB7fQorICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkYXRhWzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBrLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGxvc2UgY2FzZSBkaXN0aW5jdGlvbiBmb3IgdW5rbm93biBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYyBpbiB2YWx1ZV9hdHRycykgb3IgKGxjIGluIGJvb2xlYW5fYXR0cnMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBsYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZTogdiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgayBpbiB2YWx1ZV9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdFtrXSA9IHYKKworICAgICAgICAgICAgICAgICAgICBoID0gc3RhbmRhcmQuZ2V0CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBoKCJleHBpcmVzIikKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCA9IGgoImRpc2NhcmQiKQorICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IGlzbzJ0aW1lKGV4cGlyZXMpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGgoImRvbWFpbiIpCisgICAgICAgICAgICAgICAgICAgIGRvbWFpbl9zcGVjaWZpZWQgPSBkb21haW4uc3RhcnRzd2l0aCgiLiIpCisgICAgICAgICAgICAgICAgICAgIGMgPSBDb29raWUoaCgidmVyc2lvbiIpLCBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJwb3J0IiksIGgoInBvcnRfc3BlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgaCgiZG9tYWluX2RvdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoInBhdGgiKSwgaCgicGF0aF9zcGVjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgic2VjdXJlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoImNvbW1lbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJjb21tZW50dXJsIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2V4cGlyZXMgYW5kIGMuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucygoSU9FcnJvciwpKQorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiaW52YWxpZCBTZXQtQ29va2llMyBmb3JtYXQgZmlsZSAlcyIgJSBmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi9fTW96aWxsYUNvb2tpZUphci5weSBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFhODc5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CkBAIC0wLDAgKzEsMTQ1IEBACisiIiJNb3ppbGxhIC8gTmV0c2NhcGUgY29va2llIGxvYWRpbmcgLyBzYXZpbmcuIiIiCisKK2ltcG9ydCByZSwgdGltZSwgbG9nZ2luZworCitmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zLCBGaWxlQ29va2llSmFyLCBDb29raWUsIFwKKyAgICAgTUlTU0lOR19GSUxFTkFNRV9URVhUCisKK2NsYXNzIE1vemlsbGFDb29raWVKYXIoRmlsZUNvb2tpZUphcik6CisgICAgIiIiCisKKyAgICBXQVJOSU5HOiB5b3UgbWF5IHdhbnQgdG8gYmFja3VwIHlvdXIgYnJvd3NlcidzIGNvb2tpZXMgZmlsZSBpZiB5b3UgdXNlCisgICAgdGhpcyBjbGFzcyB0byBzYXZlIGNvb2tpZXMuICBJICp0aGluayogaXQgd29ya3MsIGJ1dCB0aGVyZSBoYXZlIGJlZW4KKyAgICBidWdzIGluIHRoZSBwYXN0IQorCisgICAgVGhpcyBjbGFzcyBkaWZmZXJzIGZyb20gQ29va2llSmFyIG9ubHkgaW4gdGhlIGZvcm1hdCBpdCB1c2VzIHRvIHNhdmUgYW5kCisgICAgbG9hZCBjb29raWVzIHRvIGFuZCBmcm9tIGEgZmlsZS4gIFRoaXMgY2xhc3MgdXNlcyB0aGUgTW96aWxsYS9OZXRzY2FwZQorICAgIGBjb29raWVzLnR4dCcgZm9ybWF0LiAgbHlueCB1c2VzIHRoaXMgZmlsZSBmb3JtYXQsIHRvby4KKworICAgIERvbid0IGV4cGVjdCBjb29raWVzIHNhdmVkIHdoaWxlIHRoZSBicm93c2VyIGlzIHJ1bm5pbmcgdG8gYmUgbm90aWNlZCBieQorICAgIHRoZSBicm93c2VyIChpbiBmYWN0LCBNb3ppbGxhIG9uIHVuaXggd2lsbCBvdmVyd3JpdGUgeW91ciBzYXZlZCBjb29raWVzIGlmCisgICAgeW91IGNoYW5nZSB0aGVtIG9uIGRpc2sgd2hpbGUgaXQncyBydW5uaW5nOyBvbiBXaW5kb3dzLCB5b3UgcHJvYmFibHkgY2FuJ3QKKyAgICBzYXZlIGF0IGFsbCB3aGlsZSB0aGUgYnJvd3NlciBpcyBydW5uaW5nKS4KKworICAgIE5vdGUgdGhhdCB0aGUgTW96aWxsYS9OZXRzY2FwZSBmb3JtYXQgd2lsbCBkb3duZ3JhZGUgUkZDMjk2NSBjb29raWVzIHRvCisgICAgTmV0c2NhcGUgY29va2llcyBvbiBzYXZpbmcuCisKKyAgICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29va2llIHZlcnNpb24gYW5kIHBvcnQgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGxvc3QsCisgICAgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIG9yIG5vdCBQYXRoLCBQb3J0IGFuZCBEaXNjYXJkIHdlcmUKKyAgICBzcGVjaWZpZWQgYnkgdGhlIFNldC1Db29raWUyIChvciBTZXQtQ29va2llKSBoZWFkZXIsIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICBkb21haW4gYXMgc2V0IGluIHRoZSBIVFRQIGhlYWRlciBzdGFydGVkIHdpdGggYSBkb3QgKHllcywgSSdtIGF3YXJlIHNvbWUKKyAgICBkb21haW5zIGluIE5ldHNjYXBlIGZpbGVzIHN0YXJ0IHdpdGggYSBkb3QgYW5kIHNvbWUgZG9uJ3QgLS0gdHJ1c3QgbWUsIHlvdQorICAgIHJlYWxseSBkb24ndCB3YW50IHRvIGtub3cgYW55IG1vcmUgYWJvdXQgdGhpcykuCisKKyAgICBOb3RlIHRoYXQgdGhvdWdoIE1vemlsbGEgYW5kIE5ldHNjYXBlIHVzZSB0aGUgc2FtZSBmb3JtYXQsIHRoZXkgdXNlCisgICAgc2xpZ2h0bHkgZGlmZmVyZW50IGhlYWRlcnMuICBUaGUgY2xhc3Mgc2F2ZXMgY29va2llcyB1c2luZyB0aGUgTmV0c2NhcGUKKyAgICBoZWFkZXIgYnkgZGVmYXVsdCAoTW96aWxsYSBjYW4gY29wZSB3aXRoIHRoYXQpLgorCisgICAgIiIiCisgICAgbWFnaWNfcmUgPSAiIyggTmV0c2NhcGUpPyBIVFRQIENvb2tpZSBGaWxlIgorICAgIGhlYWRlciA9ICIiIlwKKyAgICAjIE5ldHNjYXBlIEhUVFAgQ29va2llIEZpbGUKKyAgICAjIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWwKKyAgICAjIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSEgIERvIG5vdCBlZGl0LgorCisiIiIKKworICAgIGRlZiBfcmVhbGx5X2xvYWQoc2VsZiwgZiwgZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcyk6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisKKyAgICAgICAgbWFnaWMgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHJlLnNlYXJjaChzZWxmLm1hZ2ljX3JlLCBtYWdpYyk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IGxvb2sgbGlrZSBhIE5ldHNjYXBlIGZvcm1hdCBjb29raWVzIGZpbGUiICUKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOiBicmVhaworCisgICAgICAgICAgICAgICAgIyBsYXN0IGZpZWxkIG1heSBiZSBhYnNlbnQsIHNvIGtlZXAgYW55IHRyYWlsaW5nIHRhYgorICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIlxuIik6IGxpbmUgPSBsaW5lWzotMV0KKworICAgICAgICAgICAgICAgICMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgWFhYIHdoYXQgaXMgJCBmb3I/CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIjIikgb3IKKyAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoIiQiKSBvcgorICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkgPT0gIiIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBwYXRoLCBzZWN1cmUsIGV4cGlyZXMsIG5hbWUsIHZhbHVlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zcGxpdCgiXHQiKQorICAgICAgICAgICAgICAgIHNlY3VyZSA9IChzZWN1cmUgPT0gIlRSVUUiKQorICAgICAgICAgICAgICAgIGRvbWFpbl9zcGVjaWZpZWQgPSAoZG9tYWluX3NwZWNpZmllZCA9PSAiVFJVRSIpCisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQorCisgICAgICAgICAgICAgICAgaW5pdGlhbF9kb3QgPSBkb21haW4uc3RhcnRzd2l0aCgiLiIpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGRvbWFpbl9zcGVjaWZpZWQgPT0gaW5pdGlhbF9kb3QKKworICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIGV4cGlyZXMgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisKKyAgICAgICAgICAgICAgICAjIGFzc3VtZSBwYXRoX3NwZWNpZmllZCBpcyBmYWxzZQorICAgICAgICAgICAgICAgIGMgPSBDb29raWUoMCwgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgaW5pdGlhbF9kb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2Rpc2NhcmQgYW5kIGMuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2V4cGlyZXMgYW5kIGMuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjKQorCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucygoSU9FcnJvciwpKQorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiaW52YWxpZCBOZXRzY2FwZSBmb3JtYXQgZmlsZSAlczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCBsaW5lKSkKKworICAgIGRlZiBzYXZlKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5oZWFkZXIpCisgICAgICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGlzY2FyZCBhbmQgY29va2llLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjb29raWUuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5zZWN1cmU6IHNlY3VyZSA9ICJUUlVFIgorICAgICAgICAgICAgICAgIGVsc2U6IHNlY3VyZSA9ICJGQUxTRSIKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuZG9tYWluLnN0YXJ0c3dpdGgoIi4iKTogaW5pdGlhbF9kb3QgPSAiVFJVRSIKKyAgICAgICAgICAgICAgICBlbHNlOiBpbml0aWFsX2RvdCA9ICJGQUxTRSIKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuZXhwaXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IHN0cihjb29raWUuZXhwaXJlcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gIiIKKyAgICAgICAgICAgICAgICBpZiBjb29raWUudmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBjb29raWVzLnR4dCByZWdhcmRzICdTZXQtQ29va2llOiBmb28nIGFzIGEgY29va2llCisgICAgICAgICAgICAgICAgICAgICMgd2l0aCBubyBuYW1lLCB3aGVyZWFzIGNvb2tpZWxpYiByZWdhcmRzIGl0IGFzIGEKKyAgICAgICAgICAgICAgICAgICAgIyBjb29raWUgd2l0aCBubyB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29va2llLm5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gY29va2llLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb29raWUudmFsdWUKKyAgICAgICAgICAgICAgICBmLndyaXRlKAorICAgICAgICAgICAgICAgICAgICAiXHQiLmpvaW4oW2Nvb2tpZS5kb21haW4sIGluaXRpYWxfZG90LCBjb29raWUucGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsIGV4cGlyZXMsIG5hbWUsIHZhbHVlXSkrCisgICAgICAgICAgICAgICAgICAgICJcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0xpYi9jb29raWVsaWIucHkgYi9MaWIvY29va2llbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Mjg4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY29va2llbGliLnB5CkBAIC0wLDAgKzEsMTc1NiBAQAorIiIiSFRUUCBjb29raWUgaGFuZGxpbmcgZm9yIHdlYiBjbGllbnRzLgorCitUaGlzIG1vZHVsZSBoYXMgKG5vdyBmYWlybHkgZGlzdGFudCkgb3JpZ2lucyBpbiBHaXNsZSBBYXMnIFBlcmwgbW9kdWxlCitIVFRQOjpDb29raWVzLCBmcm9tIHRoZSBsaWJ3d3ctcGVybCBsaWJyYXJ5LgorCitEb2NzdHJpbmdzLCBjb21tZW50cyBhbmQgZGVidWcgc3RyaW5ncyBpbiB0aGlzIGNvZGUgcmVmZXIgdG8gdGhlCithdHRyaWJ1dGVzIG9mIHRoZSBIVFRQIGNvb2tpZSBzeXN0ZW0gYXMgY29va2llLWF0dHJpYnV0ZXMsIHRvIGRpc3Rpbmd1aXNoCit0aGVtIGNsZWFybHkgZnJvbSBQeXRob24gYXR0cmlidXRlcy4KKworQ2xhc3MgZGlhZ3JhbSAobm90ZSB0aGF0IHRoZSBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZXJpdmUgZnJvbQorRmlsZUNvb2tpZUphciBhcmUgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LCBidXQKK2FyZSBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3c2VhcmNoLnNmLm5ldC8pOgorCisgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVKYXJfX19fCisgICAgICAgICAgICAgICAgICAgICAgICAvICAgICBcICAgICAgXAorICAgICAgICAgICAgRmlsZUNvb2tpZUphciAgICAgIFwgICAgICBcCisgICAgICAgICAgICAgLyAgICB8ICAgXCAgICAgICAgIFwgICAgICBcCisgTW96aWxsYUNvb2tpZUphciB8IExXUENvb2tpZUphciBcICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICBcCisgICAgICAgICAgICAgICAgICB8ICAgLS0tTVNJRUJhc2UgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICB8ICAvICAgICAgfCAgICAgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAvICAgTVNJRURCQ29va2llSmFyIEJTRERCQ29va2llSmFyCisgICAgICAgICAgICAgICAgICB8LworICAgICAgICAgICAgICAgTVNJRUNvb2tpZUphcgorCisiIiIKKworaW1wb3J0IHN5cywgcmUsIHVybHBhcnNlLCBjb3B5LCB0aW1lLCBzdHJ1Y3QsIHVybGxpYiwgdHlwZXMsIGxvZ2dpbmcKK2Zyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGVzCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZyBhcyBfdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyBfdGhyZWFkaW5nCitpbXBvcnQgaHR0cGxpYiAgIyBvbmx5IGZvciB0aGUgZGVmYXVsdCBIVFRQIHBvcnQKK2Zyb20gY2FsZW5kYXIgaW1wb3J0IHRpbWVnbQorCitsb2dnaW5nLmdldExvZ2dlcigiY29va2llbGliIikuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKSkKK2RlYnVnID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvb2tpZWxpYiIpLmRlYnVnCisKK0RFRkFVTFRfSFRUUF9QT1JUID0gc3RyKGh0dHBsaWIuSFRUUF9QT1JUKQorTUlTU0lOR19GSUxFTkFNRV9URVhUID0gKCJhIGZpbGVuYW1lIHdhcyBub3Qgc3VwcGxpZWQgKG5vciB3YXMgdGhlIENvb2tpZUphciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIGluaXRpYWxpc2VkIHdpdGggb25lKSIpCisKK2RlZiByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnModW5tYXNrZWQ9KCkpOgorICAgICMgVGhlcmUgYXJlIGEgZmV3IGNhdGNoLWFsbCBleGNlcHQ6IHN0YXRlbWVudHMgaW4gdGhpcyBtb2R1bGUsIGZvcgorICAgICMgY2F0Y2hpbmcgaW5wdXQgdGhhdCdzIGJhZCBpbiB1bmV4cGVjdGVkIHdheXMuCisgICAgIyBUaGlzIGZ1bmN0aW9uIHJlLXJhaXNlcyBzb21lIGV4Y2VwdGlvbnMgd2UgZG9uJ3Qgd2FudCB0byB0cmFwLgorICAgIHVubWFza2VkID0gdW5tYXNrZWQgKyAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQsIE1lbW9yeUVycm9yKQorICAgIGV0eXBlID0gc3lzLmV4Y19pbmZvKClbMF0KKyAgICBpZiBpc3N1YmNsYXNzKGV0eXBlLCB1bm1hc2tlZCk6CisgICAgICAgIHJhaXNlCisgICAgIyBzd2FsbG93ZWQgYW4gZXhjZXB0aW9uCisgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgd2FybmluZ3Mud2FybigiY29va2llbGliIGJ1ZyEiLCBzdGFja2xldmVsPTIpCisgICAgaW1wb3J0IHRyYWNlYmFjaworICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorCisKKyMgRGF0ZS90aW1lIGNvbnZlcnNpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBPQ0hfWUVBUiA9IDE5NzAKK2RlZiBfdGltZWdtKHR0KToKKyAgICB5ZWFyLCBtb250aCwgbWRheSwgaG91ciwgbWluLCBzZWMgPSB0dFs6Nl0KKyAgICBpZiAoKHllYXIgPj0gRVBPQ0hfWUVBUikgYW5kICgxIDw9IG1vbnRoIDw9IDEyKSBhbmQgKDEgPD0gbWRheSA8PSAzMSkgYW5kCisgICAgICAgICgwIDw9IGhvdXIgPD0gMjQpIGFuZCAoMCA8PSBtaW4gPD0gNTkpIGFuZCAoMCA8PSBzZWMgPD0gNjEpKToKKyAgICAgICAgcmV0dXJuIHRpbWVnbSh0dCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCitEQVlTID0gWyJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iXQorTU9OVEhTID0gWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIl0KK01PTlRIU19MT1dFUiA9IFtdCitmb3IgbW9udGggaW4gTU9OVEhTOiBNT05USFNfTE9XRVIuYXBwZW5kKG1vbnRoLmxvd2VyKCkpCisKK2RlZiB0aW1lMmlzb3oodD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCwgdC4KKworICAgIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgaXQgd2lsbCB1c2UgdGhlIGN1cnJlbnQKKyAgICB0aW1lLgorCisgICAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGxpa2UgIllZWVktTU0tREQgaGg6bW06c3NaIiwKKyAgICByZXByZXNlbnRpbmcgVW5pdmVyc2FsIFRpbWUgKFVUQywgYWthIEdNVCkuICBBbiBleGFtcGxlIG9mIHRoaXMgZm9ybWF0IGlzOgorCisgICAgMTk5NC0xMS0yNCAwODo0OTozN1oKKworICAgICIiIgorICAgIGlmIHQgaXMgTm9uZTogdCA9IHRpbWUudGltZSgpCisgICAgeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYyA9IHRpbWUuZ210aW1lKHQpWzo2XQorICAgIHJldHVybiAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRaIiAlICgKKyAgICAgICAgeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYykKKworZGVmIHRpbWUybmV0c2NhcGUodD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCwgdC4KKworICAgIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgaXQgd2lsbCB1c2UgdGhlIGN1cnJlbnQKKyAgICB0aW1lLgorCisgICAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGxpa2UgdGhpczoKKworICAgIFdlZCwgREQtTW9uLVlZWVkgSEg6TU06U1MgR01UCisKKyAgICAiIiIKKyAgICBpZiB0IGlzIE5vbmU6IHQgPSB0aW1lLnRpbWUoKQorICAgIHllYXIsIG1vbiwgbWRheSwgaG91ciwgbWluLCBzZWMsIHdkYXkgPSB0aW1lLmdtdGltZSh0KVs6N10KKyAgICByZXR1cm4gIiVzICUwMmQtJXMtJTA0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICBEQVlTW3dkYXldLCBtZGF5LCBNT05USFNbbW9uLTFdLCB5ZWFyLCBob3VyLCBtaW4sIHNlYykKKworCitVVENfWk9ORVMgPSB7IkdNVCI6IE5vbmUsICJVVEMiOiBOb25lLCAiVVQiOiBOb25lLCAiWiI6IE5vbmV9CisKK1RJTUVaT05FX1JFID0gcmUuY29tcGlsZShyIl4oWy0rXSk/KFxkXGQ/KTo/KFxkXGQpPyQiKQorZGVmIG9mZnNldF9mcm9tX3R6X3N0cmluZyh0eik6CisgICAgb2Zmc2V0ID0gTm9uZQorICAgIGlmIHR6IGluIFVUQ19aT05FUzoKKyAgICAgICAgb2Zmc2V0ID0gMAorICAgIGVsc2U6CisgICAgICAgIG0gPSBUSU1FWk9ORV9SRS5zZWFyY2godHopCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBvZmZzZXQgPSAzNjAwICogaW50KG0uZ3JvdXAoMikpCisgICAgICAgICAgICBpZiBtLmdyb3VwKDMpOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDYwICogaW50KG0uZ3JvdXAoMykpCisgICAgICAgICAgICBpZiBtLmdyb3VwKDEpID09ICctJzoKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0CisgICAgcmV0dXJuIG9mZnNldAorCitkZWYgX3N0cjJ0aW1lKGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eik6CisgICAgIyB0cmFuc2xhdGUgbW9udGggbmFtZSB0byBudW1iZXIKKyAgICAjIG1vbnRoIG51bWJlcnMgc3RhcnQgd2l0aCAxIChKYW51YXJ5KQorICAgIHRyeToKKyAgICAgICAgbW9uID0gTU9OVEhTX0xPV0VSLmluZGV4KG1vbi5sb3dlcigpKSsxCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICMgbWF5YmUgaXQncyBhbHJlYWR5IGEgbnVtYmVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltb24gPSBpbnQobW9uKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIDEgPD0gaW1vbiA8PSAxMjoKKyAgICAgICAgICAgIG1vbiA9IGltb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIG1ha2Ugc3VyZSBjbG9jayBlbGVtZW50cyBhcmUgZGVmaW5lZAorICAgIGlmIGhyIGlzIE5vbmU6IGhyID0gMAorICAgIGlmIG1pbiBpcyBOb25lOiBtaW4gPSAwCisgICAgaWYgc2VjIGlzIE5vbmU6IHNlYyA9IDAKKworICAgIHlyID0gaW50KHlyKQorICAgIGRheSA9IGludChkYXkpCisgICAgaHIgPSBpbnQoaHIpCisgICAgbWluID0gaW50KG1pbikKKyAgICBzZWMgPSBpbnQoc2VjKQorCisgICAgaWYgeXIgPCAxMDAwOgorICAgICAgICAjIGZpbmQgIm9idmlvdXMiIHllYXIKKyAgICAgICAgY3VyX3lyID0gdGltZS5sb2NhbHRpbWUodGltZS50aW1lKCkpWzBdCisgICAgICAgIG0gPSBjdXJfeXIgJSAxMDAKKyAgICAgICAgdG1wID0geXIKKyAgICAgICAgeXIgPSB5ciArIGN1cl95ciAtIG0KKyAgICAgICAgbSA9IG0gLSB0bXAKKyAgICAgICAgaWYgYWJzKG0pID4gNTA6CisgICAgICAgICAgICBpZiBtID4gMDogeXIgPSB5ciArIDEwMAorICAgICAgICAgICAgZWxzZTogeXIgPSB5ciAtIDEwMAorCisgICAgIyBjb252ZXJ0IFVUQyB0aW1lIHR1cGxlIHRvIHNlY29uZHMgc2luY2UgZXBvY2ggKG5vdCB0aW1lem9uZS1hZGp1c3RlZCkKKyAgICB0ID0gX3RpbWVnbSgoeXIsIG1vbiwgZGF5LCBociwgbWluLCBzZWMsIHR6KSkKKworICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgICMgYWRqdXN0IHRpbWUgdXNpbmcgdGltZXpvbmUgc3RyaW5nLCB0byBnZXQgYWJzb2x1dGUgdGltZSBzaW5jZSBlcG9jaAorICAgICAgICBpZiB0eiBpcyBOb25lOgorICAgICAgICAgICAgdHogPSAiVVRDIgorICAgICAgICB0eiA9IHR6LnVwcGVyKCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0X2Zyb21fdHpfc3RyaW5nKHR6KQorICAgICAgICBpZiBvZmZzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHQgPSB0IC0gb2Zmc2V0CisKKyAgICByZXR1cm4gdAorCitTVFJJQ1RfREFURV9SRSA9IHJlLmNvbXBpbGUoCisgICAgciJeW1NNVFdGXVthLXpdW2Etel0sIChcZFxkKSAoW0pGTUFTT05EXVthLXpdW2Etel0pICIKKyAgICAiKFxkXGRcZFxkKSAoXGRcZCk6KFxkXGQpOihcZFxkKSBHTVQkIikKK1dFRUtEQVlfUkUgPSByZS5jb21waWxlKAorICAgIHIiXig/OlN1bnxNb258VHVlfFdlZHxUaHV8RnJpfFNhdClbYS16XSosP1xzKiIsIHJlLkkpCitMT09TRV9IVFRQX0RBVEVfUkUgPSByZS5jb21waWxlKAorICAgIHIiIiJeCisgICAgKFxkXGQ/KSAgICAgICAgICAgICMgZGF5CisgICAgICAgKD86XHMrfFstXC9dKQorICAgIChcdyspICAgICAgICAgICAgICAjIG1vbnRoCisgICAgICAgICg/OlxzK3xbLVwvXSkKKyAgICAoXGQrKSAgICAgICAgICAgICAgIyB5ZWFyCisgICAgKD86CisgICAgICAgICAgKD86XHMrfDopICAgICMgc2VwYXJhdG9yIGJlZm9yZSBjbG9jaworICAgICAgIChcZFxkPyk6KFxkXGQpICAjIGhvdXI6bWluCisgICAgICAgKD86OihcZFxkKSk/ICAgICMgb3B0aW9uYWwgc2Vjb25kcworICAgICk/ICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIGNsb2NrCisgICAgICAgXHMqCisgICAgKFstK10/XGR7Miw0fXwoPyFbQVBhcF1bTW1dXGIpW0EtWmEtel0rKT8gIyB0aW1lem9uZQorICAgICAgIFxzKgorICAgICg/OlwoXHcrXCkpPyAgICAgICAjIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRpbWV6b25lIGluIHBhcmVucy4KKyAgICAgICBccyokIiIiLCByZS5YKQorZGVmIGh0dHAydGltZSh0ZXh0KToKKyAgICAiIiJSZXR1cm5zIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCBvZiB0aW1lIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nLgorCisgICAgUmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIuCisKKyAgICBOb25lIGlzIHJldHVybmVkIGlmIHRoZSBmb3JtYXQgb2Ygc3RyIGlzIHVucmVjb2duaXplZCwgdGhlIHRpbWUgaXMgb3V0c2lkZQorICAgIHRoZSByZXByZXNlbnRhYmxlIHJhbmdlLCBvciB0aGUgdGltZXpvbmUgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLiAgSWYgdGhlCisgICAgc3RyaW5nIGNvbnRhaW5zIG5vIHRpbWV6b25lLCBVVEMgaXMgYXNzdW1lZC4KKworICAgIFRoZSB0aW1lem9uZSBpbiB0aGUgc3RyaW5nIG1heSBiZSBudW1lcmljYWwgKGxpa2UgIi0wODAwIiBvciAiKzAxMDAiKSBvciBhCisgICAgc3RyaW5nIHRpbWV6b25lIChsaWtlICJVVEMiLCAiR01UIiwgIkJTVCIgb3IgIkVTVCIpLiAgQ3VycmVudGx5LCBvbmx5IHRoZQorICAgIHRpbWV6b25lIHN0cmluZ3MgZXF1aXZhbGVudCB0byBVVEMgKHplcm8gb2Zmc2V0KSBhcmUga25vd24gdG8gdGhlIGZ1bmN0aW9uLgorCisgICAgVGhlIGZ1bmN0aW9uIGxvb3NlbHkgcGFyc2VzIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKKworICAgIFdlZCwgMDkgRmViIDE5OTQgMjI6MjM6MzIgR01UICAgICAgIC0tIEhUVFAgZm9ybWF0CisgICAgVHVlc2RheSwgMDgtRmViLTk0IDE0OjE1OjI5IEdNVCAgICAgLS0gb2xkIHJmYzg1MCBIVFRQIGZvcm1hdAorICAgIFR1ZXNkYXksIDA4LUZlYi0xOTk0IDE0OjE1OjI5IEdNVCAgIC0tIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQKKyAgICAwOSBGZWIgMTk5NCAyMjoyMzozMiBHTVQgICAgICAgICAgICAtLSBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSkKKyAgICAwOC1GZWItOTQgMTQ6MTU6MjkgR01UICAgICAgICAgICAgICAtLSByZmM4NTAgZm9ybWF0IChubyB3ZWVrZGF5KQorICAgIDA4LUZlYi0xOTk0IDE0OjE1OjI5IEdNVCAgICAgICAgICAgIC0tIGJyb2tlbiByZmM4NTAgZm9ybWF0IChubyB3ZWVrZGF5KQorCisgICAgVGhlIHBhcnNlciBpZ25vcmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBUaGUgdGltZSBtYXkgYmUKKyAgICBhYnNlbnQuCisKKyAgICBJZiB0aGUgeWVhciBpcyBnaXZlbiB3aXRoIG9ubHkgMiBkaWdpdHMsIHRoZSBmdW5jdGlvbiB3aWxsIHNlbGVjdCB0aGUKKyAgICBjZW50dXJ5IHRoYXQgbWFrZXMgdGhlIHllYXIgY2xvc2VzdCB0byB0aGUgY3VycmVudCBkYXRlLgorCisgICAgIiIiCisgICAgIyBmYXN0IGV4aXQgZm9yIHN0cmljdGx5IGNvbmZvcm1pbmcgc3RyaW5nCisgICAgbSA9IFNUUklDVF9EQVRFX1JFLnNlYXJjaCh0ZXh0KQorICAgIGlmIG06CisgICAgICAgIGcgPSBtLmdyb3VwcygpCisgICAgICAgIG1vbiA9IE1PTlRIU19MT1dFUi5pbmRleChnWzFdLmxvd2VyKCkpICsgMQorICAgICAgICB0dCA9IChpbnQoZ1syXSksIG1vbiwgaW50KGdbMF0pLAorICAgICAgICAgICAgICBpbnQoZ1szXSksIGludChnWzRdKSwgZmxvYXQoZ1s1XSkpCisgICAgICAgIHJldHVybiBfdGltZWdtKHR0KQorCisgICAgIyBObywgd2UgbmVlZCBzb21lIG1lc3N5IHBhcnNpbmcuLi4KKworICAgICMgY2xlYW4gdXAKKyAgICB0ZXh0ID0gdGV4dC5sc3RyaXAoKQorICAgIHRleHQgPSBXRUVLREFZX1JFLnN1YigiIiwgdGV4dCwgMSkgICMgVXNlbGVzcyB3ZWVrZGF5CisKKyAgICAjIHR6IGlzIHRpbWUgem9uZSBzcGVjaWZpZXIgc3RyaW5nCisgICAgZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6ID0gW05vbmVdKjcKKworICAgICMgbG9vc2UgcmVnZXhwIHBhcnNlCisgICAgbSA9IExPT1NFX0hUVFBfREFURV9SRS5zZWFyY2godGV4dCkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICBkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHogPSBtLmdyb3VwcygpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUgICMgYmFkIGZvcm1hdAorCisgICAgcmV0dXJuIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopCisKK0lTT19EQVRFX1JFID0gcmUuY29tcGlsZSgKKyAgICAiIiJeCisgICAgKFxkezR9KSAgICAgICAgICAgICAgIyB5ZWFyCisgICAgICAgWy1cL10/CisgICAgKFxkXGQ/KSAgICAgICAgICAgICAgIyBudW1lcmljYWwgbW9udGgKKyAgICAgICBbLVwvXT8KKyAgICAoXGRcZD8pICAgICAgICAgICAgICAjIGRheQorICAgKD86CisgICAgICAgICAoPzpccyt8Wy06VHRdKSAgIyBzZXBhcmF0b3IgYmVmb3JlIGNsb2NrCisgICAgICAoXGRcZD8pOj8oXGRcZCkgICAgIyBob3VyOm1pbgorICAgICAgKD86Oj8oXGRcZCg/OlwuXGQqKT8pKT8gICMgb3B0aW9uYWwgc2Vjb25kcyAoYW5kIGZyYWN0aW9uYWwpCisgICApPyAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCBjbG9jaworICAgICAgXHMqCisgICAoWy0rXT9cZFxkPzo/KDo/XGRcZCk/CisgICAgfFp8eik/ICAgICAgICAgICAgICAgIyB0aW1lem9uZSAgKFogaXMgInplcm8gbWVyaWRpYW4iLCBpLmUuIEdNVCkKKyAgICAgIFxzKiQiIiIsIHJlLlgpCitkZWYgaXNvMnRpbWUodGV4dCk6CisgICAgIiIiCisgICAgQXMgZm9yIGh0dHAydGltZSwgYnV0IHBhcnNlcyB0aGUgSVNPIDg2MDEgZm9ybWF0czoKKworICAgIDE5OTQtMDItMDMgMTQ6MTU6MjkgLTAxMDAgICAgLS0gSVNPIDg2MDEgZm9ybWF0CisgICAgMTk5NC0wMi0wMyAxNDoxNToyOSAgICAgICAgICAtLSB6b25lIGlzIG9wdGlvbmFsCisgICAgMTk5NC0wMi0wMyAgICAgICAgICAgICAgICAgICAtLSBvbmx5IGRhdGUKKyAgICAxOTk0LTAyLTAzVDE0OjE1OjI5ICAgICAgICAgIC0tIFVzZSBUIGFzIHNlcGFyYXRvcgorICAgIDE5OTQwMjAzVDE0MTUyOVogICAgICAgICAgICAgLS0gSVNPIDg2MDEgY29tcGFjdCBmb3JtYXQKKyAgICAxOTk0MDIwMyAgICAgICAgICAgICAgICAgICAgIC0tIG9ubHkgZGF0ZQorCisgICAgIiIiCisgICAgIyBjbGVhbiB1cAorICAgIHRleHQgPSB0ZXh0LmxzdHJpcCgpCisKKyAgICAjIHR6IGlzIHRpbWUgem9uZSBzcGVjaWZpZXIgc3RyaW5nCisgICAgZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6ID0gW05vbmVdKjcKKworICAgICMgbG9vc2UgcmVnZXhwIHBhcnNlCisgICAgbSA9IElTT19EQVRFX1JFLnNlYXJjaCh0ZXh0KQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICMgWFhYIHRoZXJlJ3MgYW4gZXh0cmEgYml0IG9mIHRoZSB0aW1lem9uZSBJJ20gaWdub3JpbmcgaGVyZTogaXMKKyAgICAgICAgIyAgIHRoaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvPworICAgICAgICB5ciwgbW9uLCBkYXksIGhyLCBtaW4sIHNlYywgdHosIF8gPSBtLmdyb3VwcygpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUgICMgYmFkIGZvcm1hdAorCisgICAgcmV0dXJuIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopCisKKworIyBIZWFkZXIgcGFyc2luZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdW5tYXRjaGVkKG1hdGNoKToKKyAgICAiIiJSZXR1cm4gdW5tYXRjaGVkIHBhcnQgb2YgcmUuTWF0Y2ggb2JqZWN0LiIiIgorICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKDApCisgICAgcmV0dXJuIG1hdGNoLnN0cmluZ1s6c3RhcnRdK21hdGNoLnN0cmluZ1tlbmQ6XQorCitIRUFERVJfVE9LRU5fUkUgPSAgICAgICAgcmUuY29tcGlsZShyIl5ccyooW149XHM7LF0rKSIpCitIRUFERVJfUVVPVEVEX1ZBTFVFX1JFID0gcmUuY29tcGlsZShyIl5ccyo9XHMqXCIoW15cIlxcXSooPzpcXC5bXlwiXFxdKikqKVwiIikKK0hFQURFUl9WQUxVRV9SRSA9ICAgICAgICByZS5jb21waWxlKHIiXlxzKj1ccyooW15cczssXSopIikKK0hFQURFUl9FU0NBUEVfUkUgPSByZS5jb21waWxlKHIiXFwoLikiKQorZGVmIHNwbGl0X2hlYWRlcl93b3JkcyhoZWFkZXJfdmFsdWVzKToKKyAgICByIiIiUGFyc2UgaGVhZGVyIHZhbHVlcyBpbnRvIGEgbGlzdCBvZiBsaXN0cyBjb250YWluaW5nIGtleSx2YWx1ZSBwYWlycy4KKworICAgIFRoZSBmdW5jdGlvbiBrbm93cyBob3cgdG8gZGVhbCB3aXRoICIsIiwgIjsiIGFuZCAiPSIgYXMgd2VsbCBhcyBxdW90ZWQKKyAgICB2YWx1ZXMgYWZ0ZXIgIj0iLiAgQSBsaXN0IG9mIHNwYWNlIHNlcGFyYXRlZCB0b2tlbnMgYXJlIHBhcnNlZCBhcyBpZiB0aGV5CisgICAgd2VyZSBzZXBhcmF0ZWQgYnkgIjsiLgorCisgICAgSWYgdGhlIGhlYWRlcl92YWx1ZXMgcGFzc2VkIGFzIGFyZ3VtZW50IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgdGhlbiB0aGV5CisgICAgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGEgc2luZ2xlIHZhbHVlIHNlcGFyYXRlZCBieSBjb21tYSAiLCIuCisKKyAgICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHBhcnNpbmcgaGVhZGVyIGZpZWxkcyB0aGF0CisgICAgZm9sbG93IHRoaXMgc3ludGF4IChCTkYgYXMgZnJvbSB0aGUgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbiwgYnV0IHdlIHJlbGF4CisgICAgdGhlIHJlcXVpcmVtZW50IGZvciB0b2tlbnMpLgorCisgICAgICBoZWFkZXJzICAgICAgICAgICA9ICNoZWFkZXIKKyAgICAgIGhlYWRlciAgICAgICAgICAgID0gKHRva2VuIHwgcGFyYW1ldGVyKSAqKCBbIjsiXSAodG9rZW4gfCBwYXJhbWV0ZXIpKQorCisgICAgICB0b2tlbiAgICAgICAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+CisgICAgICBzZXBhcmF0b3JzICAgICAgICA9ICIoIiB8ICIpIiB8ICI8IiB8ICI+IiB8ICJAIgorICAgICAgICAgICAgICAgICAgICAgICAgfCAiLCIgfCAiOyIgfCAiOiIgfCAiXCIgfCA8Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgIi8iIHwgIlsiIHwgIl0iIHwgIj8iIHwgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICB8ICJ7IiB8ICJ9IiB8IFNQIHwgSFQKKworICAgICAgcXVvdGVkLXN0cmluZyAgICAgPSAoIDwiPiAqKHFkdGV4dCB8IHF1b3RlZC1wYWlyICkgPCI+ICkKKyAgICAgIHFkdGV4dCAgICAgICAgICAgID0gPGFueSBURVhUIGV4Y2VwdCA8Ij4+CisgICAgICBxdW90ZWQtcGFpciAgICAgICA9ICJcIiBDSEFSCisKKyAgICAgIHBhcmFtZXRlciAgICAgICAgID0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgICAgYXR0cmlidXRlICAgICAgICAgPSB0b2tlbgorICAgICAgdmFsdWUgICAgICAgICAgICAgPSB0b2tlbiB8IHF1b3RlZC1zdHJpbmcKKworICAgIEVhY2ggaGVhZGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgbGlzdCBvZiBrZXkvdmFsdWUgcGFpcnMuICBUaGUgdmFsdWUgZm9yIGEKKyAgICBzaW1wbGUgdG9rZW4gKG5vdCBwYXJ0IG9mIGEgcGFyYW1ldGVyKSBpcyBOb25lLiAgU3ludGFjdGljYWxseSBpbmNvcnJlY3QKKyAgICBoZWFkZXJzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHBhcnNlZCBhcyB5b3Ugd291bGQgd2FudC4KKworICAgIFRoaXMgaXMgZWFzaWVyIHRvIGRlc2NyaWJlIHdpdGggc29tZSBleGFtcGxlczoKKworICAgID4+PiBzcGxpdF9oZWFkZXJfd29yZHMoWydmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheiddKQorICAgIFtbKCdmb28nLCAnYmFyJyksICgncG9ydCcsICc4MCw4MScpLCAoJ2Rpc2NhcmQnLCBOb25lKV0sIFsoJ2JhcicsICdiYXonKV1dCisgICAgPj4+IHNwbGl0X2hlYWRlcl93b3JkcyhbJ3RleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSInXSkKKyAgICBbWygndGV4dC9odG1sJywgTm9uZSksICgnY2hhcnNldCcsICdpc28tODg1OS0xJyldXQorICAgID4+PiBzcGxpdF9oZWFkZXJfd29yZHMoW3InQmFzaWMgcmVhbG09IlwiZm9vXGJhclwiIiddKQorICAgIFtbKCdCYXNpYycsIE5vbmUpLCAoJ3JlYWxtJywgJyJmb29iYXIiJyldXQorCisgICAgIiIiCisgICAgYXNzZXJ0IHR5cGUoaGVhZGVyX3ZhbHVlcykgbm90IGluIFN0cmluZ1R5cGVzCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgdGV4dCBpbiBoZWFkZXJfdmFsdWVzOgorICAgICAgICBvcmlnX3RleHQgPSB0ZXh0CisgICAgICAgIHBhaXJzID0gW10KKyAgICAgICAgd2hpbGUgdGV4dDoKKyAgICAgICAgICAgIG0gPSBIRUFERVJfVE9LRU5fUkUuc2VhcmNoKHRleHQpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIHRleHQgPSB1bm1hdGNoZWQobSkKKyAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIG0gPSBIRUFERVJfUVVPVEVEX1ZBTFVFX1JFLnNlYXJjaCh0ZXh0KQorICAgICAgICAgICAgICAgIGlmIG06ICAjIHF1b3RlZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdW5tYXRjaGVkKG0pCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEhFQURFUl9FU0NBUEVfUkUuc3ViKHIiXDEiLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtID0gSEVBREVSX1ZBTFVFX1JFLnNlYXJjaCh0ZXh0KQorICAgICAgICAgICAgICAgICAgICBpZiBtOiAgIyB1bnF1b3RlZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHVubWF0Y2hlZChtKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHZhbHVlLCBhIGxvbmUgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxpZiB0ZXh0LmxzdHJpcCgpLnN0YXJ0c3dpdGgoIiwiKToKKyAgICAgICAgICAgICAgICAjIGNvbmNhdGVuYXRlZCBoZWFkZXJzLCBhcyBwZXIgUkZDIDI2MTYgc2VjdGlvbiA0LjIKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5sc3RyaXAoKVsxOl0KKyAgICAgICAgICAgICAgICBpZiBwYWlyczogcmVzdWx0LmFwcGVuZChwYWlycykKKyAgICAgICAgICAgICAgICBwYWlycyA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgc2tpcCBqdW5rCisgICAgICAgICAgICAgICAgbm9uX2p1bmssIG5yX2p1bmtfY2hhcnMgPSByZS5zdWJuKCJeWz1ccztdKiIsICIiLCB0ZXh0KQorICAgICAgICAgICAgICAgIGFzc2VydCBucl9qdW5rX2NoYXJzID4gMCwgKAorICAgICAgICAgICAgICAgICAgICAic3BsaXRfaGVhZGVyX3dvcmRzIGJ1ZzogJyVzJywgJyVzJywgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgKG9yaWdfdGV4dCwgdGV4dCwgcGFpcnMpKQorICAgICAgICAgICAgICAgIHRleHQgPSBub25fanVuaworICAgICAgICBpZiBwYWlyczogcmVzdWx0LmFwcGVuZChwYWlycykKKyAgICByZXR1cm4gcmVzdWx0CisKK0hFQURFUl9KT0lOX0VTQ0FQRV9SRSA9IHJlLmNvbXBpbGUociIoW1wiXFxdKSIpCitkZWYgam9pbl9oZWFkZXJfd29yZHMobGlzdHMpOgorICAgICIiIkRvIHRoZSBpbnZlcnNlIChhbG1vc3QpIG9mIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgc3BsaXRfaGVhZGVyX3dvcmRzLgorCisgICAgVGFrZXMgYSBsaXN0IG9mIGxpc3RzIG9mIChrZXksIHZhbHVlKSBwYWlycyBhbmQgcHJvZHVjZXMgYSBzaW5nbGUgaGVhZGVyCisgICAgdmFsdWUuICBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBxdW90ZWQgaWYgbmVlZGVkLgorCisgICAgPj4+IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJ0ZXh0L3BsYWluIiwgTm9uZSksICgiY2hhcnNldCIsICJpc28tODg1OS8xIildXSkKKyAgICAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTkvMSInCisgICAgPj4+IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJ0ZXh0L3BsYWluIiwgTm9uZSldLCBbKCJjaGFyc2V0IiwgImlzby04ODU5LzEiKV1dKQorICAgICd0ZXh0L3BsYWluLCBjaGFyc2V0PSJpc28tODg1OS8xIicKKworICAgICIiIgorICAgIGhlYWRlcnMgPSBbXQorICAgIGZvciBwYWlycyBpbiBsaXN0czoKKyAgICAgICAgYXR0ciA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHBhaXJzOgorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHIiXlx3KyQiLCB2KToKKyAgICAgICAgICAgICAgICAgICAgdiA9IEhFQURFUl9KT0lOX0VTQ0FQRV9SRS5zdWIociJcXFwxIiwgdikgICMgZXNjYXBlICIgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgdiA9ICciJXMiJyAlIHYKKyAgICAgICAgICAgICAgICBrID0gIiVzPSVzIiAlIChrLCB2KQorICAgICAgICAgICAgYXR0ci5hcHBlbmQoaykKKyAgICAgICAgaWYgYXR0cjogaGVhZGVycy5hcHBlbmQoIjsgIi5qb2luKGF0dHIpKQorICAgIHJldHVybiAiLCAiLmpvaW4oaGVhZGVycykKKworZGVmIHBhcnNlX25zX2hlYWRlcnMobnNfaGVhZGVycyk6CisgICAgIiIiQWQtaG9jIHBhcnNlciBmb3IgTmV0c2NhcGUgcHJvdG9jb2wgY29va2llLWF0dHJpYnV0ZXMuCisKKyAgICBUaGUgb2xkIE5ldHNjYXBlIGNvb2tpZSBmb3JtYXQgZm9yIFNldC1Db29raWUgY2FuIGZvciBpbnN0YW5jZSBjb250YWluCisgICAgYW4gdW5xdW90ZWQgIiwiIGluIHRoZSBleHBpcmVzIGZpZWxkLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGlzIGFkLWhvYworICAgIHBhcnNlciBpbnN0ZWFkIG9mIHNwbGl0X2hlYWRlcl93b3Jkcy4KKworICAgIFhYWCBUaGlzIG1heSBub3QgbWFrZSB0aGUgYmVzdCBwb3NzaWJsZSBlZmZvcnQgdG8gcGFyc2UgYWxsIHRoZSBjcmFwCisgICAgdGhhdCBOZXRzY2FwZSBDb29raWUgaGVhZGVycyBjb250YWluLiAgUm9uYWxkIFRzY2hhbGFyJ3MgSFRUUENsaWVudAorICAgIHBhcnNlciBpcyBwcm9iYWJseSBiZXR0ZXIsIHNvIGNvdWxkIGRvIHdvcnNlIHRoYW4gZm9sbG93aW5nIHRoYXQgaWYKKyAgICB0aGlzIGV2ZXIgZ2l2ZXMgYW55IHRyb3VibGUuCisKKyAgICBDdXJyZW50bHksIHRoaXMgaXMgYWxzbyB1c2VkIGZvciBwYXJzaW5nIFJGQyAyMTA5IGNvb2tpZXMuCisKKyAgICAiIiIKKyAgICBrbm93bl9hdHRycyA9ICgiZXhwaXJlcyIsICJkb21haW4iLCAicGF0aCIsICJzZWN1cmUiLAorICAgICAgICAgICAgICAgICAgICMgUkZDIDIxMDkgYXR0cnMgKG1heSB0dXJuIHVwIGluIE5ldHNjYXBlIGNvb2tpZXMsIHRvbykKKyAgICAgICAgICAgICAgICAgICAicG9ydCIsICJtYXgtYWdlIikKKworICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIG5zX2hlYWRlciBpbiBuc19oZWFkZXJzOgorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIHZlcnNpb25fc2V0ID0gRmFsc2UKKyAgICAgICAgZm9yIHBhcmFtIGluIHJlLnNwbGl0KHIiO1xzKiIsIG5zX2hlYWRlcik6CisgICAgICAgICAgICBwYXJhbSA9IHBhcmFtLnJzdHJpcCgpCisgICAgICAgICAgICBpZiBwYXJhbSA9PSAiIjogY29udGludWUKKyAgICAgICAgICAgIGlmICI9IiBub3QgaW4gcGFyYW06CisgICAgICAgICAgICAgICAgaWYgcGFyYW0ubG93ZXIoKSBpbiBrbm93bl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgaywgdiA9IHBhcmFtLCBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBjb29raWUgd2l0aCBtaXNzaW5nIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGssIHYgPSBwYXJhbSwgTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBrLCB2ID0gcmUuc3BsaXQociJccyo9XHMqIiwgcGFyYW0sIDEpCisgICAgICAgICAgICAgICAgayA9IGsubHN0cmlwKCkKKyAgICAgICAgICAgIGlmIGsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbGMgPSBrLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBpZiBsYyBpbiBrbm93bl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgayA9IGxjCisgICAgICAgICAgICAgICAgaWYgayA9PSAidmVyc2lvbiI6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBSRkMgMjEwOSBjb29raWUuICBXaWxsIGJlIHRyZWF0ZWQgYXMgUkZDIDI5NjUKKyAgICAgICAgICAgICAgICAgICAgIyBjb29raWUgaW4gcmVzdCBvZiBjb2RlLgorICAgICAgICAgICAgICAgICAgICAjIFByb2JhYmx5IGl0IHNob3VsZCBiZSBwYXJzZWQgd2l0aCBzcGxpdF9oZWFkZXJfd29yZHMsIGJ1dAorICAgICAgICAgICAgICAgICAgICAjIHRoYXQncyB0b28gbXVjaCBoYXNzbGUuCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fc2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGsgPT0gImV4cGlyZXMiOgorICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgZXhwaXJlcyBkYXRlIHRvIHNlY29uZHMgc2luY2UgZXBvY2gKKyAgICAgICAgICAgICAgICAgICAgaWYgdi5zdGFydHN3aXRoKCciJyk6IHYgPSB2WzE6XQorICAgICAgICAgICAgICAgICAgICBpZiB2LmVuZHN3aXRoKCciJyk6IHYgPSB2WzotMV0KKyAgICAgICAgICAgICAgICAgICAgdiA9IGh0dHAydGltZSh2KSAgIyBOb25lIGlmIGludmFsaWQKKyAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoaywgdikpCisKKyAgICAgICAgaWYgcGFpcnM6CisgICAgICAgICAgICBpZiBub3QgdmVyc2lvbl9zZXQ6CisgICAgICAgICAgICAgICAgcGFpcnMuYXBwZW5kKCgidmVyc2lvbiIsICIwIikpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHBhaXJzKQorCisgICAgcmV0dXJuIHJlc3VsdAorCisKK0lQVjRfUkUgPSByZS5jb21waWxlKHIiXC5cZCskIikKK2RlZiBpc19IRE4odGV4dCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGV4dCBpcyBhIGhvc3QgZG9tYWluIG5hbWUuIiIiCisgICAgIyBYWFgKKyAgICAjIFRoaXMgbWF5IHdlbGwgYmUgd3JvbmcuICBXaGljaCBSRkMgaXMgSEROIGRlZmluZWQgaW4sIGlmIGFueSAoZm9yCisgICAgIyAgdGhlIHB1cnBvc2VzIG9mIFJGQyAyOTY1KT8KKyAgICAjIEZvciB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgd2hhdCBhYm91dCBJUHY2PyAgUmVtZW1iZXIgdG8gbG9vaworICAgICMgIGF0IG90aGVyIHVzZXMgb2YgSVBWNF9SRSBhbHNvLCBpZiBjaGFuZ2UgdGhpcy4KKyAgICBpZiBJUFY0X1JFLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgdGV4dCA9PSAiIjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgdGV4dFswXSA9PSAiLiIgb3IgdGV4dFstMV0gPT0gIi4iOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgZG9tYWluX21hdGNoKEEsIEIpOgorICAgICIiIlJldHVybiBUcnVlIGlmIGRvbWFpbiBBIGRvbWFpbi1tYXRjaGVzIGRvbWFpbiBCLCBhY2NvcmRpbmcgdG8gUkZDIDI5NjUuCisKKyAgICBBIGFuZCBCIG1heSBiZSBob3N0IGRvbWFpbiBuYW1lcyBvciBJUCBhZGRyZXNzZXMuCisKKyAgICBSRkMgMjk2NSwgc2VjdGlvbiAxOgorCisgICAgSG9zdCBuYW1lcyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhbiBJUCBhZGRyZXNzIG9yIGEgSEROIHN0cmluZy4KKyAgICBTb21ldGltZXMgd2UgY29tcGFyZSBvbmUgaG9zdCBuYW1lIHdpdGggYW5vdGhlci4gIChTdWNoIGNvbXBhcmlzb25zIFNIQUxMCisgICAgYmUgY2FzZS1pbnNlbnNpdGl2ZS4pICBIb3N0IEEncyBuYW1lIGRvbWFpbi1tYXRjaGVzIGhvc3QgQidzIGlmCisKKyAgICAgICAgICogIHRoZWlyIGhvc3QgbmFtZSBzdHJpbmdzIHN0cmluZy1jb21wYXJlIGVxdWFsOyBvcgorCisgICAgICAgICAqIEEgaXMgYSBIRE4gc3RyaW5nIGFuZCBoYXMgdGhlIGZvcm0gTkIsIHdoZXJlIE4gaXMgYSBub24tZW1wdHkKKyAgICAgICAgICAgIG5hbWUgc3RyaW5nLCBCIGhhcyB0aGUgZm9ybSAuQicsIGFuZCBCJyBpcyBhIEhETiBzdHJpbmcuICAoU28sCisgICAgICAgICAgICB4LnkuY29tIGRvbWFpbi1tYXRjaGVzIC5ZLmNvbSBidXQgbm90IFkuY29tLikKKworICAgIE5vdGUgdGhhdCBkb21haW4tbWF0Y2ggaXMgbm90IGEgY29tbXV0YXRpdmUgb3BlcmF0aW9uOiBhLmIuYy5jb20KKyAgICBkb21haW4tbWF0Y2hlcyAuYy5jb20sIGJ1dCBub3QgdGhlIHJldmVyc2UuCisKKyAgICAiIiIKKyAgICAjIE5vdGUgdGhhdCwgaWYgQSBvciBCIGFyZSBJUCBhZGRyZXNzZXMsIHRoZSBvbmx5IHJlbGV2YW50IHBhcnQgb2YgdGhlCisgICAgIyBkZWZpbml0aW9uIG9mIHRoZSBkb21haW4tbWF0Y2ggYWxnb3JpdGhtIGlzIHRoZSBkaXJlY3Qgc3RyaW5nLWNvbXBhcmUuCisgICAgQSA9IEEubG93ZXIoKQorICAgIEIgPSBCLmxvd2VyKCkKKyAgICBpZiBBID09IEI6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGlzX0hETihBKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaSA9IEEucmZpbmQoQikKKyAgICBpZiBpID09IC0xIG9yIGkgPT0gMDoKKyAgICAgICAgIyBBIGRvZXMgbm90IGhhdmUgZm9ybSBOQiwgb3IgTiBpcyB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG5vdCBCLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbm90IGlzX0hETihCWzE6XSk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBsaWJlcmFsX2lzX0hETih0ZXh0KToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0ZXh0IGlzIGEgc29ydC1vZi1saWtlIGEgaG9zdCBkb21haW4gbmFtZS4KKworICAgIEZvciBhY2NlcHRpbmcvYmxvY2tpbmcgZG9tYWlucy4KKworICAgICIiIgorICAgIGlmIElQVjRfUkUuc2VhcmNoKHRleHQpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgdXNlcl9kb21haW5fbWF0Y2goQSwgQik6CisgICAgIiIiRm9yIGJsb2NraW5nL2FjY2VwdGluZyBkb21haW5zLgorCisgICAgQSBhbmQgQiBtYXkgYmUgaG9zdCBkb21haW4gbmFtZXMgb3IgSVAgYWRkcmVzc2VzLgorCisgICAgIiIiCisgICAgQSA9IEEubG93ZXIoKQorICAgIEIgPSBCLmxvd2VyKCkKKyAgICBpZiBub3QgKGxpYmVyYWxfaXNfSEROKEEpIGFuZCBsaWJlcmFsX2lzX0hETihCKSk6CisgICAgICAgIGlmIEEgPT0gQjoKKyAgICAgICAgICAgICMgZXF1YWwgSVAgYWRkcmVzc2VzCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpbml0aWFsX2RvdCA9IEIuc3RhcnRzd2l0aCgiLiIpCisgICAgaWYgaW5pdGlhbF9kb3QgYW5kIEEuZW5kc3dpdGgoQik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGluaXRpYWxfZG90IGFuZCBBID09IEI6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2N1dF9wb3J0X3JlID0gcmUuY29tcGlsZShyIjpcZCskIikKK2RlZiByZXF1ZXN0X2hvc3QocmVxdWVzdCk6CisgICAgIiIiUmV0dXJuIHJlcXVlc3QtaG9zdCwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NS4KKworICAgIFZhcmlhdGlvbiBmcm9tIFJGQzogcmV0dXJuZWQgdmFsdWUgaXMgbG93ZXJjYXNlZCwgZm9yIGNvbnZlbmllbnQKKyAgICBjb21wYXJpc29uLgorCisgICAgIiIiCisgICAgdXJsID0gcmVxdWVzdC5nZXRfZnVsbF91cmwoKQorICAgIGhvc3QgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzFdCisgICAgaWYgaG9zdCA9PSAiIjoKKyAgICAgICAgaG9zdCA9IHJlcXVlc3QuZ2V0X2hlYWRlcigiSG9zdCIsICIiKQorCisgICAgIyByZW1vdmUgcG9ydCwgaWYgcHJlc2VudAorICAgIGhvc3QgPSBjdXRfcG9ydF9yZS5zdWIoIiIsIGhvc3QsIDEpCisgICAgcmV0dXJuIGhvc3QubG93ZXIoKQorCitkZWYgZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KToKKyAgICAiIiJSZXR1cm4gYSB0dXBsZSAocmVxdWVzdC1ob3N0LCBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUpLgorCisgICAgQXMgZGVmaW5lZCBieSBSRkMgMjk2NSwgZXhjZXB0IGJvdGggYXJlIGxvd2VyY2FzZWQuCisKKyAgICAiIiIKKyAgICBlcmhuID0gcmVxX2hvc3QgPSByZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICBpZiByZXFfaG9zdC5maW5kKCIuIikgPT0gLTEgYW5kIG5vdCBJUFY0X1JFLnNlYXJjaChyZXFfaG9zdCk6CisgICAgICAgIGVyaG4gPSByZXFfaG9zdCArICIubG9jYWwiCisgICAgcmV0dXJuIHJlcV9ob3N0LCBlcmhuCisKK2RlZiByZXF1ZXN0X3BhdGgocmVxdWVzdCk6CisgICAgIiIicmVxdWVzdC1VUkksIGFzIGRlZmluZWQgYnkgUkZDIDI5NjUuIiIiCisgICAgdXJsID0gcmVxdWVzdC5nZXRfZnVsbF91cmwoKQorICAgICNzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgI3JlcV9wYXRoID0gZXNjYXBlX3BhdGgoIiIuam9pbih1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzI6XSkpCisgICAgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzI6XQorICAgIGlmIHBhcmFtZXRlcnM6CisgICAgICAgIHBhdGggPSAiJXM7JXMiICUgKHBhdGgsIHBhcmFtZXRlcnMpCisgICAgcGF0aCA9IGVzY2FwZV9wYXRoKHBhdGgpCisgICAgcmVxX3BhdGggPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgiIiwgIiIsIHBhdGgsICIiLCBxdWVyeSwgZnJhZykpCisgICAgaWYgbm90IHJlcV9wYXRoLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgIyBmaXggYmFkIFJGQyAyMzk2IGFic29sdXRlVVJJCisgICAgICAgIHJlcV9wYXRoID0gIi8iK3JlcV9wYXRoCisgICAgcmV0dXJuIHJlcV9wYXRoCisKK2RlZiByZXF1ZXN0X3BvcnQocmVxdWVzdCk6CisgICAgaG9zdCA9IHJlcXVlc3QuZ2V0X2hvc3QoKQorICAgIGkgPSBob3N0LmZpbmQoJzonKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgcG9ydCA9IGhvc3RbaSsxOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW50KHBvcnQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgZGVidWcoIm5vbm51bWVyaWMgcG9ydDogJyVzJyIsIHBvcnQpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHBvcnQgPSBERUZBVUxUX0hUVFBfUE9SVAorICAgIHJldHVybiBwb3J0CisKKyMgQ2hhcmFjdGVycyBpbiBhZGRpdGlvbiB0byBBLVosIGEteiwgMC05LCAnXycsICcuJywgYW5kICctJyB0aGF0IGRvbid0CisjIG5lZWQgdG8gYmUgZXNjYXBlZCB0byBmb3JtIGEgdmFsaWQgSFRUUCBVUkwgKFJGQ3MgMjM5NiBhbmQgMTczOCkuCitIVFRQX1BBVEhfU0FGRSA9ICIlLzs6QCY9KyQsIX4qJygpIgorRVNDQVBFRF9DSEFSX1JFID0gcmUuY29tcGlsZShyIiUoWzAtOWEtZkEtRl1bMC05YS1mQS1GXSkiKQorZGVmIHVwcGVyY2FzZV9lc2NhcGVkX2NoYXIobWF0Y2gpOgorICAgIHJldHVybiAiJSUlcyIgJSBtYXRjaC5ncm91cCgxKS51cHBlcigpCitkZWYgZXNjYXBlX3BhdGgocGF0aCk6CisgICAgIiIiRXNjYXBlIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gSFRUUCBVUkwsIGFuZCB1cHBlcmNhc2UgYWxsIGVzY2FwZXMuIiIiCisgICAgIyBUaGVyZSdzIG5vIGtub3dpbmcgd2hhdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgd2FzIHVzZWQgdG8gY3JlYXRlIFVSTHMKKyAgICAjIGNvbnRhaW5pbmcgJS1lc2NhcGVzLCBidXQgc2luY2Ugd2UgaGF2ZSB0byBwaWNrIG9uZSB0byBlc2NhcGUgaW52YWxpZAorICAgICMgcGF0aCBjaGFyYWN0ZXJzLCB3ZSBwaWNrIFVURi04LCBhcyByZWNvbW1lbmRlZCBpbiB0aGUgSFRNTCA0LjAKKyAgICAjIHNwZWNpZmljYXRpb246CisgICAgIyBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2FwcGVuZGl4L25vdGVzLmh0bWwjaC1CLjIuMQorICAgICMgQW5kIGhlcmUsIGtpbmQgb2Y6IGRyYWZ0LWZpZWxkaW5nLXVyaS1yZmMyMzk2YmlzLTAzCisgICAgIyAoQW5kIGluIGRyYWZ0IElSSSBzcGVjaWZpY2F0aW9uOiBkcmFmdC1kdWVyc3QtaXJpLTA1KQorICAgICMgKEFuZCBoZXJlLCBmb3IgbmV3IFVSSSBzY2hlbWVzOiBSRkMgMjcxOCkKKyAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHR5cGVzLlVuaWNvZGVUeXBlKToKKyAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCJ1dGYtOCIpCisgICAgcGF0aCA9IHVybGxpYi5xdW90ZShwYXRoLCBIVFRQX1BBVEhfU0FGRSkKKyAgICBwYXRoID0gRVNDQVBFRF9DSEFSX1JFLnN1Yih1cHBlcmNhc2VfZXNjYXBlZF9jaGFyLCBwYXRoKQorICAgIHJldHVybiBwYXRoCisKK2RlZiByZWFjaChoKToKKyAgICAiIiJSZXR1cm4gcmVhY2ggb2YgaG9zdCBoLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LCBzZWN0aW9uIDEuCisKKyAgICBUaGUgcmVhY2ggUiBvZiBhIGhvc3QgbmFtZSBIIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworICAgICAgICogIElmCisKKyAgICAgICAgICAtICBIIGlzIHRoZSBob3N0IGRvbWFpbiBuYW1lIG9mIGEgaG9zdDsgYW5kLAorCisgICAgICAgICAgLSAgSCBoYXMgdGhlIGZvcm0gQS5COyBhbmQKKworICAgICAgICAgIC0gIEEgaGFzIG5vIGVtYmVkZGVkICh0aGF0IGlzLCBpbnRlcmlvcikgZG90czsgYW5kCisKKyAgICAgICAgICAtICBCIGhhcyBhdCBsZWFzdCBvbmUgZW1iZWRkZWQgZG90LCBvciBCIGlzIHRoZSBzdHJpbmcgImxvY2FsIi4KKyAgICAgICAgICAgICB0aGVuIHRoZSByZWFjaCBvZiBIIGlzIC5CLgorCisgICAgICAgKiAgT3RoZXJ3aXNlLCB0aGUgcmVhY2ggb2YgSCBpcyBILgorCisgICAgPj4+IHJlYWNoKCJ3d3cuYWNtZS5jb20iKQorICAgICcuYWNtZS5jb20nCisgICAgPj4+IHJlYWNoKCJhY21lLmNvbSIpCisgICAgJ2FjbWUuY29tJworICAgID4+PiByZWFjaCgiYWNtZS5sb2NhbCIpCisgICAgJy5sb2NhbCcKKworICAgICIiIgorICAgIGkgPSBoLmZpbmQoIi4iKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgI2EgPSBoWzppXSAgIyB0aGlzIGxpbmUgaXMgb25seSBoZXJlIHRvIHNob3cgd2hhdCBhIGlzCisgICAgICAgIGIgPSBoW2krMTpdCisgICAgICAgIGkgPSBiLmZpbmQoIi4iKQorICAgICAgICBpZiBpc19IRE4oaCkgYW5kIChpID49IDAgb3IgYiA9PSAibG9jYWwiKToKKyAgICAgICAgICAgIHJldHVybiAiLiIrYgorICAgIHJldHVybiBoCisKK2RlZiBpc190aGlyZF9wYXJ0eShyZXF1ZXN0KToKKyAgICAiIiIKKworICAgIFJGQyAyOTY1LCBzZWN0aW9uIDMuMy42OgorCisgICAgICAgIEFuIHVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiBpcyB0byBhIHRoaXJkLXBhcnR5IGhvc3QgaWYgaXRzIHJlcXVlc3QtCisgICAgICAgIGhvc3QgVSBkb2VzIG5vdCBkb21haW4tbWF0Y2ggdGhlIHJlYWNoIFIgb2YgdGhlIHJlcXVlc3QtaG9zdCBPIGluIHRoZQorICAgICAgICBvcmlnaW4gdHJhbnNhY3Rpb24uCisKKyAgICAiIiIKKyAgICByZXFfaG9zdCA9IHJlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgIGlmIG5vdCBkb21haW5fbWF0Y2gocmVxX2hvc3QsIHJlYWNoKHJlcXVlc3QuZ2V0X29yaWdpbl9yZXFfaG9zdCgpKSk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgQ29va2llOgorICAgICIiIkhUVFAgQ29va2llLgorCisgICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGJvdGggTmV0c2NhcGUgYW5kIFJGQyAyOTY1IGNvb2tpZXMuCisKKyAgICBUaGlzIGlzIGRlbGliZXJhdGVseSBhIHZlcnkgc2ltcGxlIGNsYXNzLiAgSXQganVzdCBob2xkcyBhdHRyaWJ1dGVzLiAgSXQncworICAgIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBDb29raWUgaW5zdGFuY2VzIHRoYXQgZG9uJ3QgY29tcGx5IHdpdGggdGhlIGNvb2tpZQorICAgIHN0YW5kYXJkcy4gIENvb2tpZUphci5tYWtlX2Nvb2tpZXMgaXMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIENvb2tpZQorICAgIG9iamVjdHMgLS0gaXQgZGVhbHMgd2l0aCBjb29raWUgcGFyc2luZywgc3VwcGx5aW5nIGRlZmF1bHRzLCBhbmQKKyAgICBub3JtYWxpc2luZyB0byB0aGUgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGlzIGNsYXNzLiAgQ29va2llUG9saWN5IGlzCisgICAgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZW0gdG8gc2VlIHdoZXRoZXIgdGhleSBzaG91bGQgYmUgYWNjZXB0ZWQgZnJvbQorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgc2VydmVyLgorCisgICAgTm90ZSB0aGF0IHRoZSBwb3J0IG1heSBiZSBwcmVzZW50IGluIHRoZSBoZWFkZXJzLCBidXQgdW5zcGVjaWZpZWQgKCJQb3J0IgorICAgIHJhdGhlciB0aGFuIlBvcnQ9ODAiLCBmb3IgZXhhbXBsZSk7IGlmIHRoaXMgaXMgdGhlIGNhc2UsIHBvcnQgaXMgTm9uZS4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24sIG5hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICBwb3J0LCBwb3J0X3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBkb21haW5faW5pdGlhbF9kb3QsCisgICAgICAgICAgICAgICAgIHBhdGgsIHBhdGhfc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgIGRpc2NhcmQsCisgICAgICAgICAgICAgICAgIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgIGNvbW1lbnRfdXJsLAorICAgICAgICAgICAgICAgICByZXN0KToKKworICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOiB2ZXJzaW9uID0gaW50KHZlcnNpb24pCisgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6IGV4cGlyZXMgPSBpbnQoZXhwaXJlcykKKyAgICAgICAgaWYgcG9ydCBpcyBOb25lIGFuZCBwb3J0X3NwZWNpZmllZCBpcyBUcnVlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgcG9ydCBpcyBOb25lLCBwb3J0X3NwZWNpZmllZCBtdXN0IGJlIGZhbHNlIikKKworICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5wb3J0X3NwZWNpZmllZCA9IHBvcnRfc3BlY2lmaWVkCisgICAgICAgICMgbm9ybWFsaXNlIGNhc2UsIGFzIHBlciBSRkMgMjk2NSBzZWN0aW9uIDMuMy4zCisgICAgICAgIHNlbGYuZG9tYWluID0gZG9tYWluLmxvd2VyKCkKKyAgICAgICAgc2VsZi5kb21haW5fc3BlY2lmaWVkID0gZG9tYWluX3NwZWNpZmllZAorICAgICAgICAjIFNpZ2guICBXZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgZG9tYWluIGdpdmVuIGluIHRoZQorICAgICAgICAjIGNvb2tpZS1hdHRyaWJ1dGUgaGFkIGFuIGluaXRpYWwgZG90LCBpbiBvcmRlciB0byBmb2xsb3cgUkZDIDI5NjUKKyAgICAgICAgIyAoYXMgY2xhcmlmaWVkIGluIGRyYWZ0IGVycmF0YSkuICBOZWVkZWQgZm9yIHRoZSByZXR1cm5lZCAkRG9tYWluCisgICAgICAgICMgdmFsdWUuCisgICAgICAgIHNlbGYuZG9tYWluX2luaXRpYWxfZG90ID0gZG9tYWluX2luaXRpYWxfZG90CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5wYXRoX3NwZWNpZmllZCA9IHBhdGhfc3BlY2lmaWVkCisgICAgICAgIHNlbGYuc2VjdXJlID0gc2VjdXJlCisgICAgICAgIHNlbGYuZXhwaXJlcyA9IGV4cGlyZXMKKyAgICAgICAgc2VsZi5kaXNjYXJkID0gZGlzY2FyZAorICAgICAgICBzZWxmLmNvbW1lbnQgPSBjb21tZW50CisgICAgICAgIHNlbGYuY29tbWVudF91cmwgPSBjb21tZW50X3VybAorCisgICAgICAgIHNlbGYuX3Jlc3QgPSBjb3B5LmNvcHkocmVzdCkKKworICAgIGRlZiBoYXNfbm9uc3RhbmRhcmRfYXR0cihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5fcmVzdAorICAgIGRlZiBnZXRfbm9uc3RhbmRhcmRfYXR0cihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdC5nZXQobmFtZSwgZGVmYXVsdCkKKyAgICBkZWYgc2V0X25vbnN0YW5kYXJkX2F0dHIoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBzZWxmLl9yZXN0W25hbWVdID0gdmFsdWUKKworICAgIGRlZiBpc19leHBpcmVkKHNlbGYsIG5vdz1Ob25lKToKKyAgICAgICAgaWYgbm93IGlzIE5vbmU6IG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGlmIChzZWxmLmV4cGlyZXMgaXMgbm90IE5vbmUpIGFuZCAoc2VsZi5leHBpcmVzIDw9IG5vdyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBvcnQgaXMgTm9uZTogcCA9ICIiCisgICAgICAgIGVsc2U6IHAgPSAiOiIrc2VsZi5wb3J0CisgICAgICAgIGxpbWl0ID0gc2VsZi5kb21haW4gKyBwICsgc2VsZi5wYXRoCisgICAgICAgIGlmIHNlbGYudmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuYW1ldmFsdWUgPSAiJXM9JXMiICUgKHNlbGYubmFtZSwgc2VsZi52YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWV2YWx1ZSA9IHNlbGYubmFtZQorICAgICAgICByZXR1cm4gIjxDb29raWUgJXMgZm9yICVzPiIgJSAobmFtZXZhbHVlLCBsaW1pdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIFsidmVyc2lvbiIsICJuYW1lIiwgInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgInBvcnRfc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICJkb21haW4iLCAiZG9tYWluX3NwZWNpZmllZCIsICJkb21haW5faW5pdGlhbF9kb3QiLAorICAgICAgICAgICAgICAgICAgICAgInBhdGgiLCAicGF0aF9zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgInNlY3VyZSIsICJleHBpcmVzIiwgImRpc2NhcmQiLCAiY29tbWVudCIsICJjb21tZW50X3VybCIsCisgICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgYXR0ciA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCIlcz0lcyIgJSAobmFtZSwgcmVwcihhdHRyKSkpCisgICAgICAgIGFyZ3MuYXBwZW5kKCJyZXN0PSVzIiAlIHJlcHIoc2VsZi5fcmVzdCkpCisgICAgICAgIHJldHVybiAiQ29va2llKCVzKSIgJSAiLCAiLmpvaW4oYXJncykKKworCitjbGFzcyBDb29raWVQb2xpY3k6CisgICAgIiIiRGVmaW5lcyB3aGljaCBjb29raWVzIGdldCBhY2NlcHRlZCBmcm9tIGFuZCByZXR1cm5lZCB0byBzZXJ2ZXIuCisKKyAgICBNYXkgYWxzbyBtb2RpZnkgY29va2llcywgdGhvdWdoIHRoaXMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KKworICAgIFRoZSBzdWJjbGFzcyBEZWZhdWx0Q29va2llUG9saWN5IGRlZmluZXMgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBOZXRzY2FwZQorICAgIGFuZCBSRkMgMjk2NSBjb29raWVzIC0tIG92ZXJyaWRlIHRoYXQgaWYgeW91IHdhbnQgYSBjdXN0b21pc2VkIHBvbGljeS4KKworICAgICIiIgorICAgIGRlZiBzZXRfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBjb29raWUgc2hvdWxkIGJlIGFjY2VwdGVkIGZyb20gc2VydmVyLgorCisgICAgICAgIEN1cnJlbnRseSwgcHJlLWV4cGlyZWQgY29va2llcyBuZXZlciBnZXQgdGhpcyBmYXIgLS0gdGhlIENvb2tpZUphcgorICAgICAgICBjbGFzcyBkZWxldGVzIHN1Y2ggY29va2llcyBpdHNlbGYuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJldHVybl9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIGNvb2tpZSBzaG91bGQgYmUgcmV0dXJuZWQgdG8gc2VydmVyLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBkb21haW5fcmV0dXJuX29rKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiBmYWxzZSBpZiBjb29raWVzIHNob3VsZCBub3QgYmUgcmV0dXJuZWQsIGdpdmVuIGNvb2tpZSBkb21haW4uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhdGhfcmV0dXJuX29rKHNlbGYsIHBhdGgsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgcGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgRGVmYXVsdENvb2tpZVBvbGljeShDb29raWVQb2xpY3kpOgorICAgICIiIkltcGxlbWVudHMgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBhY2NlcHRpbmcgYW5kIHJldHVybmluZyBjb29raWVzLiIiIgorCisgICAgRG9tYWluU3RyaWN0Tm9Eb3RzID0gMQorICAgIERvbWFpblN0cmljdE5vbkRvbWFpbiA9IDIKKyAgICBEb21haW5SRkMyOTY1TWF0Y2ggPSA0CisKKyAgICBEb21haW5MaWJlcmFsID0gMAorICAgIERvbWFpblN0cmljdCA9IERvbWFpblN0cmljdE5vRG90c3xEb21haW5TdHJpY3ROb25Eb21haW4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBibG9ja2VkX2RvbWFpbnM9Tm9uZSwgYWxsb3dlZF9kb21haW5zPU5vbmUsCisgICAgICAgICAgICAgICAgIG5ldHNjYXBlPVRydWUsIHJmYzI5NjU9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhpZGVfY29va2llMj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X2RvbWFpbj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlPVRydWUsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc191bnZlcmlmaWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc19kb21haW49RG9tYWluTGliZXJhbCwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX3NldF9wYXRoPUZhbHNlLAorICAgICAgICAgICAgICAgICApOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciBhcmd1bWVudHMgc2hvdWxkIGJlIHBhc3NlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cyBvbmx5LiIiIgorICAgICAgICBzZWxmLm5ldHNjYXBlID0gbmV0c2NhcGUKKyAgICAgICAgc2VsZi5yZmMyOTY1ID0gcmZjMjk2NQorICAgICAgICBzZWxmLmhpZGVfY29va2llMiA9IGhpZGVfY29va2llMgorICAgICAgICBzZWxmLnN0cmljdF9kb21haW4gPSBzdHJpY3RfZG9tYWluCisgICAgICAgIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlID0gc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlCisgICAgICAgIHNlbGYuc3RyaWN0X25zX3VudmVyaWZpYWJsZSA9IHN0cmljdF9uc191bnZlcmlmaWFibGUKKyAgICAgICAgc2VsZi5zdHJpY3RfbnNfZG9tYWluID0gc3RyaWN0X25zX2RvbWFpbgorICAgICAgICBzZWxmLnN0cmljdF9uc19zZXRfaW5pdGlhbF9kb2xsYXIgPSBzdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyCisgICAgICAgIHNlbGYuc3RyaWN0X25zX3NldF9wYXRoID0gc3RyaWN0X25zX3NldF9wYXRoCisKKyAgICAgICAgaWYgYmxvY2tlZF9kb21haW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYmxvY2tlZF9kb21haW5zID0gdHVwbGUoYmxvY2tlZF9kb21haW5zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYmxvY2tlZF9kb21haW5zID0gKCkKKworICAgICAgICBpZiBhbGxvd2VkX2RvbWFpbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhbGxvd2VkX2RvbWFpbnMgPSB0dXBsZShhbGxvd2VkX2RvbWFpbnMpCisgICAgICAgIHNlbGYuX2FsbG93ZWRfZG9tYWlucyA9IGFsbG93ZWRfZG9tYWlucworCisgICAgZGVmIGJsb2NrZWRfZG9tYWlucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzZXF1ZW5jZSBvZiBibG9ja2VkIGRvbWFpbnMgKGFzIGEgdHVwbGUpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fYmxvY2tlZF9kb21haW5zCisgICAgZGVmIHNldF9ibG9ja2VkX2RvbWFpbnMoc2VsZiwgYmxvY2tlZF9kb21haW5zKToKKyAgICAgICAgIiIiU2V0IHRoZSBzZXF1ZW5jZSBvZiBibG9ja2VkIGRvbWFpbnMuIiIiCisgICAgICAgIHNlbGYuX2Jsb2NrZWRfZG9tYWlucyA9IHR1cGxlKGJsb2NrZWRfZG9tYWlucykKKworICAgIGRlZiBpc19ibG9ja2VkKHNlbGYsIGRvbWFpbik6CisgICAgICAgIGZvciBibG9ja2VkX2RvbWFpbiBpbiBzZWxmLl9ibG9ja2VkX2RvbWFpbnM6CisgICAgICAgICAgICBpZiB1c2VyX2RvbWFpbl9tYXRjaChkb21haW4sIGJsb2NrZWRfZG9tYWluKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBhbGxvd2VkX2RvbWFpbnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBOb25lLCBvciB0aGUgc2VxdWVuY2Ugb2YgYWxsb3dlZCBkb21haW5zIChhcyBhIHR1cGxlKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2FsbG93ZWRfZG9tYWlucworICAgIGRlZiBzZXRfYWxsb3dlZF9kb21haW5zKHNlbGYsIGFsbG93ZWRfZG9tYWlucyk6CisgICAgICAgICIiIlNldCB0aGUgc2VxdWVuY2Ugb2YgYWxsb3dlZCBkb21haW5zLCBvciBOb25lLiIiIgorICAgICAgICBpZiBhbGxvd2VkX2RvbWFpbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhbGxvd2VkX2RvbWFpbnMgPSB0dXBsZShhbGxvd2VkX2RvbWFpbnMpCisgICAgICAgIHNlbGYuX2FsbG93ZWRfZG9tYWlucyA9IGFsbG93ZWRfZG9tYWlucworCisgICAgZGVmIGlzX25vdF9hbGxvd2VkKHNlbGYsIGRvbWFpbik6CisgICAgICAgIGlmIHNlbGYuX2FsbG93ZWRfZG9tYWlucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBhbGxvd2VkX2RvbWFpbiBpbiBzZWxmLl9hbGxvd2VkX2RvbWFpbnM6CisgICAgICAgICAgICBpZiB1c2VyX2RvbWFpbl9tYXRjaChkb21haW4sIGFsbG93ZWRfZG9tYWluKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiCisgICAgICAgIElmIHlvdSBvdmVycmlkZSAuc2V0X29rKCksIGJlIHN1cmUgdG8gY2FsbCB0aGlzIG1ldGhvZC4gIElmIGl0IHJldHVybnMKKyAgICAgICAgZmFsc2UsIHNvIHNob3VsZCB5b3VyIHN1YmNsYXNzIChhc3N1bWluZyB5b3VyIHN1YmNsYXNzIHdhbnRzIHRvIGJlIG1vcmUKKyAgICAgICAgc3RyaWN0IGFib3V0IHdoaWNoIGNvb2tpZXMgdG8gYWNjZXB0KS4KKworICAgICAgICAiIiIKKyAgICAgICAgZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisKKyAgICAgICAgYXNzZXJ0IGNvb2tpZS5uYW1lIGlzIG5vdCBOb25lCisKKyAgICAgICAgZm9yIG4gaW4gInZlcnNpb24iLCAidmVyaWZpYWJpbGl0eSIsICJuYW1lIiwgInBhdGgiLCAiZG9tYWluIiwgInBvcnQiOgorICAgICAgICAgICAgZm5fbmFtZSA9ICJzZXRfb2tfIituCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc2VsZiwgZm5fbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBmbihjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3ZlcnNpb24oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgICMgVmVyc2lvbiBpcyBhbHdheXMgc2V0IHRvIDAgYnkgcGFyc2VfbnNfaGVhZGVycyBpZiBpdCdzIGEgTmV0c2NhcGUKKyAgICAgICAgICAgICMgY29va2llLCBzbyB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCBSRkMgMjk2NSBjb29raWUuCisgICAgICAgICAgICBkZWJ1ZygiICAgU2V0LUNvb2tpZTIgd2l0aG91dCB2ZXJzaW9uIGF0dHJpYnV0ZSAoJXM9JXMpIiwKKyAgICAgICAgICAgICAgICAgIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3Qgc2VsZi5yZmMyOTY1OgorICAgICAgICAgICAgZGVidWcoIiAgIFJGQyAyOTY1IGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3Qgc2VsZi5uZXRzY2FwZToKKyAgICAgICAgICAgIGRlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3ZlcmlmaWFiaWxpdHkoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgcmVxdWVzdC5pc191bnZlcmlmaWFibGUoKSBhbmQgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICB0aGlyZC1wYXJ0eSBSRkMgMjk2NSBjb29raWUgZHVyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgTmV0c2NhcGUgY29va2llIGR1cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19uYW1lKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICMgVHJ5IGFuZCBzdG9wIHNlcnZlcnMgc2V0dGluZyBWMCBjb29raWVzIGRlc2lnbmVkIHRvIGhhY2sgb3RoZXIKKyAgICAgICAgIyBzZXJ2ZXJzIHRoYXQga25vdyBib3RoIFYwIGFuZCBWMSBwcm90b2NvbHMuCisgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc19zZXRfaW5pdGlhbF9kb2xsYXIgYW5kCisgICAgICAgICAgICBjb29raWUubmFtZS5zdGFydHN3aXRoKCIkIikpOgorICAgICAgICAgICAgZGVidWcoIiAgIGlsbGVnYWwgbmFtZSAoc3RhcnRzIHdpdGggJyQnKTogJyVzJyIsIGNvb2tpZS5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3BhdGgoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnBhdGhfc3BlY2lmaWVkOgorICAgICAgICAgICAgcmVxX3BhdGggPSByZXF1ZXN0X3BhdGgocmVxdWVzdCkKKyAgICAgICAgICAgIGlmICgoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgIChjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc19zZXRfcGF0aCkpIGFuZAorICAgICAgICAgICAgICAgIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKGNvb2tpZS5wYXRoKSk6CisgICAgICAgICAgICAgICAgZGVidWcoIiAgIHBhdGggYXR0cmlidXRlICVzIGlzIG5vdCBhIHByZWZpeCBvZiByZXF1ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAicGF0aCAlcyIsIGNvb2tpZS5wYXRoLCByZXFfcGF0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2tfZG9tYWluKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIHNlbGYuaXNfYmxvY2tlZChjb29raWUuZG9tYWluKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgY29va2llLmRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmlzX25vdF9hbGxvd2VkKGNvb2tpZS5kb21haW4pOgorICAgICAgICAgICAgZGVidWcoIiAgIGRvbWFpbiAlcyBpcyBub3QgaW4gdXNlciBhbGxvdy1saXN0IiwgY29va2llLmRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBjb29raWUuZG9tYWluX3NwZWNpZmllZDoKKyAgICAgICAgICAgIHJlcV9ob3N0LCBlcmhuID0gZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgICAgICAgICAgZG9tYWluID0gY29va2llLmRvbWFpbgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3RfZG9tYWluIGFuZCAoZG9tYWluLmNvdW50KCIuIikgPj0gMik6CisgICAgICAgICAgICAgICAgaSA9IGRvbWFpbi5yZmluZCgiLiIpCisgICAgICAgICAgICAgICAgaiA9IGRvbWFpbi5yZmluZCgiLiIsIDAsIGkpCisgICAgICAgICAgICAgICAgaWYgaiA9PSAwOiAgIyBkb21haW4gbGlrZSAuZm9vLmJhcgorICAgICAgICAgICAgICAgICAgICB0bGQgPSBkb21haW5baSsxOl0KKyAgICAgICAgICAgICAgICAgICAgc2xkID0gZG9tYWluW2orMTppXQorICAgICAgICAgICAgICAgICAgICBpZiAoc2xkLmxvd2VyKCkgaW4gWworICAgICAgICAgICAgICAgICAgICAgICAgImNvIiwgImFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20iLCAiZWR1IiwgIm9yZyIsICJuZXQiLCAiZ292IiwgIm1pbCIsICJpbnQiXSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbih0bGQpID09IDIpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gbGlrZSAuY28udWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBjb3VudHJ5LWNvZGUgc2Vjb25kIGxldmVsIGRvbWFpbiAlcyIsIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgZG9tYWluLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgICAgICB1bmRvdHRlZF9kb21haW4gPSBkb21haW5bMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuZG90dGVkX2RvbWFpbiA9IGRvbWFpbgorICAgICAgICAgICAgZW1iZWRkZWRfZG90cyA9ICh1bmRvdHRlZF9kb21haW4uZmluZCgiLiIpID49IDApCisgICAgICAgICAgICBpZiBub3QgZW1iZWRkZWRfZG90cyBhbmQgZG9tYWluICE9ICIubG9jYWwiOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICBub24tbG9jYWwgZG9tYWluICVzIGNvbnRhaW5zIG5vIGVtYmVkZGVkIGRvdCIsCisgICAgICAgICAgICAgICAgICAgICAgZG9tYWluKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiAobm90IGVyaG4uZW5kc3dpdGgoZG9tYWluKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgKG5vdCBlcmhuLnN0YXJ0c3dpdGgoIi4iKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIG5vdCAoIi4iK2VyaG4pLmVuZHN3aXRoKGRvbWFpbikpKToKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIGVmZmVjdGl2ZSByZXF1ZXN0LWhvc3QgJXMgKGV2ZW4gd2l0aCBhZGRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsIGRvdCkgZG9lcyBub3QgZW5kIGVuZCB3aXRoICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJobiwgZG9tYWluKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA+IDAgb3IKKyAgICAgICAgICAgICAgICAoc2VsZi5zdHJpY3RfbnNfZG9tYWluICYgc2VsZi5Eb21haW5SRkMyOTY1TWF0Y2gpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgZG9tYWluX21hdGNoKGVyaG4sIGRvbWFpbik6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluU3RyaWN0Tm9Eb3RzKSk6CisgICAgICAgICAgICAgICAgaG9zdF9wcmVmaXggPSByZXFfaG9zdFs6LWxlbihkb21haW4pXQorICAgICAgICAgICAgICAgIGlmIChob3N0X3ByZWZpeC5maW5kKCIuIikgPj0gMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IElQVjRfUkUuc2VhcmNoKHJlcV9ob3N0KSk6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBob3N0IHByZWZpeCAlcyBmb3IgZG9tYWluICVzIGNvbnRhaW5zIGEgZG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9wcmVmaXgsIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3BvcnQoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnBvcnRfc3BlY2lmaWVkOgorICAgICAgICAgICAgcmVxX3BvcnQgPSByZXF1ZXN0X3BvcnQocmVxdWVzdCkKKyAgICAgICAgICAgIGlmIHJlcV9wb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmVxX3BvcnQgPSAiODAiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcV9wb3J0ID0gc3RyKHJlcV9wb3J0KQorICAgICAgICAgICAgZm9yIHAgaW4gY29va2llLnBvcnQuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGludChwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgYmFkIHBvcnQgJXMgKG5vdCBudW1lcmljKSIsIHApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHAgPT0gcmVxX3BvcnQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICByZXF1ZXN0IHBvcnQgKCVzKSBub3QgZm91bmQgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHJlcV9wb3J0LCBjb29raWUucG9ydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiCisgICAgICAgIElmIHlvdSBvdmVycmlkZSAucmV0dXJuX29rKCksIGJlIHN1cmUgdG8gY2FsbCB0aGlzIG1ldGhvZC4gIElmIGl0CisgICAgICAgIHJldHVybnMgZmFsc2UsIHNvIHNob3VsZCB5b3VyIHN1YmNsYXNzIChhc3N1bWluZyB5b3VyIHN1YmNsYXNzIHdhbnRzIHRvCisgICAgICAgIGJlIG1vcmUgc3RyaWN0IGFib3V0IHdoaWNoIGNvb2tpZXMgdG8gcmV0dXJuKS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBQYXRoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBieSAucGF0aF9yZXR1cm5fb2soKSwgYW5kIGRvbWFpbgorICAgICAgICAjIGJsb2NraW5nIGRvbmUgYnkgLmRvbWFpbl9yZXR1cm5fb2soKS4KKyAgICAgICAgZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisKKyAgICAgICAgZm9yIG4gaW4gInZlcnNpb24iLCAidmVyaWZpYWJpbGl0eSIsICJzZWN1cmUiLCAiZXhwaXJlcyIsICJwb3J0IiwgImRvbWFpbiI6CisgICAgICAgICAgICBmbl9uYW1lID0gInJldHVybl9va18iK24KKyAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzZWxmLCBmbl9uYW1lKQorICAgICAgICAgICAgaWYgbm90IGZuKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3ZlcnNpb24oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3Qgc2VsZi5yZmMyOTY1OgorICAgICAgICAgICAgZGVidWcoIiAgIFJGQyAyOTY1IGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3Qgc2VsZi5uZXRzY2FwZToKKyAgICAgICAgICAgIGRlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3ZlcmlmaWFiaWxpdHkoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgcmVxdWVzdC5pc191bnZlcmlmaWFibGUoKSBhbmQgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICB0aGlyZC1wYXJ0eSBSRkMgMjk2NSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uIikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIGRlYnVnKCIgICB0aGlyZC1wYXJ0eSBOZXRzY2FwZSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uIikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfc2VjdXJlKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5zZWN1cmUgYW5kIHJlcXVlc3QuZ2V0X3R5cGUoKSAhPSAiaHR0cHMiOgorICAgICAgICAgICAgZGVidWcoIiAgIHNlY3VyZSBjb29raWUgd2l0aCBub24tc2VjdXJlIHJlcXVlc3QiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX2V4cGlyZXMoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLmlzX2V4cGlyZWQoc2VsZi5fbm93KToKKyAgICAgICAgICAgIGRlYnVnKCIgICBjb29raWUgZXhwaXJlZCIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfcG9ydChzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUucG9ydDoKKyAgICAgICAgICAgIHJlcV9wb3J0ID0gcmVxdWVzdF9wb3J0KHJlcXVlc3QpCisgICAgICAgICAgICBpZiByZXFfcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJlcV9wb3J0ID0gIjgwIgorICAgICAgICAgICAgZm9yIHAgaW4gY29va2llLnBvcnQuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICBpZiBwID09IHJlcV9wb3J0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICVzIGRvZXMgbm90IG1hdGNoIGNvb2tpZSBwb3J0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXFfcG9ydCwgY29va2llLnBvcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX2RvbWFpbihzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgZG9tYWluID0gY29va2llLmRvbWFpbgorCisgICAgICAgICMgc3RyaWN0IGNoZWNrIG9mIG5vbi1kb21haW4gY29va2llczogTW96aWxsYSBkb2VzIHRoaXMsIE1TSUU1IGRvZXNuJ3QKKyAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID09IDAgYW5kCisgICAgICAgICAgICAoc2VsZi5zdHJpY3RfbnNfZG9tYWluICYgc2VsZi5Eb21haW5TdHJpY3ROb25Eb21haW4pIGFuZAorICAgICAgICAgICAgbm90IGNvb2tpZS5kb21haW5fc3BlY2lmaWVkIGFuZCBkb21haW4gIT0gZXJobik6CisgICAgICAgICAgICBkZWJ1ZygiICAgY29va2llIHdpdGggdW5zcGVjaWZpZWQgZG9tYWluIGRvZXMgbm90IHN0cmluZy1jb21wYXJlICIKKyAgICAgICAgICAgICAgICAgICJlcXVhbCB0byByZXF1ZXN0IGRvbWFpbiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIG5vdCBkb21haW5fbWF0Y2goZXJobiwgZG9tYWluKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgJXMgZG9lcyBub3QgZG9tYWluLW1hdGNoICIKKyAgICAgICAgICAgICAgICAgICJSRkMgMjk2NSBjb29raWUgZG9tYWluICVzIiwgZXJobiwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIG5vdCAoIi4iK2VyaG4pLmVuZHN3aXRoKGRvbWFpbik6CisgICAgICAgICAgICBkZWJ1ZygiICAgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IG1hdGNoIE5ldHNjYXBlIGNvb2tpZSBkb21haW4gIgorICAgICAgICAgICAgICAgICAgIiVzIiwgcmVxX2hvc3QsIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvbWFpbl9yZXR1cm5fb2soc2VsZiwgZG9tYWluLCByZXF1ZXN0KToKKyAgICAgICAgIyBMaWJlcmFsIGNoZWNrIG9mLiAgVGhpcyBpcyBoZXJlIGFzIGFuIG9wdGltaXphdGlvbiB0byBhdm9pZAorICAgICAgICAjIGhhdmluZyB0byBsb2FkIGxvdHMgb2YgTVNJRSBjb29raWUgZmlsZXMgdW5sZXNzIG5lY2Vzc2FyeS4KKyAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgIGlmIG5vdCByZXFfaG9zdC5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICBkb3R0ZWRfcmVxX2hvc3QgPSAiLiIrcmVxX2hvc3QKKyAgICAgICAgaWYgbm90IGVyaG4uc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgZG90dGVkX2VyaG4gPSAiLiIrZXJobgorICAgICAgICBpZiBub3QgKGRvdHRlZF9yZXFfaG9zdC5lbmRzd2l0aChkb21haW4pIG9yCisgICAgICAgICAgICAgICAgZG90dGVkX2VyaG4uZW5kc3dpdGgoZG9tYWluKSk6CisgICAgICAgICAgICAjZGVidWcoIiAgIHJlcXVlc3QgZG9tYWluICVzIGRvZXMgbm90IG1hdGNoIGNvb2tpZSBkb21haW4gJXMiLAorICAgICAgICAgICAgIyAgICAgIHJlcV9ob3N0LCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLmlzX2Jsb2NrZWQoZG9tYWluKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuaXNfbm90X2FsbG93ZWQoZG9tYWluKToKKyAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgbm90IGluIHVzZXIgYWxsb3ctbGlzdCIsIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcGF0aF9yZXR1cm5fb2soc2VsZiwgcGF0aCwgcmVxdWVzdCk6CisgICAgICAgIGRlYnVnKCItIGNoZWNraW5nIGNvb2tpZSBwYXRoPSVzIiwgcGF0aCkKKyAgICAgICAgcmVxX3BhdGggPSByZXF1ZXN0X3BhdGgocmVxdWVzdCkKKyAgICAgICAgaWYgbm90IHJlcV9wYXRoLnN0YXJ0c3dpdGgocGF0aCk6CisgICAgICAgICAgICBkZWJ1ZygiICAlcyBkb2VzIG5vdCBwYXRoLW1hdGNoICVzIiwgcmVxX3BhdGgsIHBhdGgpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitkZWYgdmFsc19zb3J0ZWRfYnlfa2V5KGFkaWN0KToKKyAgICBrZXlzID0gYWRpY3Qua2V5cygpCisgICAga2V5cy5zb3J0KCkKKyAgICByZXR1cm4gbWFwKGFkaWN0LmdldCwga2V5cykKKworZGVmIGRlZXB2YWx1ZXMobWFwcGluZyk6CisgICAgIiIiSXRlcmF0ZXMgb3ZlciBuZXN0ZWQgbWFwcGluZywgZGVwdGgtZmlyc3QsIGluIHNvcnRlZCBvcmRlciBieSBrZXkuIiIiCisgICAgdmFsdWVzID0gdmFsc19zb3J0ZWRfYnlfa2V5KG1hcHBpbmcpCisgICAgZm9yIG9iaiBpbiB2YWx1ZXM6CisgICAgICAgIG1hcHBpbmcgPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmouaXRlbXMKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWFwcGluZyA9IFRydWUKKyAgICAgICAgICAgIGZvciBzdWJvYmogaW4gZGVlcHZhbHVlcyhvYmopOgorICAgICAgICAgICAgICAgIHlpZWxkIHN1Ym9iagorICAgICAgICBpZiBub3QgbWFwcGluZzoKKyAgICAgICAgICAgIHlpZWxkIG9iagorCisKKyMgVXNlZCBhcyBzZWNvbmQgcGFyYW1ldGVyIHRvIGRpY3QuZ2V0KCkgbWV0aG9kLCB0byBkaXN0aW5ndWlzaCBhYnNlbnQKKyMgZGljdCBrZXkgZnJvbSBvbmUgd2l0aCBhIE5vbmUgdmFsdWUuCitjbGFzcyBBYnNlbnQ6IHBhc3MKKworY2xhc3MgQ29va2llSmFyOgorICAgICIiIkNvbGxlY3Rpb24gb2YgSFRUUCBjb29raWVzLgorCisgICAgWW91IG1heSBub3QgbmVlZCB0byBrbm93IGFib3V0IHRoaXMgY2xhc3M6IHRyeQorICAgIHVybGxpYjIuYnVpbGRfb3BlbmVyKEhUVFBDb29raWVQcm9jZXNzb3IpLm9wZW4odXJsKS4KKworICAgICIiIgorCisgICAgbm9uX3dvcmRfcmUgPSByZS5jb21waWxlKHIiXFciKQorICAgIHF1b3RlX3JlID0gcmUuY29tcGlsZShyIihbXCJcXF0pIikKKyAgICBzdHJpY3RfZG9tYWluX3JlID0gcmUuY29tcGlsZShyIlwuP1teLl0qIikKKyAgICBkb21haW5fcmUgPSByZS5jb21waWxlKHIiW14uXSoiKQorICAgIGRvdHNfcmUgPSByZS5jb21waWxlKHIiXlwuKyIpCisKKyAgICBtYWdpY19yZSA9IHIiXlwjTFdQLUNvb2tpZXMtKFxkK1wuXGQrKSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb2xpY3k9Tm9uZSk6CisgICAgICAgIGlmIHBvbGljeSBpcyBOb25lOgorICAgICAgICAgICAgcG9saWN5ID0gRGVmYXVsdENvb2tpZVBvbGljeSgpCisgICAgICAgIHNlbGYuX3BvbGljeSA9IHBvbGljeQorCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jayA9IF90aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBzZWxmLl9jb29raWVzID0ge30KKworICAgIGRlZiBzZXRfcG9saWN5KHNlbGYsIHBvbGljeSk6CisgICAgICAgIHNlbGYuX3BvbGljeSA9IHBvbGljeQorCisgICAgZGVmIF9jb29raWVzX2Zvcl9kb21haW4oc2VsZiwgZG9tYWluLCByZXF1ZXN0KToKKyAgICAgICAgY29va2llcyA9IFtdCisgICAgICAgIGlmIG5vdCBzZWxmLl9wb2xpY3kuZG9tYWluX3JldHVybl9vayhkb21haW4sIHJlcXVlc3QpOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGRlYnVnKCJDaGVja2luZyAlcyBmb3IgY29va2llcyB0byByZXR1cm4iLCBkb21haW4pCisgICAgICAgIGNvb2tpZXNfYnlfcGF0aCA9IHNlbGYuX2Nvb2tpZXNbZG9tYWluXQorICAgICAgICBmb3IgcGF0aCBpbiBjb29raWVzX2J5X3BhdGgua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5wYXRoX3JldHVybl9vayhwYXRoLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgY29va2llc19ieV9uYW1lID0gY29va2llc19ieV9wYXRoW3BhdGhdCisgICAgICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXNfYnlfbmFtZS52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcG9saWN5LnJldHVybl9vayhjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbm90IHJldHVybmluZyBjb29raWUiKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlYnVnKCIgICBpdCdzIGEgbWF0Y2giKQorICAgICAgICAgICAgICAgIGNvb2tpZXMuYXBwZW5kKGNvb2tpZSkKKyAgICAgICAgcmV0dXJuIGNvb2tpZXMKKworICAgIGRlZiBfY29va2llc19mb3JfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb29raWVzIHRvIGJlIHJldHVybmVkIHRvIHNlcnZlci4iIiIKKyAgICAgICAgY29va2llcyA9IFtdCisgICAgICAgIGZvciBkb21haW4gaW4gc2VsZi5fY29va2llcy5rZXlzKCk6CisgICAgICAgICAgICBjb29raWVzLmV4dGVuZChzZWxmLl9jb29raWVzX2Zvcl9kb21haW4oZG9tYWluLCByZXF1ZXN0KSkKKyAgICAgICAgcmV0dXJuIGNvb2tpZXMKKworICAgIGRlZiBfY29va2llX2F0dHJzKHNlbGYsIGNvb2tpZXMpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvb2tpZS1hdHRyaWJ1dGVzIHRvIGJlIHJldHVybmVkIHRvIHNlcnZlci4KKworICAgICAgICBsaWtlIFsnZm9vPSJiYXIiOyAkUGF0aD0iLyInLCAuLi5dCisKKyAgICAgICAgVGhlICRWZXJzaW9uIGF0dHJpYnV0ZSBpcyBhbHNvIGFkZGVkIHdoZW4gYXBwcm9wcmlhdGUgKGN1cnJlbnRseSBvbmx5CisgICAgICAgIG9uY2UgcGVyIHJlcXVlc3QpLgorCisgICAgICAgICIiIgorICAgICAgICAjIGFkZCBjb29raWVzIGluIG9yZGVyIG9mIG1vc3Qgc3BlY2lmaWMgKGllLiBsb25nZXN0KSBwYXRoIGZpcnN0CisgICAgICAgIGRlZiBkZWNyZWFzaW5nX3NpemUoYSwgYik6IHJldHVybiBjbXAobGVuKGIucGF0aCksIGxlbihhLnBhdGgpKQorICAgICAgICBjb29raWVzLnNvcnQoZGVjcmVhc2luZ19zaXplKQorCisgICAgICAgIHZlcnNpb25fc2V0ID0gRmFsc2UKKworICAgICAgICBhdHRycyA9IFtdCisgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKKyAgICAgICAgICAgICMgc2V0IHZlcnNpb24gb2YgQ29va2llIGhlYWRlcgorICAgICAgICAgICAgIyBYWFgKKyAgICAgICAgICAgICMgV2hhdCBzaG91bGQgaXQgYmUgaWYgbXVsdGlwbGUgbWF0Y2hpbmcgU2V0LUNvb2tpZSBoZWFkZXJzIGhhdmUKKyAgICAgICAgICAgICMgIGRpZmZlcmVudCB2ZXJzaW9ucyB0aGVtc2VsdmVzPworICAgICAgICAgICAgIyBBbnN3ZXI6IHRoZXJlIGlzIG5vIGFuc3dlcjsgd2FzIHN1cHBvc2VkIHRvIGJlIHNldHRsZWQgYnkKKyAgICAgICAgICAgICMgIFJGQyAyOTY1IGVycmF0YSwgYnV0IHRoYXQgbWF5IG5ldmVyIGFwcGVhci4uLgorICAgICAgICAgICAgdmVyc2lvbiA9IGNvb2tpZS52ZXJzaW9uCisgICAgICAgICAgICBpZiBub3QgdmVyc2lvbl9zZXQ6CisgICAgICAgICAgICAgICAgdmVyc2lvbl9zZXQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgdmVyc2lvbiA+IDA6CisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgiJFZlcnNpb249JXMiICUgdmVyc2lvbikKKworICAgICAgICAgICAgIyBxdW90ZSBjb29raWUgdmFsdWUgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAjIChub3QgZm9yIE5ldHNjYXBlIHByb3RvY29sLCB3aGljaCBhbHJlYWR5IGhhcyBhbnkgcXVvdGVzCisgICAgICAgICAgICAjICBpbnRhY3QsIGR1ZSB0byB0aGUgcG9vcmx5LXNwZWNpZmllZCBOZXRzY2FwZSBDb29raWU6IHN5bnRheCkKKyAgICAgICAgICAgIGlmICgoY29va2llLnZhbHVlIGlzIG5vdCBOb25lKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLm5vbl93b3JkX3JlLnNlYXJjaChjb29raWUudmFsdWUpIGFuZCB2ZXJzaW9uID4gMCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnF1b3RlX3JlLnN1YihyIlxcXDEiLCBjb29raWUudmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gY29va2llLnZhbHVlCisKKyAgICAgICAgICAgICMgYWRkIGNvb2tpZS1hdHRyaWJ1dGVzIHRvIGJlIHJldHVybmVkIGluIENvb2tpZSBoZWFkZXIKKyAgICAgICAgICAgIGlmIGNvb2tpZS52YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZChjb29raWUubmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCIlcz0lcyIgJSAoY29va2llLm5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIHZlcnNpb24gPiAwOgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5wYXRoX3NwZWNpZmllZDoKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCckUGF0aD0iJXMiJyAlIGNvb2tpZS5wYXRoKQorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4uc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBjb29raWUuZG9tYWluCisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgY29va2llLmRvbWFpbl9pbml0aWFsX2RvdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbi5zdGFydHN3aXRoKCIuIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gZG9tYWluWzE6XQorICAgICAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoJyREb21haW49IiVzIicgJSBkb21haW4pCisgICAgICAgICAgICAgICAgaWYgY29va2llLnBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHAgPSAiJFBvcnQiCisgICAgICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5wb3J0X3NwZWNpZmllZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwICsgKCc9IiVzIicgJSBjb29raWUucG9ydCkKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKHApCisKKyAgICAgICAgcmV0dXJuIGF0dHJzCisKKyAgICBkZWYgYWRkX2Nvb2tpZV9oZWFkZXIoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIkFkZCBjb3JyZWN0IENvb2tpZTogaGVhZGVyIHRvIHJlcXVlc3QgKHVybGxpYjIuUmVxdWVzdCBvYmplY3QpLgorCisgICAgICAgIFRoZSBDb29raWUyIGhlYWRlciBpcyBhbHNvIGFkZGVkIHVubGVzcyBwb2xpY3kuaGlkZV9jb29raWUyIGlzIHRydWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGRlYnVnKCJhZGRfY29va2llX2hlYWRlciIpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKworICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKKworICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgc3RyaWN0X25vbl9kb21haW4gPSAoCisgICAgICAgICAgICBzZWxmLl9wb2xpY3kuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuX3BvbGljeS5Eb21haW5TdHJpY3ROb25Eb21haW4pCisKKyAgICAgICAgY29va2llcyA9IHNlbGYuX2Nvb2tpZXNfZm9yX3JlcXVlc3QocmVxdWVzdCkKKworICAgICAgICBhdHRycyA9IHNlbGYuX2Nvb2tpZV9hdHRycyhjb29raWVzKQorICAgICAgICBpZiBhdHRyczoKKyAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoIkNvb2tpZSIpOgorICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICJDb29raWUiLCAiOyAiLmpvaW4oYXR0cnMpKQorCisgICAgICAgICMgaWYgbmVjZXNzYXJ5LCBhZHZlcnRpc2UgdGhhdCB3ZSBrbm93IFJGQyAyOTY1CisgICAgICAgIGlmIChzZWxmLl9wb2xpY3kucmZjMjk2NSBhbmQgbm90IHNlbGYuX3BvbGljeS5oaWRlX2Nvb2tpZTIgYW5kCisgICAgICAgICAgICBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCJDb29raWUyIikpOgorICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzOgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uICE9IDE6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIkNvb2tpZTIiLCAnJFZlcnNpb249IjEiJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICAgICAgc2VsZi5jbGVhcl9leHBpcmVkX2Nvb2tpZXMoKQorCisgICAgZGVmIF9ub3JtYWxpemVkX2Nvb2tpZV90dXBsZXMoc2VsZiwgYXR0cnNfc2V0KToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgdHVwbGVzIGNvbnRhaW5pbmcgbm9ybWFsaXNlZCBjb29raWUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgYXR0cnNfc2V0IGlzIHRoZSBsaXN0IG9mIGxpc3RzIG9mIGtleSx2YWx1ZSBwYWlycyBleHRyYWN0ZWQgZnJvbQorICAgICAgICB0aGUgU2V0LUNvb2tpZSBvciBTZXQtQ29va2llMiBoZWFkZXJzLgorCisgICAgICAgIFR1cGxlcyBhcmUgbmFtZSwgdmFsdWUsIHN0YW5kYXJkLCByZXN0LCB3aGVyZSBuYW1lIGFuZCB2YWx1ZSBhcmUgdGhlCisgICAgICAgIGNvb2tpZSBuYW1lIGFuZCB2YWx1ZSwgc3RhbmRhcmQgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkCisgICAgICAgIGNvb2tpZS1hdHRyaWJ1dGVzIChkaXNjYXJkLCBzZWN1cmUsIHZlcnNpb24sIGV4cGlyZXMgb3IgbWF4LWFnZSwKKyAgICAgICAgZG9tYWluLCBwYXRoIGFuZCBwb3J0KSBhbmQgcmVzdCBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcmVzdCBvZgorICAgICAgICB0aGUgY29va2llLWF0dHJpYnV0ZXMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGNvb2tpZV90dXBsZXMgPSBbXQorCisgICAgICAgIGJvb2xlYW5fYXR0cnMgPSAiZGlzY2FyZCIsICJzZWN1cmUiCisgICAgICAgIHZhbHVlX2F0dHJzID0gKCJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMiLCAibWF4LWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJkb21haW4iLCAicGF0aCIsICJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbW1lbnQiLCAiY29tbWVudHVybCIpCisKKyAgICAgICAgZm9yIGNvb2tpZV9hdHRycyBpbiBhdHRyc19zZXQ6CisgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGNvb2tpZV9hdHRyc1swXQorCisgICAgICAgICAgICAjIEJ1aWxkIGRpY3Rpb25hcnkgb2Ygc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMgKHN0YW5kYXJkKSBhbmQKKyAgICAgICAgICAgICMgZGljdGlvbmFyeSBvZiBvdGhlciBjb29raWUtYXR0cmlidXRlcyAocmVzdCkuCisKKyAgICAgICAgICAgICMgTm90ZTogZXhwaXJ5IHRpbWUgaXMgbm9ybWFsaXNlZCB0byBzZWNvbmRzIHNpbmNlIGVwb2NoLiAgVjAKKyAgICAgICAgICAgICMgY29va2llcyBzaG91bGQgaGF2ZSB0aGUgRXhwaXJlcyBjb29raWUtYXR0cmlidXRlLCBhbmQgVjEgY29va2llcworICAgICAgICAgICAgIyBzaG91bGQgaGF2ZSBNYXgtQWdlLCBidXQgc2luY2UgVjEgaW5jbHVkZXMgUkZDIDIxMDkgY29va2llcyAoYW5kCisgICAgICAgICAgICAjIHNpbmNlIFYwIGNvb2tpZXMgbWF5IGJlIGEgbWlzaC1tYXNoIG9mIE5ldHNjYXBlIGFuZCBSRkMgMjEwOSksIHdlCisgICAgICAgICAgICAjIGFjY2VwdCBlaXRoZXIgKGJ1dCBwcmVmZXIgTWF4LUFnZSkuCisgICAgICAgICAgICBtYXhfYWdlX3NldCA9IEZhbHNlCisKKyAgICAgICAgICAgIGJhZF9jb29raWUgPSBGYWxzZQorCisgICAgICAgICAgICBzdGFuZGFyZCA9IHt9CisgICAgICAgICAgICByZXN0ID0ge30KKyAgICAgICAgICAgIGZvciBrLCB2IGluIGNvb2tpZV9hdHRyc1sxOl06CisgICAgICAgICAgICAgICAgbGMgPSBrLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAjIGRvbid0IGxvc2UgY2FzZSBkaXN0aW5jdGlvbiBmb3IgdW5rbm93biBmaWVsZHMKKyAgICAgICAgICAgICAgICBpZiBsYyBpbiB2YWx1ZV9hdHRycyBvciBsYyBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICBrID0gbGMKKyAgICAgICAgICAgICAgICBpZiBrIGluIGJvb2xlYW5fYXR0cnMgYW5kIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBib29sZWFuIGNvb2tpZS1hdHRyaWJ1dGUgaXMgcHJlc2VudCwgYnV0IGhhcyBubyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAjIChsaWtlICJkaXNjYXJkIiwgcmF0aGVyIHRoYW4gInBvcnQ9ODAiKQorICAgICAgICAgICAgICAgICAgICB2ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGsgaW4gc3RhbmRhcmQ6CisgICAgICAgICAgICAgICAgICAgICMgb25seSBmaXJzdCB2YWx1ZSBpcyBzaWduaWZpY2FudAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGsgPT0gImRvbWFpbiI6CisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBtaXNzaW5nIHZhbHVlIGZvciBkb21haW4gYXR0cmlidXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9jb29raWUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAjIFJGQyAyOTY1IHNlY3Rpb24gMy4zLjMKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIGsgPT0gImV4cGlyZXMiOgorICAgICAgICAgICAgICAgICAgICBpZiBtYXhfYWdlX3NldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUHJlZmVyIG1heC1hZ2UgdG8gZXhwaXJlcyAobGlrZSBNb3ppbGxhKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIG1pc3Npbmcgb3IgaW52YWxpZCB2YWx1ZSBmb3IgZXhwaXJlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlOiB0cmVhdGluZyBhcyBzZXNzaW9uIGNvb2tpZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGsgPT0gIm1heC1hZ2UiOgorICAgICAgICAgICAgICAgICAgICBtYXhfYWdlX3NldCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBtaXNzaW5nIG9yIGludmFsaWQgKG5vbi1udW1lcmljKSB2YWx1ZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC1hZ2UgYXR0cmlidXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9jb29raWUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgUkZDIDI5NjUgTWF4LUFnZSB0byBzZWNvbmRzIHNpbmNlIGVwb2NoCisgICAgICAgICAgICAgICAgICAgICMgWFhYIFN0cmljdGx5IHlvdSdyZSBzdXBwb3NlZCB0byBmb2xsb3cgUkZDIDI2MTYKKyAgICAgICAgICAgICAgICAgICAgIyAgIGFnZS1jYWxjdWxhdGlvbiBydWxlcy4gIFJlbWVtYmVyIHRoYXQgemVybyBNYXgtQWdlIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgIyAgIGlzIGEgcmVxdWVzdCB0byBkaXNjYXJkIChvbGQgYW5kIG5ldykgY29va2llLCB0aG91Z2guCisgICAgICAgICAgICAgICAgICAgIGsgPSAiZXhwaXJlcyIKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX25vdyArIHYKKyAgICAgICAgICAgICAgICBpZiAoayBpbiB2YWx1ZV9hdHRycykgb3IgKGsgaW4gYm9vbGVhbl9hdHRycyk6CisgICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBrIG5vdCBpbiBbInBvcnQiLCAiY29tbWVudCIsICJjb21tZW50dXJsIl0pOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIG1pc3NpbmcgdmFsdWUgZm9yICVzIGF0dHJpYnV0ZSIgJSBrKQorICAgICAgICAgICAgICAgICAgICAgICAgYmFkX2Nvb2tpZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkW2tdID0gdgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3Rba10gPSB2CisKKyAgICAgICAgICAgIGlmIGJhZF9jb29raWU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgY29va2llX3R1cGxlcy5hcHBlbmQoKG5hbWUsIHZhbHVlLCBzdGFuZGFyZCwgcmVzdCkpCisKKyAgICAgICAgcmV0dXJuIGNvb2tpZV90dXBsZXMKKworICAgIGRlZiBfY29va2llX2Zyb21fY29va2llX3R1cGxlKHNlbGYsIHR1cCwgcmVxdWVzdCk6CisgICAgICAgICMgc3RhbmRhcmQgaXMgZGljdCBvZiBzdGFuZGFyZCBjb29raWUtYXR0cmlidXRlcywgcmVzdCBpcyBkaWN0IG9mIHRoZQorICAgICAgICAjIHJlc3Qgb2YgdGhlbQorICAgICAgICBuYW1lLCB2YWx1ZSwgc3RhbmRhcmQsIHJlc3QgPSB0dXAKKworICAgICAgICBkb21haW4gPSBzdGFuZGFyZC5nZXQoImRvbWFpbiIsIEFic2VudCkKKyAgICAgICAgcGF0aCA9IHN0YW5kYXJkLmdldCgicGF0aCIsIEFic2VudCkKKyAgICAgICAgcG9ydCA9IHN0YW5kYXJkLmdldCgicG9ydCIsIEFic2VudCkKKyAgICAgICAgZXhwaXJlcyA9IHN0YW5kYXJkLmdldCgiZXhwaXJlcyIsIEFic2VudCkKKworICAgICAgICAjIHNldCB0aGUgZWFzeSBkZWZhdWx0cworICAgICAgICB2ZXJzaW9uID0gc3RhbmRhcmQuZ2V0KCJ2ZXJzaW9uIiwgTm9uZSkKKyAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZTogdmVyc2lvbiA9IGludCh2ZXJzaW9uKQorICAgICAgICBzZWN1cmUgPSBzdGFuZGFyZC5nZXQoInNlY3VyZSIsIEZhbHNlKQorICAgICAgICAjIChkaXNjYXJkIGlzIGFsc28gc2V0IGlmIGV4cGlyZXMgaXMgQWJzZW50KQorICAgICAgICBkaXNjYXJkID0gc3RhbmRhcmQuZ2V0KCJkaXNjYXJkIiwgRmFsc2UpCisgICAgICAgIGNvbW1lbnQgPSBzdGFuZGFyZC5nZXQoImNvbW1lbnQiLCBOb25lKQorICAgICAgICBjb21tZW50X3VybCA9IHN0YW5kYXJkLmdldCgiY29tbWVudHVybCIsIE5vbmUpCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBwYXRoCisgICAgICAgIGlmIHBhdGggaXMgbm90IEFic2VudCBhbmQgcGF0aCAhPSAiIjoKKyAgICAgICAgICAgIHBhdGhfc3BlY2lmaWVkID0gVHJ1ZQorICAgICAgICAgICAgcGF0aCA9IGVzY2FwZV9wYXRoKHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoX3NwZWNpZmllZCA9IEZhbHNlCisgICAgICAgICAgICBwYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgICAgICBpID0gcGF0aC5yZmluZCgiLyIpCisgICAgICAgICAgICBpZiBpICE9IC0xOgorICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBOZXRzY2FwZSBzcGVjIHBhcnRzIGNvbXBhbnkgZnJvbSByZWFsaXR5IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmldCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmkrMV0KKyAgICAgICAgICAgIGlmIGxlbihwYXRoKSA9PSAwOiBwYXRoID0gIi8iCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBkb21haW4KKyAgICAgICAgZG9tYWluX3NwZWNpZmllZCA9IGRvbWFpbiBpcyBub3QgQWJzZW50CisgICAgICAgICMgYnV0IGZpcnN0IHdlIGhhdmUgdG8gcmVtZW1iZXIgd2hldGhlciBpdCBzdGFydHMgd2l0aCBhIGRvdAorICAgICAgICBkb21haW5faW5pdGlhbF9kb3QgPSBGYWxzZQorICAgICAgICBpZiBkb21haW5fc3BlY2lmaWVkOgorICAgICAgICAgICAgZG9tYWluX2luaXRpYWxfZG90ID0gYm9vbChkb21haW4uc3RhcnRzd2l0aCgiLiIpKQorICAgICAgICBpZiBkb21haW4gaXMgQWJzZW50OgorICAgICAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgICAgICBkb21haW4gPSBlcmhuCisgICAgICAgIGVsaWYgbm90IGRvbWFpbi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICBkb21haW4gPSAiLiIrZG9tYWluCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBwb3J0CisgICAgICAgIHBvcnRfc3BlY2lmaWVkID0gRmFsc2UKKyAgICAgICAgaWYgcG9ydCBpcyBub3QgQWJzZW50OgorICAgICAgICAgICAgaWYgcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgUG9ydCBhdHRyIHByZXNlbnQsIGJ1dCBoYXMgbm8gdmFsdWU6IGRlZmF1bHQgdG8gcmVxdWVzdCBwb3J0LgorICAgICAgICAgICAgICAgICMgQ29va2llIHNob3VsZCB0aGVuIG9ubHkgYmUgc2VudCBiYWNrIG9uIHRoYXQgcG9ydC4KKyAgICAgICAgICAgICAgICBwb3J0ID0gcmVxdWVzdF9wb3J0KHJlcXVlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvcnRfc3BlY2lmaWVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHBvcnQgPSByZS5zdWIociJccysiLCAiIiwgcG9ydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm8gcG9ydCBhdHRyIHByZXNlbnQuICBDb29raWUgY2FuIGJlIHNlbnQgYmFjayBvbiBhbnkgcG9ydC4KKyAgICAgICAgICAgIHBvcnQgPSBOb25lCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBleHBpcmVzIGFuZCBkaXNjYXJkCisgICAgICAgIGlmIGV4cGlyZXMgaXMgQWJzZW50OgorICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKKyAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisgICAgICAgIGVsaWYgZXhwaXJlcyA8PSBzZWxmLl9ub3c6CisgICAgICAgICAgICAjIEV4cGlyeSBkYXRlIGluIHBhc3QgaXMgcmVxdWVzdCB0byBkZWxldGUgY29va2llLiAgVGhpcyBjYW4ndCBiZQorICAgICAgICAgICAgIyBpbiBEZWZhdWx0Q29va2llUG9saWN5LCBiZWNhdXNlIGNhbid0IGRlbGV0ZSBjb29raWVzIHRoZXJlLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoZG9tYWluLCBwYXRoLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlYnVnKCJFeHBpcmluZyBjb29raWUsIGRvbWFpbj0nJXMnLCBwYXRoPSclcycsIG5hbWU9JyVzJyIsCisgICAgICAgICAgICAgICAgICBkb21haW4sIHBhdGgsIG5hbWUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBDb29raWUodmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3J0LCBwb3J0X3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIGRvbWFpbl9pbml0aWFsX2RvdCwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBwYXRoX3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29tbWVudF91cmwsCisgICAgICAgICAgICAgICAgICAgICAgcmVzdCkKKworICAgIGRlZiBfY29va2llc19mcm9tX2F0dHJzX3NldChzZWxmLCBhdHRyc19zZXQsIHJlcXVlc3QpOgorICAgICAgICBjb29raWVfdHVwbGVzID0gc2VsZi5fbm9ybWFsaXplZF9jb29raWVfdHVwbGVzKGF0dHJzX3NldCkKKworICAgICAgICBjb29raWVzID0gW10KKyAgICAgICAgZm9yIHR1cCBpbiBjb29raWVfdHVwbGVzOgorICAgICAgICAgICAgY29va2llID0gc2VsZi5fY29va2llX2Zyb21fY29va2llX3R1cGxlKHR1cCwgcmVxdWVzdCkKKyAgICAgICAgICAgIGlmIGNvb2tpZTogY29va2llcy5hcHBlbmQoY29va2llKQorICAgICAgICByZXR1cm4gY29va2llcworCisgICAgZGVmIG1ha2VfY29va2llcyhzZWxmLCByZXNwb25zZSwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiBzZXF1ZW5jZSBvZiBDb29raWUgb2JqZWN0cyBleHRyYWN0ZWQgZnJvbSByZXNwb25zZSBvYmplY3QuIiIiCisgICAgICAgICMgZ2V0IGNvb2tpZS1hdHRyaWJ1dGVzIGZvciBSRkMgMjk2NSBhbmQgTmV0c2NhcGUgcHJvdG9jb2xzCisgICAgICAgIGhlYWRlcnMgPSByZXNwb25zZS5pbmZvKCkKKyAgICAgICAgcmZjMjk2NV9oZHJzID0gaGVhZGVycy5nZXRoZWFkZXJzKCJTZXQtQ29va2llMiIpCisgICAgICAgIG5zX2hkcnMgPSBoZWFkZXJzLmdldGhlYWRlcnMoIlNldC1Db29raWUiKQorCisgICAgICAgIHJmYzI5NjUgPSBzZWxmLl9wb2xpY3kucmZjMjk2NQorICAgICAgICBuZXRzY2FwZSA9IHNlbGYuX3BvbGljeS5uZXRzY2FwZQorCisgICAgICAgIGlmICgobm90IHJmYzI5NjVfaGRycyBhbmQgbm90IG5zX2hkcnMpIG9yCisgICAgICAgICAgICAobm90IG5zX2hkcnMgYW5kIG5vdCByZmMyOTY1KSBvcgorICAgICAgICAgICAgKG5vdCByZmMyOTY1X2hkcnMgYW5kIG5vdCBuZXRzY2FwZSkgb3IKKyAgICAgICAgICAgIChub3QgbmV0c2NhcGUgYW5kIG5vdCByZmMyOTY1KSk6CisgICAgICAgICAgICByZXR1cm4gW10gICMgbm8gcmVsZXZhbnQgY29va2llIGhlYWRlcnM6IHF1aWNrIGV4aXQKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb29raWVzID0gc2VsZi5fY29va2llc19mcm9tX2F0dHJzX3NldCgKKyAgICAgICAgICAgICAgICBzcGxpdF9oZWFkZXJfd29yZHMocmZjMjk2NV9oZHJzKSwgcmVxdWVzdCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zKCkKKyAgICAgICAgICAgIGNvb2tpZXMgPSBbXQorCisgICAgICAgIGlmIG5zX2hkcnMgYW5kIG5ldHNjYXBlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5zX2Nvb2tpZXMgPSBzZWxmLl9jb29raWVzX2Zyb21fYXR0cnNfc2V0KAorICAgICAgICAgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKG5zX2hkcnMpLCByZXF1ZXN0KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucygpCisgICAgICAgICAgICAgICAgbnNfY29va2llcyA9IFtdCisKKyAgICAgICAgICAgICMgTG9vayBmb3IgTmV0c2NhcGUgY29va2llcyAoZnJvbSBTZXQtQ29va2llIGhlYWRlcnMpIHRoYXQgbWF0Y2gKKyAgICAgICAgICAgICMgY29ycmVzcG9uZGluZyBSRkMgMjk2NSBjb29raWVzIChmcm9tIFNldC1Db29raWUyIGhlYWRlcnMpLgorICAgICAgICAgICAgIyBGb3IgZWFjaCBtYXRjaCwga2VlcCB0aGUgUkZDIDI5NjUgY29va2llIGFuZCBpZ25vcmUgdGhlIE5ldHNjYXBlCisgICAgICAgICAgICAjIGNvb2tpZSAoUkZDIDI5NjUgc2VjdGlvbiA5LjEpLiAgQWN0dWFsbHksIFJGQyAyMTA5IGNvb2tpZXMgYXJlCisgICAgICAgICAgICAjIGJ1bmRsZWQgaW4gd2l0aCB0aGUgTmV0c2NhcGUgY29va2llcyBmb3IgdGhpcyBwdXJwb3NlLCB3aGljaCBpcworICAgICAgICAgICAgIyByZWFzb25hYmxlIGJlaGF2aW91ci4KKyAgICAgICAgICAgIGlmIHJmYzI5NjU6CisgICAgICAgICAgICAgICAgbG9va3VwID0ge30KKyAgICAgICAgICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXM6CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFsoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKV0gPSBOb25lCisKKyAgICAgICAgICAgICAgICBkZWYgbm9fbWF0Y2hpbmdfcmZjMjk2NShuc19jb29raWUsIGxvb2t1cD1sb29rdXApOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBuc19jb29raWUuZG9tYWluLCBuc19jb29raWUucGF0aCwgbnNfY29va2llLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSBub3QgaW4gbG9va3VwCisgICAgICAgICAgICAgICAgbnNfY29va2llcyA9IGZpbHRlcihub19tYXRjaGluZ19yZmMyOTY1LCBuc19jb29raWVzKQorCisgICAgICAgICAgICBpZiBuc19jb29raWVzOgorICAgICAgICAgICAgICAgIGNvb2tpZXMuZXh0ZW5kKG5zX2Nvb2tpZXMpCisKKyAgICAgICAgcmV0dXJuIGNvb2tpZXMKKworICAgIGRlZiBzZXRfY29va2llX2lmX29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIlNldCBhIGNvb2tpZSBpZiBwb2xpY3kgc2F5cyBpdCdzIE9LIHRvIGRvIHNvLiIiIgorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQorCisgICAgICAgIGlmIHNlbGYuX3BvbGljeS5zZXRfb2soY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjb29raWUpCisKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHNldF9jb29raWUoc2VsZiwgY29va2llKToKKyAgICAgICAgIiIiU2V0IGEgY29va2llLCB3aXRob3V0IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCBiZSBzZXQuIiIiCisgICAgICAgIGMgPSBzZWxmLl9jb29raWVzCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbiBub3QgaW4gYzogY1tjb29raWUuZG9tYWluXSA9IHt9CisgICAgICAgICAgICBjMiA9IGNbY29va2llLmRvbWFpbl0KKyAgICAgICAgICAgIGlmIGNvb2tpZS5wYXRoIG5vdCBpbiBjMjogYzJbY29va2llLnBhdGhdID0ge30KKyAgICAgICAgICAgIGMzID0gYzJbY29va2llLnBhdGhdCisgICAgICAgICAgICBjM1tjb29raWUubmFtZV0gPSBjb29raWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBleHRyYWN0X2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAiIiJFeHRyYWN0IGNvb2tpZXMgZnJvbSByZXNwb25zZSwgd2hlcmUgYWxsb3dhYmxlIGdpdmVuIHRoZSByZXF1ZXN0LiIiIgorICAgICAgICBkZWJ1ZygiZXh0cmFjdF9jb29raWVzOiAlcyIsIHJlc3BvbnNlLmluZm8oKSkKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKKworICAgICAgICBmb3IgY29va2llIGluIHNlbGYubWFrZV9jb29raWVzKHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgICAgIGlmIHNlbGYuX3BvbGljeS5zZXRfb2soY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiIHNldHRpbmcgY29va2llOiAlcyIsIGNvb2tpZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ2xlYXIgc29tZSBjb29raWVzLgorCisgICAgICAgIEludm9raW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYXJndW1lbnRzIHdpbGwgY2xlYXIgYWxsIGNvb2tpZXMuICBJZgorICAgICAgICBnaXZlbiBhIHNpbmdsZSBhcmd1bWVudCwgb25seSBjb29raWVzIGJlbG9uZ2luZyB0byB0aGF0IGRvbWFpbiB3aWxsIGJlCisgICAgICAgIHJlbW92ZWQuICBJZiBnaXZlbiB0d28gYXJndW1lbnRzLCBjb29raWVzIGJlbG9uZ2luZyB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgIHBhdGggd2l0aGluIHRoYXQgZG9tYWluIGFyZSByZW1vdmVkLiAgSWYgZ2l2ZW4gdGhyZWUgYXJndW1lbnRzLCB0aGVuCisgICAgICAgIHRoZSBjb29raWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHBhdGggYW5kIGRvbWFpbiBpcyByZW1vdmVkLgorCisgICAgICAgIFJhaXNlcyBLZXlFcnJvciBpZiBubyBtYXRjaGluZyBjb29raWUgZXhpc3RzLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgKGRvbWFpbiBpcyBOb25lKSBvciAocGF0aCBpcyBOb25lKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiZG9tYWluIGFuZCBwYXRoIG11c3QgYmUgZ2l2ZW4gdG8gcmVtb3ZlIGEgY29va2llIGJ5IG5hbWUiKQorICAgICAgICAgICAgZGVsIHNlbGYuX2Nvb2tpZXNbZG9tYWluXVtwYXRoXVtuYW1lXQorICAgICAgICBlbGlmIHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBkb21haW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiZG9tYWluIG11c3QgYmUgZ2l2ZW4gdG8gcmVtb3ZlIGNvb2tpZXMgYnkgcGF0aCIpCisgICAgICAgICAgICBkZWwgc2VsZi5fY29va2llc1tkb21haW5dW3BhdGhdCisgICAgICAgIGVsaWYgZG9tYWluIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVsIHNlbGYuX2Nvb2tpZXNbZG9tYWluXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CisKKyAgICBkZWYgY2xlYXJfc2Vzc2lvbl9jb29raWVzKHNlbGYpOgorICAgICAgICAiIiJEaXNjYXJkIGFsbCBzZXNzaW9uIGNvb2tpZXMuCisKKyAgICAgICAgTm90ZSB0aGF0IHRoZSAuc2F2ZSgpIG1ldGhvZCB3b24ndCBzYXZlIHNlc3Npb24gY29va2llcyBhbnl3YXksIHVubGVzcworICAgICAgICB5b3UgYXNrIG90aGVyd2lzZSBieSBwYXNzaW5nIGEgdHJ1ZSBpZ25vcmVfZGlzY2FyZCBhcmd1bWVudC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6CisgICAgICAgICAgICBpZiBjb29raWUuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGNsZWFyX2V4cGlyZWRfY29va2llcyhzZWxmKToKKyAgICAgICAgIiIiRGlzY2FyZCBhbGwgZXhwaXJlZCBjb29raWVzLgorCisgICAgICAgIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2Q6IGV4cGlyZWQgY29va2llcyBhcmUgbmV2ZXIKKyAgICAgICAgc2VudCBiYWNrIHRvIHRoZSBzZXJ2ZXIgKHByb3ZpZGVkIHlvdSdyZSB1c2luZyBEZWZhdWx0Q29va2llUG9saWN5KSwKKyAgICAgICAgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IENvb2tpZUphciBpdHNlbGYgZXZlcnkgc28gb2Z0ZW4sIGFuZCB0aGUKKyAgICAgICAgLnNhdmUoKSBtZXRob2Qgd29uJ3Qgc2F2ZSBleHBpcmVkIGNvb2tpZXMgYW55d2F5ICh1bmxlc3MgeW91IGFzaworICAgICAgICBvdGhlcndpc2UgYnkgcGFzc2luZyBhIHRydWUgaWdub3JlX2V4cGlyZXMgYXJndW1lbnQpLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIGNvb2tpZS5pc19leHBpcmVkKG5vdyk6CisgICAgICAgICAgICAgICAgc2VsZi5jbGVhcihjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGRlZXB2YWx1ZXMoc2VsZi5fY29va2llcykKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbnVtYmVyIG9mIGNvbnRhaW5lZCBjb29raWVzLiIiIgorICAgICAgICBpID0gMAorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6IGkgPSBpICsgMQorICAgICAgICByZXR1cm4gaQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOiByLmFwcGVuZChyZXByKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiPCVzWyVzXT4iICUgKHNlbGYuX19jbGFzc19fLCAiLCAiLmpvaW4ocikpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjogci5hcHBlbmQoc3RyKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiPCVzWyVzXT4iICUgKHNlbGYuX19jbGFzc19fLCAiLCAiLmpvaW4ocikpCisKKworY2xhc3MgTG9hZEVycm9yKEV4Y2VwdGlvbik6IHBhc3MKKworY2xhc3MgRmlsZUNvb2tpZUphcihDb29raWVKYXIpOgorICAgICIiIkNvb2tpZUphciB0aGF0IGNhbiBiZSBsb2FkZWQgZnJvbSBhbmQgc2F2ZWQgdG8gYSBmaWxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGRlbGF5bG9hZD1GYWxzZSwgcG9saWN5PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29va2llcyBhcmUgTk9UIGxvYWRlZCBmcm9tIHRoZSBuYW1lZCBmaWxlIHVudGlsIGVpdGhlciB0aGUgLmxvYWQoKSBvcgorICAgICAgICAucmV2ZXJ0KCkgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgQ29va2llSmFyLl9faW5pdF9fKHNlbGYsIHBvbGljeSkKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUrIiIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWxlbmFtZSBtdXN0IGJlIHN0cmluZy1saWtlIikKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuZGVsYXlsb2FkID0gYm9vbChkZWxheWxvYWQpCisKKyAgICBkZWYgc2F2ZShzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICAiIiJTYXZlIGNvb2tpZXMgdG8gYSBmaWxlLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBsb2FkKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CisgICAgICAgICIiIkxvYWQgY29va2llcyBmcm9tIGEgZmlsZS4iIiIKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6IGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3JlYWxseV9sb2FkKGYsIGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiByZXZlcnQoc2VsZiwgZmlsZW5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CisgICAgICAgICIiIkNsZWFyIGFsbCBjb29raWVzIGFuZCByZWxvYWQgY29va2llcyBmcm9tIGEgc2F2ZWQgZmlsZS4KKworICAgICAgICBSYWlzZXMgTG9hZEVycm9yIChvciBJT0Vycm9yKSBpZiByZXZlcnNpb24gaXMgbm90IHN1Y2Nlc3NmdWw7IHRoZQorICAgICAgICBvYmplY3QncyBzdGF0ZSB3aWxsIG5vdCBiZSBhbHRlcmVkIGlmIHRoaXMgaGFwcGVucy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6IGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorCisgICAgICAgIG9sZF9zdGF0ZSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5fY29va2llcykKKyAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubG9hZChmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKQorICAgICAgICBleGNlcHQgKExvYWRFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzID0gb2xkX3N0YXRlCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworZnJvbSBfTFdQQ29va2llSmFyIGltcG9ydCBMV1BDb29raWVKYXIsIGx3cF9jb29raWVfc3RyCitmcm9tIF9Nb3ppbGxhQ29va2llSmFyIGltcG9ydCBNb3ppbGxhQ29va2llSmFyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzlmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQpAQCAtMCwwICsxLDE2MjAgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisiIiJUZXN0cyBmb3IgY29va2llbGliLnB5LiIiIgorCitpbXBvcnQgcmUsIG9zLCB0aW1lCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBEYXRlVGltZVRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RpbWUyaXNveihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUyaXNvegorCisgICAgICAgIGJhc2UgPSAxMDE5MjI3MDAwCisgICAgICAgIGRheSA9IDI0KjM2MDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModGltZTJpc296KGJhc2UpLCAiMjAwMi0wNC0xOSAxNDozNjo0MFoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZStkYXkpLCAiMjAwMi0wNC0yMCAxNDozNjo0MFoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0aW1lMmlzb3ooYmFzZSsyKmRheSksICIyMDAyLTA0LTIxIDE0OjM2OjQwWiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRpbWUyaXNveihiYXNlKzMqZGF5KSwgIjIwMDItMDQtMjIgMTQ6MzY6NDBaIikKKworICAgICAgICBheiA9IHRpbWUyaXNveigpCisgICAgICAgIGJ6ID0gdGltZTJpc296KDUwMDAwMCkKKyAgICAgICAgZm9yIHRleHQgaW4gKGF6LCBieik6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHIiXlxkezR9LVxkXGQtXGRcZCBcZFxkOlxkXGQ6XGRcZFokIiwgdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImJhZCB0aW1lMmlzb3ogZm9ybWF0OiAlcyAlcyIgJSAoYXosIGJ6KSkKKworICAgIGRlZiB0ZXN0X2h0dHAydGltZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZQorCisgICAgICAgIGRlZiBwYXJzZV9kYXRlKHRleHQpOgorICAgICAgICAgICAgcmV0dXJuIHRpbWUuZ210aW1lKGh0dHAydGltZSh0ZXh0KSlbOjZdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDEgSmFuIDIwMDEiKSwgKDIwMDEsIDEsIDEsIDAsIDAsIDAuMCkpCisKKyAgICAgICAgIyB0aGlzIHRlc3Qgd2lsbCBicmVhayBhcm91bmQgeWVhciAyMDcwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlX2RhdGUoIjAzLUZlYi0yMCIpLCAoMjAyMCwgMiwgMywgMCwgMCwgMC4wKSkKKworICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIGJyZWFrIGFyb3VuZCB5ZWFyIDIwNDgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfZGF0ZSgiMDMtRmViLTk4IiksICgxOTk4LCAyLCAzLCAwLCAwLCAwLjApKQorCisgICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2Zvcm1hdHMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUsIHRpbWUyaXNvegorCisgICAgICAgICMgdGVzdCBodHRwMnRpbWUgZm9yIHN1cHBvcnRlZCBkYXRlcy4gIFRlc3QgY2FzZXMgd2l0aCAyIGRpZ2l0IHllYXIKKyAgICAgICAgIyB3aWxsIHByb2JhYmx5IGJyZWFrIGluIHllYXIgMjA0NC4KKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAnVGh1LCAwMyBGZWIgMTk5NCAwMDowMDowMCBHTVQnLCAgIyBwcm9wb3NlZCBuZXcgSFRUUCBmb3JtYXQKKyAgICAgICAgICdUaHVyc2RheSwgMDMtRmViLTk0IDAwOjAwOjAwIEdNVCcsICAjIG9sZCByZmM4NTAgSFRUUCBmb3JtYXQKKyAgICAgICAgICdUaHVyc2RheSwgMDMtRmViLTE5OTQgMDA6MDA6MDAgR01UJywgICMgYnJva2VuIHJmYzg1MCBIVFRQIGZvcm1hdAorCisgICAgICAgICAnMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXkpCisgICAgICAgICAnMDMtRmViLTk0IDAwOjAwOjAwIEdNVCcsICAjIG9sZCByZmM4NTAgKG5vIHdlZWtkYXkpCisgICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDA6MDAgR01UJywgICMgYnJva2VuIHJmYzg1MCAobm8gd2Vla2RheSkKKyAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzKQorICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwJywgICMgYnJva2VuIHJmYzg1MCAobm8gd2Vla2RheSwgbm8gc2Vjb25kcywgbm8gdHopCisKKyAgICAgICAgICcwMy1GZWItOTQnLCAgIyBvbGQgcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQorICAgICAgICAgJzAzLUZlYi0xOTk0JywgICMgYnJva2VuIHJmYzg1MCBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSwgbm8gdGltZSkKKyAgICAgICAgICcwMyBGZWIgMTk5NCcsICAjIHByb3Bvc2VkIG5ldyBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSwgbm8gdGltZSkKKworICAgICAgICAgIyBBIGZldyB0ZXN0cyB3aXRoIGV4dHJhIHNwYWNlIGF0IHZhcmlvdXMgcGxhY2VzCisgICAgICAgICAnICAwMyAgIEZlYiAgIDE5OTQgIDA6MDAgICcsCisgICAgICAgICAnICAwMy1GZWItMTk5NCAgJywKKyAgICAgICAgXQorCisgICAgICAgIHRlc3RfdCA9IDc2MDIzMzYwMCAgIyBhc3N1bWUgYnJva2VuIFBPU0lYIGNvdW50aW5nIG9mIHNlY29uZHMKKyAgICAgICAgcmVzdWx0ID0gdGltZTJpc296KHRlc3RfdCkKKyAgICAgICAgZXhwZWN0ZWQgPSAiMTk5NC0wMi0wMyAwMDowMDowMFoiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAgPT4gICclcycgKCVzKSIgJSAodGVzdF90LCByZXN1bHQsIGV4cGVjdGVkKSkKKworICAgICAgICBmb3IgcyBpbiB0ZXN0czoKKyAgICAgICAgICAgIHQgPSBodHRwMnRpbWUocykKKyAgICAgICAgICAgIHQyID0gaHR0cDJ0aW1lKHMubG93ZXIoKSkKKyAgICAgICAgICAgIHQzID0gaHR0cDJ0aW1lKHMudXBwZXIoKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHQgPT0gdDIgPT0gdDMgPT0gdGVzdF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnICA9PiAgJXMsICVzLCAlcyAoJXMpIiAlIChzLCB0LCB0MiwgdDMsIHRlc3RfdCkpCisKKyAgICBkZWYgdGVzdF9odHRwMnRpbWVfZ2FyYmFnZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZQorCisgICAgICAgIGZvciB0ZXN0IGluIFsKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJ0dhcmJhZ2UnLAorICAgICAgICAgICAgJ01hbmRhZyAxNi4gU2VwdGVtYmVyIDE5OTYnLAorICAgICAgICAgICAgJzAxLTAwLTE5ODAnLAorICAgICAgICAgICAgJzAxLTEzLTE5ODAnLAorICAgICAgICAgICAgJzAwLTAxLTE5ODAnLAorICAgICAgICAgICAgJzMyLTAxLTE5ODAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMjU6MDA6MDAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6NjE6MDAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6MDA6NjInLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhodHRwMnRpbWUodGVzdCkgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDJ0aW1lKCVzKSBpcyBub3QgTm9uZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwMnRpbWUodGVzdCkgJXMiICUgKHRlc3QsIGh0dHAydGltZSh0ZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICApCisKKworY2xhc3MgSGVhZGVyVGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBwYXJzZV9uc19oZWFkZXJzCisKKyAgICAgICAgIyBxdW90ZXMgc2hvdWxkIGJlIHN0cmlwcGVkCisgICAgICAgIGV4cGVjdGVkID0gW1soJ2V4cGlyZXMnLCAyMjA5MDY5NDEyTCksICgndmVyc2lvbicsICcwJyldXQorICAgICAgICBmb3IgaGRyIGluIFsKKyAgICAgICAgICAgICdleHBpcmVzPTAxIEphbiAyMDQwIDIyOjIzOjMyIEdNVCcsCisgICAgICAgICAgICAnZXhwaXJlcz0iMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIicsCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfbnNfaGVhZGVycyhbaGRyXSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfam9pbl9oZWFkZXJfd29yZHMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBqb2luX2hlYWRlcl93b3JkcworCisgICAgICAgIGpvaW5lZCA9IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCAiYmF6IildXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoam9pbmVkLCAiZm9vOyBiYXI9YmF6IikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhqb2luX2hlYWRlcl93b3JkcyhbW11dKSwgIiIpCisKKyAgICBkZWYgdGVzdF9zcGxpdF9oZWFkZXJfd29yZHMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBzcGxpdF9oZWFkZXJfd29yZHMKKworICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgICgiZm9vIiwgW1soImZvbyIsIE5vbmUpXV0pLAorICAgICAgICAgICAgKCJmb289YmFyIiwgW1soImZvbyIsICJiYXIiKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vICAgIiwgW1soImZvbyIsIE5vbmUpXV0pLAorICAgICAgICAgICAgKCIgICBmb289ICAgIiwgW1soImZvbyIsICIiKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vPSIsIFtbKCJmb28iLCAiIildXSksCisgICAgICAgICAgICAoIiAgIGZvbz0gICA7ICIsIFtbKCJmb28iLCAiIildXSksCisgICAgICAgICAgICAoIiAgIGZvbz0gICA7IGJhcj0gYmF6ICIsIFtbKCJmb28iLCAiIiksICgiYmFyIiwgImJheiIpXV0pLAorICAgICAgICAgICAgKCJmb289YmFyIGJhcj1iYXoiLCBbWygiZm9vIiwgImJhciIpLCAoImJhciIsICJiYXoiKV1dKSwKKyAgICAgICAgICAgICMgZG9lc24ndCByZWFsbHkgbWF0dGVyIGlmIHRoaXMgbmV4dCBmYWlscywgYnV0IGl0IHdvcmtzIEFUTQorICAgICAgICAgICAgKCJmb289IGJhcj1iYXoiLCBbWygiZm9vIiwgImJhcj1iYXoiKV1dKSwKKyAgICAgICAgICAgICgiZm9vPWJhcjtiYXI9YmF6IiwgW1soImZvbyIsICJiYXIiKSwgKCJiYXIiLCAiYmF6IildXSksCisgICAgICAgICAgICAoJ2ZvbyBiYXIgYmF6JywgW1soImZvbyIsIE5vbmUpLCAoImJhciIsIE5vbmUpLCAoImJheiIsIE5vbmUpXV0pLAorICAgICAgICAgICAgKCJhLCBiLCBjIiwgW1soImEiLCBOb25lKV0sIFsoImIiLCBOb25lKV0sIFsoImMiLCBOb25lKV1dKSwKKyAgICAgICAgICAgIChyJ2ZvbzsgYmFyPWJheiwgc3BhbT0sIGZvbz0iXCxcO1wiIiwgYmFyPSAnLAorICAgICAgICAgICAgIFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCAiYmF6IildLAorICAgICAgICAgICAgICBbKCJzcGFtIiwgIiIpXSwgWygiZm9vIiwgJyw7IicpXSwgWygiYmFyIiwgIiIpXV0pLAorICAgICAgICAgICAgXQorCisgICAgICAgIGZvciBhcmcsIGV4cGVjdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaywgU3RyaW5nSU8KKyAgICAgICAgICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoTm9uZSwgZikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiKGVycm9yIC0tIHRyYWNlYmFjayBmb2xsb3dzKVxuXG4lcyIgJSBmLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgIGV4cGVjdCwgIiIiCitXaGVuIHBhcnNpbmc6ICclcycKK0V4cGVjdGVkOiAgICAgJyVzJworR290OiAgICAgICAgICAnJXMnCisiIiIgJSAoYXJnLCBleHBlY3QsIHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBzcGxpdF9oZWFkZXJfd29yZHMsIGpvaW5faGVhZGVyX3dvcmRzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoImZvbyIsICJmb28iKSwKKyAgICAgICAgICAgICgiZm9vPWJhciIsICJmb289YmFyIiksCisgICAgICAgICAgICAoIiAgIGZvbyAgICIsICJmb28iKSwKKyAgICAgICAgICAgICgiZm9vPSIsICdmb289IiInKSwKKyAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKKyAgICAgICAgICAgICgiZm9vPWJhcjtiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKKyAgICAgICAgICAgICgnZm9vIGJhciBiYXonLCAiZm9vOyBiYXI7IGJheiIpLAorICAgICAgICAgICAgKHInZm9vPSJcIiIgYmFyPSJcXCInLCByJ2Zvbz0iXCIiOyBiYXI9IlxcIicpLAorICAgICAgICAgICAgKCdmb28sLCxiYXInLCAnZm9vLCBiYXInKSwKKyAgICAgICAgICAgICgnZm9vPWJhcixiYXI9YmF6JywgJ2Zvbz1iYXIsIGJhcj1iYXonKSwKKworICAgICAgICAgICAgKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMScsCisgICAgICAgICAgICAgJ3RleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSInKSwKKworICAgICAgICAgICAgKCdmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicsCisgICAgICAgICAgICAgJ2Zvbz1iYXI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicpLAorCisgICAgICAgICAgICAocidCYXNpYyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJywKKyAgICAgICAgICAgICByJ0Jhc2ljOyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJykKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgYXJnLCBleHBlY3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpbnB1dCA9IHNwbGl0X2hlYWRlcl93b3JkcyhbYXJnXSkKKyAgICAgICAgICAgIHJlcyA9IGpvaW5faGVhZGVyX3dvcmRzKGlucHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzLCBleHBlY3QsICIiIgorV2hlbiBwYXJzaW5nOiAnJXMnCitFeHBlY3RlZDogICAgICclcycKK0dvdDogICAgICAgICAgJyVzJworSW5wdXQgd2FzOiAgICAnJXMnCisiIiIgJSAoYXJnLCBleHBlY3QsIHJlcywgaW5wdXQpKQorCisKK2NsYXNzIEZha2VSZXNwb25zZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycz1bXSwgdXJsPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgaGVhZGVyczogbGlzdCBvZiBSRkM4MjItc3R5bGUgJ0tleTogdmFsdWUnIHN0cmluZ3MKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBtaW1ldG9vbHMsIFN0cmluZ0lPCisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXG4iLmpvaW4oaGVhZGVycykpCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmKQorICAgICAgICBzZWxmLl91cmwgPSB1cmwKKyAgICBkZWYgaW5mbyhzZWxmKTogcmV0dXJuIHNlbGYuX2hlYWRlcnMKKworZGVmIGludGVyYWN0XzI5NjUoY29va2llamFyLCB1cmwsICpzZXRfY29va2llX2hkcnMpOgorICAgIHJldHVybiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgIlNldC1Db29raWUyIikKKworZGVmIGludGVyYWN0X25ldHNjYXBlKGNvb2tpZWphciwgdXJsLCAqc2V0X2Nvb2tpZV9oZHJzKToKKyAgICByZXR1cm4gX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsICJTZXQtQ29va2llIikKKworZGVmIF9pbnRlcmFjdChjb29raWVqYXIsIHVybCwgc2V0X2Nvb2tpZV9oZHJzLCBoZHJfbmFtZSk6CisgICAgIiIiUGVyZm9ybSBhIHNpbmdsZSByZXF1ZXN0IC8gcmVzcG9uc2UgY3ljbGUsIHJldHVybmluZyBDb29raWU6IGhlYWRlci4iIiIKKyAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICByZXEgPSBSZXF1ZXN0KHVybCkKKyAgICBjb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgIGNvb2tpZV9oZHIgPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIiwgIiIpCisgICAgaGVhZGVycyA9IFtdCisgICAgZm9yIGhkciBpbiBzZXRfY29va2llX2hkcnM6CisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCIlczogJXMiICUgKGhkcl9uYW1lLCBoZHIpKQorICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCB1cmwpCisgICAgY29va2llamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICByZXR1cm4gY29va2llX2hkcgorCisKK2NsYXNzIENvb2tpZVRlc3RzKFRlc3RDYXNlKToKKyAgICAjIFhYWAorICAgICMgR2V0IHJpZCBvZiBzdHJpbmcgY29tcGFyaXNvbnMgd2hlcmUgbm90IGFjdHVhbGx5IHRlc3Rpbmcgc3RyIC8gcmVwci4KKyAgICAjIC5jbGVhcigpIGV0Yy4KKyAgICAjIElQIGFkZHJlc3NlcyBsaWtlIDUwIChzaW5nbGUgbnVtYmVyLCBubyBkb3QpIGFuZCBkb21haW4tbWF0Y2hpbmcKKyAgICAjICBmdW5jdGlvbnMgKGFuZCBpc19IRE4pPyAgU2VlIGRyYWZ0IFJGQyAyOTY1IGVycmF0YS4KKyAgICAjIFN0cmljdG5lc3Mgc3dpdGNoZXMKKyAgICAjIGlzX3RoaXJkX3BhcnR5KCkKKyAgICAjIHVudmVyaWZpYWJpbGl0eSAvIHRoaXJkLXBhcnR5IGJsb2NraW5nCisgICAgIyBOZXRzY2FwZSBjb29raWVzIHdvcmsgdGhlIHNhbWUgYXMgUkZDIDI5NjUgd2l0aCByZWdhcmQgdG8gcG9ydC4KKyAgICAjIFNldC1Db29raWUgd2l0aCBuZWdhdGl2ZSBtYXggYWdlLgorICAgICMgSWYgdHVybiBSRkMgMjk2NSBoYW5kbGluZyBvZmYsIFNldC1Db29raWUyIGNvb2tpZXMgc2hvdWxkIG5vdCBjbG9iYmVyCisgICAgIyAgU2V0LUNvb2tpZSBjb29raWVzLgorICAgICMgQ29va2llMiBzaG91bGQgYmUgc2VudCBpZiAqYW55KiBjb29raWVzIGFyZSBub3QgVjEgKGllLiBWMCBPUiBWMiBldGMuKS4KKyAgICAjIENvb2tpZXMgKFYxIGFuZCBWMCkgd2l0aCBubyBleHBpcnkgZGF0ZSBzaG91bGQgYmUgc2V0IHRvIGJlIGRpc2NhcmRlZC4KKyAgICAjIFJGQyAyOTY1IFF1b3Rpbmc6CisgICAgIyAgU2hvdWxkIGFjY2VwdCB1bnF1b3RlZCBjb29raWUtYXR0cmlidXRlIHZhbHVlcz8gIGNoZWNrIGVycmF0YSBkcmFmdC4KKyAgICAjICAgV2hpY2ggYXJlIHJlcXVpcmVkIG9uIHRoZSB3YXkgaW4gYW5kIG91dD8KKyAgICAjICBTaG91bGQgYWx3YXlzIHJldHVybiBxdW90ZWQgY29va2llLWF0dHJpYnV0ZSB2YWx1ZXM/CisgICAgIyBQcm9wZXIgdGVzdGluZyBvZiB3aGVuIFJGQyAyOTY1IGNsb2JiZXJzIE5ldHNjYXBlICh3YWl0aW5nIGZvciBlcnJhdGEpLgorICAgICMgUGF0aC1tYXRjaCBvbiByZXR1cm4gKHNhbWUgZm9yIFYwIGFuZCBWMSkuCisgICAgIyBSRkMgMjk2NSBhY2NlcHRhbmNlIGFuZCByZXR1cm5pbmcgcnVsZXMKKyAgICAjICBTZXQtQ29va2llMiB3aXRob3V0IHZlcnNpb24gYXR0cmlidXRlIGlzIHJlamVjdGVkLgorCisgICAgIyBOZXRzY2FwZSBwZWN1bGlhcml0aWVzIGxpc3QgZnJvbSBSb25hbGQgVHNjaGFsYXIuCisgICAgIyBUaGUgZmlyc3QgdHdvIHN0aWxsIG5lZWQgdGVzdHMsIHRoZSByZXN0IGFyZSBjb3ZlcmVkLgorIyMgLSBRdW90aW5nOiBvbmx5IHF1b3RlcyBhcm91bmQgdGhlIGV4cGlyZXMgdmFsdWUgYXJlIHJlY29nbml6ZWQgYXMgc3VjaAorIyMgICAoYW5kIHllcywgc29tZSBmb2xrcyBxdW90ZSB0aGUgZXhwaXJlcyB2YWx1ZSk7IHF1b3RlcyBhcm91bmQgYW55IG90aGVyCisjIyAgIHZhbHVlIGFyZSB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIHZhbHVlLgorIyMgLSBXaGl0ZSBzcGFjZTogd2hpdGUgc3BhY2UgYXJvdW5kIG5hbWVzIGFuZCB2YWx1ZXMgaXMgaWdub3JlZAorIyMgLSBEZWZhdWx0IHBhdGg6IGlmIG5vIHBhdGggcGFyYW1ldGVyIGlzIGdpdmVuLCB0aGUgcGF0aCBkZWZhdWx0cyB0byB0aGUKKyMjICAgcGF0aCBpbiB0aGUgcmVxdWVzdC11cmkgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbGFzdCAnLycuIE5vdGUKKyMjICAgdGhhdCB0aGlzIGlzIGVudGlyZWx5IGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHNwZWMgc2F5cy4KKyMjIC0gQ29tbWFzIGFuZCBvdGhlciBkZWxpbWl0ZXJzOiBOZXRzY2FwZSBqdXN0IHBhcnNlcyB1bnRpbCB0aGUgbmV4dCAnOycuCisjIyAgIFRoaXMgbWVhbnMgaXQgd2lsbCBhbGxvdyBjb21tYXMgZXRjIGluc2lkZSB2YWx1ZXMgKGFuZCB5ZXMsIGJvdGgKKyMjICAgY29tbWFzIGFuZCBlcXVhbHMgYXJlIGNvbW1vbmx5IGFwcGVhciBpbiB0aGUgY29va2llIHZhbHVlKS4gVGhpcyBhbHNvCisjIyAgIG1lYW5zIHRoYXQgaWYgeW91IGZvbGQgbXVsdGlwbGUgU2V0LUNvb2tpZSBoZWFkZXIgZmllbGRzIGludG8gb25lLAorIyMgICBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgaXQnbGwgYmUgYSBoZWFkYWNoZSB0byBwYXJzZSAoYXQgbGVhc3QgbXkgaGVhZAorIyMgICBzdGFydHMgaHVydGluZyBldmVyeXRpbWUgSSB0aGluayBvZiB0aGF0IGNvZGUpLgorIyMgLSBFeHBpcmVzOiBZb3UnbGwgZ2V0IGFsbCBzb3J0cyBvZiBkYXRlIGZvcm1hdHMgaW4gdGhlIGV4cGlyZXMsCisjIyAgIGluY2x1ZGluZyBlbXRweSBleHBpcmVzIGF0dHJpYnV0ZXMgKCJleHBpcmVzPSIpLiBCZSBhcyBmbGV4aWJsZSBhcyB5b3UKKyMjICAgY2FuLCBhbmQgY2VydGFpbmx5IGRvbid0IGV4cGVjdCB0aGUgd2Vla2RheSB0byBiZSB0aGVyZTsgaWYgeW91IGNhbid0CisjIyAgIHBhcnNlIGl0LCBqdXN0IGlnbm9yZSBpdCBhbmQgcHJldGVuZCBpdCdzIGEgc2Vzc2lvbiBjb29raWUuCisjIyAtIERvbWFpbi1tYXRjaGluZzogTmV0c2NhcGUgdXNlcyB0aGUgMi1kb3QgcnVsZSBmb3IgX2FsbF8gZG9tYWlucywgbm90CisjIyAgIGp1c3QgdGhlIDcgc3BlY2lhbCBUTEQncyBsaXN0ZWQgaW4gdGhlaXIgc3BlYy4gQW5kIGZvbGtzIHJlbHkgb24KKyMjICAgdGhhdC4uLgorCisgICAgZGVmIHRlc3RfZG9tYWluX3JldHVybl9vayhzZWxmKToKKyAgICAgICAgIyB0ZXN0IG9wdGltaXphdGlvbjogLmRvbWFpbl9yZXR1cm5fb2soKSBzaG91bGQgZmlsdGVyIG91dCBtb3N0CisgICAgICAgICMgZG9tYWlucyBpbiB0aGUgQ29va2llSmFyIGJlZm9yZSB3ZSB0cnkgdG8gYWNjZXNzIHRoZW0gKGJlY2F1c2UgdGhhdAorICAgICAgICAjIG1heSByZXF1aXJlIGRpc2sgYWNjZXNzIC0tIGluIHBhcnRpY3VsYXIsIHdpdGggTVNJRUNvb2tpZUphcikKKyAgICAgICAgIyBUaGlzIGlzIG9ubHkgYSByb3VnaCBjaGVjayBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgc28gaXQncyBub3QgdG9vCisgICAgICAgICMgY3JpdGljYWwgYXMgbG9uZyBhcyBpdCdzIHN1ZmZpY2llbnRseSBsaWJlcmFsLgorICAgICAgICBpbXBvcnQgY29va2llbGliLCB1cmxsaWIyCisgICAgICAgIHBvbCA9IGNvb2tpZWxpYi5EZWZhdWx0Q29va2llUG9saWN5KCkKKyAgICAgICAgZm9yIHVybCwgZG9tYWluLCBvayBpbiBbCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiYmxhaC5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAicmh1YmFyYi5ibGFoLmNvbSIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJyaHViYXJiLmZvby5iYXIuY29tIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgIi5mb28uYmFyLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImZvby5iYXIuY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiLmJhci5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJjb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgInJodWJhcmIuZm9vLmNvbSIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgIi5mb28uY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJmb28uY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJjb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAicmh1YmFyYi5mb28iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgIi5mb28iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgImZvby5sb2NhbCIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICIubG9jYWwiLCBUcnVlKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICByZXF1ZXN0ID0gdXJsbGliMi5SZXF1ZXN0KHVybCkKKyAgICAgICAgICAgIHIgPSBwb2wuZG9tYWluX3JldHVybl9vayhkb21haW4sIHJlcXVlc3QpCisgICAgICAgICAgICBpZiBvazogc2VsZi5hc3NlcnRfKHIpCisgICAgICAgICAgICBlbHNlOiBzZWxmLmFzc2VydF8obm90IHIpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3ZhbHVlKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTW96aWxsYUNvb2tpZUphciwgbHdwX2Nvb2tpZV9zdHIKKworICAgICAgICAjIG1pc3NpbmcgPSBzaWduIGluIENvb2tpZTogaGVhZGVyIGlzIHJlZ2FyZGVkIGJ5IE1vemlsbGEgYXMgYSBtaXNzaW5nCisgICAgICAgICMgbmFtZSwgYW5kIGJ5IGNvb2tpZWxpYiBhcyBhIG1pc3NpbmcgdmFsdWUKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncycpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICcic3BhbSI7IHBhdGg9L2Zvby8nKQorICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJlZ2dzIl0KKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUubmFtZSwgImVnZ3MiKQorICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUubmFtZSwgJyJzcGFtIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGx3cF9jb29raWVfc3RyKGNvb2tpZSksICgKKyAgICAgICAgICAgIHInInNwYW0iOyBwYXRoPSIvZm9vLyI7IGRvbWFpbj0id3d3LmFjbWUuY29tIjsgJworICAgICAgICAgICAgJ3BhdGhfc3BlYzsgZGlzY2FyZDsgdmVyc2lvbj0wJykpCisgICAgICAgIG9sZF9zdHIgPSByZXByKGMpCisgICAgICAgIGMuc2F2ZShpZ25vcmVfZXhwaXJlcz1UcnVlLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSkKKyAgICAgICAgICAgIGMucmV2ZXJ0KGlnbm9yZV9leHBpcmVzPVRydWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoYy5maWxlbmFtZSkKKyAgICAgICAgIyBjb29raWVzIHVuY2hhbmdlZCBhcGFydCBmcm9tIGxvc3QgaW5mbyByZS4gd2hldGhlciBwYXRoIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICByZXByKGMpLAorICAgICAgICAgICAgcmUuc3ViKCJwYXRoX3NwZWNpZmllZD0lcyIgJSBUcnVlLCAicGF0aF9zcGVjaWZpZWQ9JXMiICUgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgb2xkX3N0cikKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnInNwYW0iOyBlZ2dzJykKKworICAgIGRlZiB0ZXN0X25zX3BhcnNlcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgREVGQVVMVF9IVFRQX1BPUlQKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9NYWluPS5hY21lLmNvbTsgcG9ydDsgYmxBcmdoPSJmZWVwIicpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICduaT1uaTsgcG9ydD04MCw4MDgwJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwgJ25pbmk9bmknKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbTo4MC8iLCAnZm9vPWJhcjsgZXhwaXJlcz0nKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbTo4MC8iLCAnc3BhbT1lZ2dzOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcmVzPSJGb28gQmFyIDI1IDMzOjIyOjExIDMwMjIiJykKKworICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyIuYWNtZS5jb20iXVsiLyJdWyJzcGFtIl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLmRvbWFpbiwgIi5hY21lLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuZG9tYWluX3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLnBvcnQsIERFRkFVTFRfSFRUUF9QT1JUKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKyAgICAgICAgIyBjYXNlIGlzIHByZXNlcnZlZAorICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibEFyZ2giKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsYXJnaCIpKQorCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pIl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLmRvbWFpbiwgInd3dy5hY21lLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCAiODAsODA4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydF9zcGVjaWZpZWQpCisKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmluaSJdCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydCBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKworICAgICAgICAjIGludmFsaWQgZXhwaXJlcyBzaG91bGQgbm90IGNhdXNlIGNvb2tpZSB0byBiZSBkcm9wcGVkCisgICAgICAgIGZvbyA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCisgICAgICAgIHNwYW0gPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28iXQorICAgICAgICBzZWxmLmFzc2VydF8oZm9vLmV4cGlyZXMgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNwYW0uZXhwaXJlcyBpcyBOb25lKQorCisgICAgZGVmIHRlc3RfZXhwaXJlcyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUybmV0c2NhcGUsIENvb2tpZUphcgorCisgICAgICAgICMgaWYgZXhwaXJlcyBpcyBpbiBmdXR1cmUsIGtlZXAgY29va2llLi4uCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBmdXR1cmUgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpKzM2MDApCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICBub3cgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpLTEpCisgICAgICAgICMgLi4uIGFuZCBpZiBpbiBwYXN0IG9yIHByZXNlbnQsIGRpc2NhcmQgaXQKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Zvbz0iZWdncyI7IGV4cGlyZXM9JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQorICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQorCisgICAgICAgICMgbWF4LWFnZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwaXJlcywgYW5kIHplcm8gbWF4LWFnZSBpcyByZXF1ZXN0IHRvCisgICAgICAgICMgZGVsZXRlIGJvdGggbmV3IGNvb2tpZSBhbmQgYW55IG9sZCBtYXRjaGluZyBjb29raWUKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3M9ImJhciI7IGV4cGlyZXM9JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYmFyPSJiYXIiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0lczsgbWF4LWFnZT0wJyAlIGZ1dHVyZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Jhcj0iYmFyIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0wOyBleHBpcmVzPSVzJyAlIGZ1dHVyZSkKKyAgICAgICAgaCA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICAjIHRlc3QgZXhwaXJ5IGF0IGVuZCBvZiBzZXNzaW9uIGZvciBjb29raWVzIHdpdGggbm8gZXhwaXJlcyBhdHRyaWJ1dGUKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cucmh1YmFyYi5uZXQvIiwgJ3dodW09ImZpenoiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorICAgICAgICBjLmNsZWFyX3Nlc3Npb25fY29va2llcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtPSJiYXIiJyBpbiBoKQorCisgICAgICAgICMgWFhYIFJGQyAyOTY1IGV4cGlyeSBydWxlcyAoc29tZSBhcHBseSB0byBWMCB0b28pCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICAjIFJGQyAyOTY1CisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaCIsICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCIvYmxhaC9yaHViYXJiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgIyBOZXRzY2FwZQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCIvYmxhaCIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYi8iLCAnZWdncz0iYmFyIicpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiL2JsYWgvcmh1YmFyYiIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfcGF0aChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGVzY2FwZV9wYXRoCisgICAgICAgIGNhc2VzID0gWworICAgICAgICAgICAgIyBxdW90ZWQgc2FmZQorICAgICAgICAgICAgKCIvZm9vJTJmL2JhciIsICIvZm9vJTJGL2JhciIpLAorICAgICAgICAgICAgKCIvZm9vJTJGL2JhciIsICIvZm9vJTJGL2JhciIpLAorICAgICAgICAgICAgIyBxdW90ZWQgJQorICAgICAgICAgICAgKCIvZm9vJSUvYmFyIiwgIi9mb28lJS9iYXIiKSwKKyAgICAgICAgICAgICMgcXVvdGVkIHVuc2FmZQorICAgICAgICAgICAgKCIvZm8lMTlvL2JhciIsICIvZm8lMTlvL2JhciIpLAorICAgICAgICAgICAgKCIvZm8lN2RvL2JhciIsICIvZm8lN0RvL2JhciIpLAorICAgICAgICAgICAgIyB1bnF1b3RlZCBzYWZlCisgICAgICAgICAgICAoIi9mb28vYmFyJiIsICIvZm9vL2JhciYiKSwKKyAgICAgICAgICAgICgiL2Zvby8vYmFyIiwgIi9mb28vL2JhciIpLAorICAgICAgICAgICAgKCJcMTc2L2Zvby9iYXIiLCAiXDE3Ni9mb28vYmFyIiksCisgICAgICAgICAgICAjIHVucXVvdGVkIHVuc2FmZQorICAgICAgICAgICAgKCIvZm9vXDAzMS9iYXIiLCAiL2ZvbyUxOS9iYXIiKSwKKyAgICAgICAgICAgICgiL1wxNzVmb28vYmFyIiwgIi8lN0Rmb28vYmFyIiksCisgICAgICAgICAgICAjIHVuaWNvZGUKKyAgICAgICAgICAgICh1Ii9mb28vYmFyXHVhYmNkIiwgIi9mb28vYmFyJUVBJUFGJThEIiksICAjIFVURi04IGVuY29kZWQKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIGFyZywgcmVzdWx0IGluIGNhc2VzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXNjYXBlX3BhdGgoYXJnKSwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcGF0aAorICAgICAgICAjIHdpdGggcGFyYW1ldGVycworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3JoZXVtL3JoYXBvbmljdW07IgorICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyO3Npbmc9c29uZz9hcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9wYXRoKHJlcSksICIvcmhldW0vcmhhcG9uaWN1bTsiCisgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjtzaW5nPXNvbmc/YXBwbGVzPXBlYXJzJnNwYW09ZWdncyNuaSIpCisgICAgICAgICMgd2l0aG91dCBwYXJhbWV0ZXJzCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcmhldW0vcmhhcG9uaWN1bT8iCisgICAgICAgICAgICAgICAgICAgICAgImFwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb25pY3VtPyIKKyAgICAgICAgICAgICAgICAgICAgICJhcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKKyAgICAgICAgIyBtaXNzaW5nIGZpbmFsIHNsYXNoCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X3BhdGgocmVxKSwgIi8iKQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9wb3J0KHNlbGYpOgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcG9ydCwgREVGQVVMVF9IVFRQX1BPUlQKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToxMjM0LyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjQzMjEifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9wb3J0KHJlcSksICIxMjM0IikKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo0MzIxIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfcG9ydChyZXEpLCBERUZBVUxUX0hUVFBfUE9SVCkKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfaG9zdChzZWxmKToKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X2hvc3QKKyAgICAgICAgIyB0aGlzIHJlcXVlc3QgaXMgaWxsZWdhbCAoUkZDMjYxNiwgMTQuMi4zKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vMS4xLjEuMS8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQorICAgICAgICAjIGxpYnd3dy1wZXJsIHdhbnRzIHRoaXMgcmVzcG9uc2UsIGJ1dCB0aGF0IHNlZW1zIHdyb25nIChSRkMgMjYxNiwKKyAgICAgICAgIyBzZWN0aW9uIDUuMiwgcG9pbnQgMS4sIGFuZCBSRkMgMjk2NSBzZWN0aW9uIDEsIHBhcmFncmFwaCAzKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXF1ZXN0X2hvc3QocmVxKSwgIjEuMS4xLjEiKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAiaXJyZWxldmFudC5jb20ifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQorICAgICAgICAjIG5vdCBhY3R1YWxseSBzdXJlIHRoaXMgb25lIGlzIHZhbGlkIFJlcXVlc3Qgb2JqZWN0LCBzbyBtYXliZSBzaG91bGQKKyAgICAgICAgIyByZW1vdmUgdGVzdCBmb3Igbm8gaG9zdCBpbiB1cmwgaW4gcmVxdWVzdF9ob3N0IGZ1bmN0aW9uPworICAgICAgICByZXEgPSBSZXF1ZXN0KCIvcmVzb3VyY2UuaHRtbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgIyBwb3J0IHNob3VsZG4ndCBiZSBpbiByZXF1ZXN0LWhvc3QKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToyMzQ1L3Jlc291cmNlLmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo1NDMyIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKworICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGlzX0hETgorICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCJmb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuZm9vLmJhci5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIi4uZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCJmb28uIikpCisKKyAgICBkZWYgdGVzdF9yZWFjaChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlYWNoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCJ3d3cuYWNtZS5jb20iKSwgIi5hY21lLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCJhY21lLmNvbSIpLCAiYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiYWNtZS5sb2NhbCIpLCAiLmxvY2FsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goIi5sb2NhbCIpLCAiLmxvY2FsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVhY2goIi5jb20iKSwgIi5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZWFjaCgiLiIpLCAiLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIiKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlYWNoKCIxOTIuMTY4LjAuMSIpLCAiMTkyLjE2OC4wLjEiKQorCisgICAgZGVmIHRlc3RfZG9tYWluX21hdGNoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgZG9tYWluX21hdGNoLCB1c2VyX2RvbWFpbl9tYXRjaAorICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goImEuYi5jLmNvbSIsICIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiZXhhbXBsZS5sb2NhbCIsICIubG9jYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goImJsYWguYmxhaCIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIiIsICIiKSkKKworICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJjb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLm0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgIyBub3QgYm90aCBIRE5zLCBzbyBtdXN0IHN0cmluZy1jb21wYXJlIGVxdWFsIHRvIG1hdGNoCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4iKSkKKyAgICAgICAgIyBlbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCisKKyAgICBkZWYgdGVzdF93cm9uZ19kb21haW4oc2VsZik6CisgICAgICAgICMgQ29va2llcyB3aG9zZSBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZQorICAgICAgICAjIGRvbWFpbiBhcmUgcmVqZWN0ZWQuCisKKyAgICAgICAgIyBYWFggZmFyIGZyb20gY29tcGxldGUKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5uYXN0eS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAnZm9vPWJhcjsgZG9tYWluPWZyaWVuZGx5Lm9yZzsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDApCisKKyAgICBkZWYgdGVzdF90d29fY29tcG9uZW50X2RvbWFpbl9ucyhzZWxmKToKKyAgICAgICAgIyBOZXRzY2FwZTogLnd3dy5iYXIuY29tLCB3d3cuYmFyLmNvbSwgLmJhci5jb20sIGJhci5jb20sIG5vIGRvbWFpbgorICAgICAgICAjIHNob3VsZCBhbGwgZ2V0IGFjY2VwdGVkLCBhcyBzaG91bGQgLmFjbWUuY29tLCBhY21lLmNvbSBhbmQgbm8gZG9tYWluCisgICAgICAgICMgZm9yIDItY29tcG9uZW50IGRvbWFpbnMgbGlrZSBhY21lLmNvbS4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorCisgICAgICAgICMgdHdvLWNvbXBvbmVudCBWMCBkb21haW4gaXMgT0sKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0LyIsICducz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbImZvby5uZXQiXVsiLyJdWyJucyJdLnZhbHVlLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0LyIpLCAibnM9YmFyIikKKyAgICAgICAgIyAqd2lsbCogYmUgcmV0dXJuZWQgdG8gYW55IG90aGVyIGRvbWFpbiAodW5saWtlIFJGQyAyOTY1KS4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibnM9YmFyIikKKyAgICAgICAgIyAuLi51bmxlc3MgcmVxdWVzdGVkIG90aGVyd2lzZQorICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KAorICAgICAgICAgICAgc3RyaWN0X25zX2RvbWFpbj1EZWZhdWx0Q29va2llUG9saWN5LkRvbWFpblN0cmljdE5vbkRvbWFpbikKKyAgICAgICAgYy5zZXRfcG9saWN5KHBvbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC8iKSwgIiIpCisKKyAgICAgICAgIyB1bmxpa2UgUkZDIDI5NjUsIGV2ZW4gZXhwbGljaXQgdHdvLWNvbXBvbmVudCBkb21haW4gaXMgT0ssCisgICAgICAgICMgYmVjYXVzZSAuZm9vLm5ldCBtYXRjaGVzIGZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhbTE9ZWdnczsgZG9tYWluPWZvby5uZXQnKQorICAgICAgICAjIGV2ZW4gaWYgc3RhcnRzIHdpdGggYSBkb3QgLS0gaW4gTlMgcnVsZXMsIC5mb28ubmV0IG1hdGNoZXMgZm9vLm5ldCEKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby9iYXIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0yPWVnZ3M7IGRvbWFpbj0uZm9vLm5ldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5fY29va2llc1siLmZvby5uZXQiXVsiL2ZvbyJdWyJzcGFtMSJdLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28vYmFyIl1bInNwYW0yIl0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlZ2dzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby9iYXIvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFtMj1lZ2dzOyBzcGFtMT1lZ2dzOyBucz1iYXIiKQorCisgICAgICAgICMgdG9wLWxldmVsIGRvbWFpbiBpcyB0b28gZ2VuZXJhbAorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ25pbmk9Im5pIjsgZG9tYWluPS5uZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDMpCisKKyMjICAgICAgICAgIyBOZXRzY2FwZSBwcm90b2NvbCBkb2Vzbid0IGFsbG93IG5vbi1zcGVjaWFsIHRvcCBsZXZlbCBkb21haW5zIChzdWNoCisjIyAgICAgICAgICMgYXMgY28udWspIGluIHRoZSBkb21haW4gYXR0cmlidXRlIHVubGVzcyB0aGVyZSBhcmUgYXQgbGVhc3QgdGhyZWUKKyMjICAgICAgICAgIyBkb3RzIGluIGl0LgorICAgICAgICAjIE9oIHllcyBpdCBkb2VzISAgUmVhbCBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgY2hlY2sgdGhpcywgYW5kIHJlYWwKKyAgICAgICAgIyBjb29raWVzIChvZiBjb3Vyc2UpIHJlbHkgb24gdGhhdCBiZWhhdmlvdXIuCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLmNvLnVrIiwgJ25hc3R5PXRyaWNrOyBkb21haW49LmNvLnVrJykKKyMjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDQpCisKKyAgICBkZWYgdGVzdF90d29fY29tcG9uZW50X2RvbWFpbl9yZmMyOTY1KHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorCisgICAgICAgICMgdHdvLWNvbXBvbmVudCBWMSBkb21haW4gaXMgT0sKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ2Zvbz1iYXI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLl9jb29raWVzWyJmb28ubmV0Il1bIi8iXVsiZm9vIl0udmFsdWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQorICAgICAgICAjIHdvbid0IGJlIHJldHVybmVkIHRvIGFueSBvdGhlciBkb21haW4gKGJlY2F1c2UgZG9tYWluIHdhcyBpbXBsaWVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksICIiKQorCisgICAgICAgICMgdW5sZXNzIGRvbWFpbiBpcyBnaXZlbiBleHBsaWNpdGx5LCBiZWNhdXNlIHRoZW4gaXQgbXVzdCBiZQorICAgICAgICAjIHJld3JpdHRlbiB0byBzdGFydCB3aXRoIGEgZG90OiBmb28ubmV0IC0tPiAuZm9vLm5ldCwgd2hpY2ggZG9lcworICAgICAgICAjIG5vdCBkb21haW4tbWF0Y2ggZm9vLm5ldAorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28iLAorICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IGRvbWFpbj1mb28ubmV0OyBwYXRoPS9mb287IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQorCisgICAgICAgICMgZXhwbGljaXQgZm9vLm5ldCBmcm9tIHRocmVlLWNvbXBvbmVudCBkb21haW4gd3d3LmZvby5uZXQgKmRvZXMqIGdldAorICAgICAgICAjIHNldCwgYmVjYXVzZSAuZm9vLm5ldCBkb21haW4tbWF0Y2hlcyAuZm9vLm5ldAorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvZm9vLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgZG9tYWluPWZvby5uZXQ7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy5fY29va2llc1siLmZvby5uZXQiXVsiL2Zvby8iXVsic3BhbSJdLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJFZlcnNpb249MTsgZm9vPWJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC9mb28vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICckVmVyc2lvbj0xOyBzcGFtPWVnZ3M7ICREb21haW49ImZvby5uZXQiJykKKworICAgICAgICAjIHRvcC1sZXZlbCBkb21haW4gaXMgdG9vIGdlbmVyYWwKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiwKKyAgICAgICAgICAgICAgICAgICAgICAnbmk9Im5pIjsgZG9tYWluPSIubmV0IjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisKKyAgICAgICAgIyBSRkMgMjk2NSBkb2Vzbid0IHJlcXVpcmUgYmxvY2tpbmcgdGhpcworICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLmNvLnVrLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ25hc3R5PXRyaWNrOyBkb21haW49LmNvLnVrOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9hbGxvdyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KAorICAgICAgICAgICAgYmxvY2tlZF9kb21haW5zPVsiYWNtZS5jb20iXSwKKyAgICAgICAgICAgIGFsbG93ZWRfZG9tYWlucz1bInd3dy5hY21lLmNvbSJdKSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vYWNtZS5jb20vIikKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIl0KKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorCisgICAgICAgICMgc2V0IGEgY29va2llIHdpdGggbm9uLWFsbG93ZWQgZG9tYWluLi4uCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICBjb29raWVzID0gYy5tYWtlX2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIGMuc2V0X2Nvb2tpZShjb29raWVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisgICAgICAgICMgLi4uIGFuZCBjaGVjayBpcyBkb2Vzbid0IGdldCByZXR1cm5lZAorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisKKyAgICBkZWYgdGVzdF9kb21haW5fYmxvY2soc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIHJmYzI5NjU9VHJ1ZSwgYmxvY2tlZF9kb21haW5zPVsiLmFjbWUuY29tIl0pCisgICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5PXBvbCkKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIl0KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQorCisgICAgICAgIHAgPSBwb2wuc2V0X2Jsb2NrZWRfZG9tYWlucyhbImFjbWUuY29tIl0pCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisKKyAgICAgICAgYy5jbGVhcigpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDEpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0XygocmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHJlcS5oYXNfaGVhZGVyKCJDb29raWUyIikpKQorCisgICAgICAgIGMuY2xlYXIoKQorICAgICAgICBwb2wuc2V0X2Jsb2NrZWRfZG9tYWlucyhbIi5hY21lLmNvbSJdKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorCisgICAgICAgICMgc2V0IGEgY29va2llIHdpdGggYmxvY2tlZCBkb21haW4uLi4KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgY29va2llcyA9IGMubWFrZV9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBjLnNldF9jb29raWUoY29va2llc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQorICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3Rfc2VjdXJlKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgZm9yIG5zIGluIFRydWUsIEZhbHNlOgorICAgICAgICAgICAgZm9yIHdoaXRlc3BhY2UgaW4gIiAiLCAiIjoKKyAgICAgICAgICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgICAgICAgICBpZiBuczoKKyAgICAgICAgICAgICAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PUZhbHNlKQorICAgICAgICAgICAgICAgICAgICBpbnQgPSBpbnRlcmFjdF9uZXRzY2FwZQorICAgICAgICAgICAgICAgICAgICB2cyA9ICIiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisgICAgICAgICAgICAgICAgICAgIGludCA9IGludGVyYWN0XzI5NjUKKyAgICAgICAgICAgICAgICAgICAgdnMgPSAiOyBWZXJzaW9uPTEiCisgICAgICAgICAgICAgICAgYy5zZXRfcG9saWN5KHBvbCkKKyAgICAgICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbS8iCisgICAgICAgICAgICAgICAgaW50KGMsIHVybCwgImZvbzE9YmFyJXMlcyIgJSAodnMsIHdoaXRlc3BhY2UpKQorICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28yPWJhciVzOyBzZWN1cmUlcyIgJSAgKHZzLCB3aGl0ZXNwYWNlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgICAgIG5vdCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28xIl0uc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAibm9uLXNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBzZWN1cmUiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICAgICAgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMiJdLnNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgInNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBub24tc2VjdXJlIikKKworICAgIGRlZiB0ZXN0X3F1b3RlX2Nvb2tpZV92YWx1ZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgcidmb289XGIiYSJyOyBWZXJzaW9uPTEnKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoLCByJyRWZXJzaW9uPTE7IGZvbz1cXGJcImFcInInKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maW5hbF9zbGFzaChzZWxmKToKKyAgICAgICAgIyBNaXNzaW5nIHNsYXNoIGZyb20gcmVxdWVzdCBVUkwncyBhYnNfcGF0aCBzaG91bGQgYmUgYXNzdW1lZCBwcmVzZW50LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbSIKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAiZm9vPWJhcjsgVmVyc2lvbj0xIikKKyAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisKKyAgICBkZWYgdGVzdF9kb21haW5fbWlycm9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8oIkRvbWFpbiIgbm90IGluIGgsCisgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IGRvbWFpbiByZXR1cm5lZCB3aXRoIGRvbWFpbiBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IERvbWFpbj0uYmFyLmNvbScpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgICMgbm90ZSBtaXNzaW5nIGluaXRpYWwgZG90IGluIERvbWFpbgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49YmFyLmNvbScpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSJiYXIuY29tIicgaW4gaCwgImRvbWFpbiBub3QgcmV0dXJuZWQiKQorCisgICAgZGVmIHRlc3RfcGF0aF9taXJyb3Ioc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiUGF0aCIgbm90IGluIGgsCisgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBhdGggcmV0dXJuZWQgd2l0aCBwYXRoIHByZXNlbnQiKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUGF0aD0vJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8oJyRQYXRoPSIvIicgaW4gaCwgInBhdGggbm90IHJldHVybmVkIikKKworICAgIGRlZiB0ZXN0X3BvcnRfbWlycm9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8oIlBvcnQiIG5vdCBpbiBoLAorICAgICAgICAgICAgICAgICAgICAgImFic2VudCBwb3J0IHJldHVybmVkIHdpdGggcG9ydCBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQiKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2goIlwkUG9ydChbXj1dfCQpIiwgaCksCisgICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG5vIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIG5vIHZhbHVlIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQ9IjgwIicpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCckUG9ydD0iODAiJyBpbiBoLAorICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBzaW5nbGUgdmFsdWUgbm90IHJldHVybmVkIHdpdGggc2luZ2xlIHZhbHVlIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQ9IjgwLDgwODAiJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydF8oJyRQb3J0PSI4MCw4MDgwIicgaW4gaCwKKyAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggbXVsdGlwbGUgdmFsdWVzIG5vdCByZXR1cm5lZCB3aXRoIG11bHRpcGxlICIKKyAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiKQorCisgICAgZGVmIHRlc3Rfbm9fcmV0dXJuX2NvbW1lbnQoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7ICcKKyAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudD0iZG9lcyBhbnlib2R5IHJlYWQgdGhlc2U/IjsgJworICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50VVJMPSJodHRwOi8vZm9vLmJhci5uZXQvY29tbWVudC5odG1sIicpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgIkNvbW1lbnQiIG5vdCBpbiBoLAorICAgICAgICAgICAgIkNvbW1lbnQgb3IgQ29tbWVudFVSTCBjb29raWUtYXR0cmlidXRlcyByZXR1cm5lZCB0byBzZXJ2ZXIiKQorCisgICAgZGVmIHRlc3RfQ29va2llX2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBDb29raWUsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjcyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgICMgYWRkIHNvbWUgcmFuZG9tIGNvb2tpZXMKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly9ibGFoLnNwYW0ub3JnLyIsICdmb289ZWdnczsgVmVyc2lvbj0xOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjcywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC8iLCAic3BhbT1iYXI7IHNlY3VyZSIpCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgc2VjdXJlOyBWZXJzaW9uPTEiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7IHBhdGg9LzsgVmVyc2lvbj0xIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICByJ2Jhbmc9d2FsbG9wOyB2ZXJzaW9uPTE7IGRvbWFpbj0iLnNvbC5ubyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICByJ3BvcnQ9IjkwLDEwMCwgODAsODA4MCI7ICcKKyAgICAgICAgICAgICAgICAgICAgICByJ21heC1hZ2U9MTAwOyBDb21tZW50ID0gIkp1c3Qga2lkZGluZyEgKFwifFxcXFwpICInKQorCisgICAgICAgIHZlcnNpb25zID0gWzEsIDEsIDEsIDAsIDFdCisgICAgICAgIG5hbWVzID0gWyJiYW5nIiwgImZvbyIsICJmb28iLCAic3BhbSIsICJmb28iXQorICAgICAgICBkb21haW5zID0gWyIuc29sLm5vIiwgImJsYWguc3BhbS5vcmciLCAid3d3LmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAid3d3LmFjbWUuY29tIiwgInd3dy5hY21lLmNvbSJdCisgICAgICAgIHBhdGhzID0gWyIvIiwgIi8iLCAiLyIsICIvYmxhaCIsICIvYmxhaC8iXQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgIGZvciBjIGluIGNzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIENvb2tpZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy52ZXJzaW9uLCB2ZXJzaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLm5hbWUsIG5hbWVzW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuZG9tYWluLCBkb21haW5zW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMucGF0aCwgcGF0aHNbaV0pCisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycworCisgICAgICAgICMgbWlzc2luZyBkb21haW4gdmFsdWUgKGludmFsaWQgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb289YmFyOyBwYXRoPS87IGRvbWFpbiJdKSwKKyAgICAgICAgICAgIFtbKCJmb28iLCAiYmFyIiksCisgICAgICAgICAgICAgICgicGF0aCIsICIvIiksICgiZG9tYWluIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICAgICAgKQorICAgICAgICAjIGludmFsaWQgZXhwaXJlcyB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb289YmFyOyBleHBpcmVzPUZvbyBCYXIgMTIgMzM6MjI6MTEgMjAwMCJdKSwKKyAgICAgICAgICAgIFtbKCJmb28iLCAiYmFyIiksICgiZXhwaXJlcyIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KKyAgICAgICAgICAgICkKKyAgICAgICAgIyBtaXNzaW5nIGNvb2tpZSB2YWx1ZSAodmFsaWQgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb28iXSksCisgICAgICAgICAgICBbWygiZm9vIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICAgICAgKQorICAgICAgICAjIHNob3VsZG4ndCBhZGQgdmVyc2lvbiBpZiBoZWFkZXIgaXMgZW1wdHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VfbnNfaGVhZGVycyhbIiJdKSwgW10pCisKKyAgICBkZWYgdGVzdF9iYWRfY29va2llX2hlYWRlcihzZWxmKToKKworICAgICAgICBkZWYgY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycyk6CisgICAgICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgciA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMociwgcmVxKQorICAgICAgICAgICAgcmV0dXJuIGMKKworICAgICAgICAjIG5vbmUgb2YgdGhlc2UgYmFkIGhlYWRlcnMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQKKyAgICAgICAgZm9yIGhlYWRlcnMgaW4gWworICAgICAgICAgICAgWyJTZXQtQ29va2llOiAiXSwgICMgYWN0dWFsbHksIG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGlzCisgICAgICAgICAgICBbIlNldC1Db29raWUyOiAiXSwgICMgZGl0dG8KKyAgICAgICAgICAgICMgbWlzc2luZyBkb21haW4gdmFsdWUKKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTI6IGE9Zm9vOyBwYXRoPS87IFZlcnNpb249MTsgZG9tYWluIl0sCisgICAgICAgICAgICAjIGJhZCBtYXgtYWdlCisgICAgICAgICAgICBbIlNldC1Db29raWU6IGI9Zm9vOyBtYXgtYWdlPW9vcHMiXSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBjID0gY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgICAgICMgdGhlc2UgYmFkIGNvb2tpZXMgc2hvdWxkbid0IGJlIHNldAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQorCisgICAgICAgICMgY29va2llIHdpdGggaW52YWxpZCBleHBpcmVzIGlzIHRyZWF0ZWQgYXMgc2Vzc2lvbiBjb29raWUKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KKyAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImMiXQorICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmV4cGlyZXMgaXMgTm9uZSkKKworCitjbGFzcyBMV1BDb29raWVUZXN0cyhUZXN0Q2FzZSk6CisgICAgIyBUZXN0cyB0YWtlbiBmcm9tIGxpYnd3dy1wZXJsLCB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgYW5kIGFkZGl0aW9ucy4KKworICAgIGRlZiB0ZXN0X25ldHNjYXBlX2V4YW1wbGVfMShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAjIEZpcnN0IHdlIGNoZWNrIHRoYXQgaXQgd29ya3MgZm9yIHRoZSBvcmlnaW5hbCBleGFtcGxlIGF0CisgICAgICAgICMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbAorCisgICAgICAgICMgQ2xpZW50IHJlcXVlc3RzIGEgZG9jdW1lbnQsIGFuZCByZWNlaXZlcyBpbiB0aGUgcmVzcG9uc2U6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS87IGV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtOTkgMjM6MTI6NDAgR01UCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEUKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgQ2xpZW50IHJlY2VpdmVzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogU0hJUFBJTkc9RkVERVg7IHBhdGg9L2ZvCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvZm9vIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBTSElQUElORz1GRURFWAorICAgICAgICAjCisgICAgICAgICMgVGhlIGxhc3QgQ29va2llIGlzIGJ1Z2d5LCBiZWNhdXNlIGJvdGggc3BlY2lmaWNhdGlvbnMgc2F5IHRoYXQgdGhlCisgICAgICAgICMgbW9zdCBzcGVjaWZpYyBjb29raWUgbXVzdCBiZSBzZW50IGZpcnN0LiAgU0hJUFBJTkc9RkVERVggaXMgdGhlCisgICAgICAgICMgbW9zdCBzcGVjaWZpYyBhbmQgc2hvdWxkIHRodXMgYmUgZmlyc3QuCisKKyAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCisKKyAgICAgICAgaGVhZGVycyA9IFtdCisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjUgPSBUcnVlKSkKKworICAgICAgICAjcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKKyAgICAgICAgIyAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjgwIn0pCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgKKyAgICAgICAgICAgICJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8gOyAiCisgICAgICAgICAgICAiZXhwaXJlcz1XZWRuZXNkYXksIDA5LU5vdi0lZCAyMzoxMjo0MCBHTVQiICUgeWVhcl9wbHVzX29uZSkKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby9iYXIiKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiIGluIGggYW5kCisgICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCkKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZTogU0hJUFBJTkc9RkVERVg7IHBhdGg9L2ZvbycpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbSIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQorICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGggYW5kCisgICAgICAgICAgICAgICAgICAgICAiU0hJUFBJTkc9RkVERVgiIG5vdCBpbiBoKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCgiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiIGluIGggYW5kCisgICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGggYW5kCisgICAgICAgICAgICAgICAgICAgICAgaC5zdGFydHN3aXRoKCJTSElQUElORz1GRURFWDsiKSkpCisKKyAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIyBTZWNvbmQgRXhhbXBsZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZToKKyAgICAgICAgIworICAgICAgICAjIEFzc3VtZSBhbGwgbWFwcGluZ3MgZnJvbSBhYm92ZSBoYXZlIGJlZW4gY2xlYXJlZC4KKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgcGF0aD0vYW1tbworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2FtbW8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgICAgICAgTk9URTogVGhlcmUgYXJlIHR3byBuYW1lL3ZhbHVlIHBhaXJzIG5hbWVkICJQQVJUX05VTUJFUiIgZHVlIHRvCisgICAgICAgICMgICAgICAgdGhlIGluaGVyaXRhbmNlIG9mIHRoZSAiLyIgbWFwcGluZyBpbiBhZGRpdGlvbiB0byB0aGUgIi9hbW1vIiBtYXBwaW5nLgorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBoZWFkZXJzID0gW10KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgcGF0aD0vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoCisgICAgICAgICAgICAiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzOyBwYXRoPS9hbW1vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vYW1tbyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5zZWFyY2gociJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKSkKKworICAgIGRlZiB0ZXN0X2lldGZfZXhhbXBsZV8xKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICMgVGhlbiB3ZSB0ZXN0IHdpdGggdGhlIGV4YW1wbGVzIGZyb20gZHJhZnQtaWV0Zi1odHRwLXN0YXRlLW1hbi1tZWMtMDMudHh0CisgICAgICAgICMKKyAgICAgICAgIyA1LiAgRVhBTVBMRVMKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKworICAgICAgICAjCisgICAgICAgICMgNS4xICBFeGFtcGxlIDEKKyAgICAgICAgIworICAgICAgICAjIE1vc3QgZGV0YWlsIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMgaGFzIGJlZW4gb21pdHRlZC4gIEFzc3VtZQorICAgICAgICAjIHRoZSB1c2VyIGFnZW50IGhhcyBubyBzdG9yZWQgY29va2llcy4KKyAgICAgICAgIworICAgICAgICAjICAgMS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL2xvZ2luIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgaWRlbnRpZmllcyBzZWxmIHZpYSBhIGZvcm0uCisgICAgICAgICMKKyAgICAgICAgIyAgIDIuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llIHJlZmxlY3RzIHVzZXIncyBpZGVudGl0eS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9sb2dpbicsCisgICAgICAgICAgICAnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUpCisKKyAgICAgICAgIworICAgICAgICAjICAgMy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3BpY2tpdGVtIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBVc2VyIHNlbGVjdHMgYW4gaXRlbSBmb3IgYGBzaG9wcGluZyBiYXNrZXQuJycKKyAgICAgICAgIworICAgICAgICAjICAgNC4gIFNlcnZlciAtPiBVc2VyIEFnZW50CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICAgICAgICBQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNob3BwaW5nIGJhc2tldCBjb250YWlucyBhbiBpdGVtLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOworICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKAorICAgICAgICAgICAgcideXCRWZXJzaW9uPSI/MSI/OyBDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPzsgXCRQYXRoPSIvYWNtZSIkJywKKyAgICAgICAgICAgIGNvb2tpZSkpCisKKyAgICAgICAgIworICAgICAgICAjICAgNS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3NoaXBwaW5nIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICAgICAgICBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSI7CisgICAgICAgICMgICAgICAgICAgICAgICBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgc2VsZWN0cyBzaGlwcGluZyBtZXRob2QgZnJvbSBmb3JtLgorICAgICAgICAjCisgICAgICAgICMgICA2LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKKyAgICAgICAgIworICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSworICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBOZXcgY29va2llIHJlZmxlY3RzIHNoaXBwaW5nIG1ldGhvZC4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvc2hpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKworICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInXlwkVmVyc2lvbj0iPzEiPzsnLCBjb29raWUpKQorICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInUGFydF9OdW1iZXI9Ij9Sb2NrZXRfTGF1bmNoZXJfMDAwMSI/OycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKKworICAgICAgICAjCisgICAgICAgICMgICA3LiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvcHJvY2VzcyBIVFRQLzEuMQorICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgICAgICAgQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyAkUGF0aD0iL2FjbWUiOworICAgICAgICAjICAgICAgICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIFNoaXBwaW5nPSJGZWRFeCI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQorICAgICAgICAjCisgICAgICAgICMgICAgICAgVXNlciBjaG9vc2VzIHRvIHByb2Nlc3Mgb3JkZXIuCisgICAgICAgICMKKyAgICAgICAgIyAgIDguICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBUcmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcHJvY2VzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgIHJlLnNlYXJjaChyJ1NoaXBwaW5nPSI/RmVkRXgiPztccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpIGFuZAorICAgICAgICAgICAgIldJTEVfRV9DT1lPVEUiIGluIGNvb2tpZSkKKworICAgICAgICAjCisgICAgICAgICMgVGhlIHVzZXIgYWdlbnQgbWFrZXMgYSBzZXJpZXMgb2YgcmVxdWVzdHMgb24gdGhlIG9yaWdpbiBzZXJ2ZXIsIGFmdGVyCisgICAgICAgICMgZWFjaCBvZiB3aGljaCBpdCByZWNlaXZlcyBhIG5ldyBjb29raWUuICBBbGwgdGhlIGNvb2tpZXMgaGF2ZSB0aGUgc2FtZQorICAgICAgICAjIFBhdGggYXR0cmlidXRlIGFuZCAoZGVmYXVsdCkgZG9tYWluLiAgQmVjYXVzZSB0aGUgcmVxdWVzdCBVUkxzIGFsbCBoYXZlCisgICAgICAgICMgL2FjbWUgYXMgYSBwcmVmaXgsIGFuZCB0aGF0IG1hdGNoZXMgdGhlIFBhdGggYXR0cmlidXRlLCBlYWNoIHJlcXVlc3QKKyAgICAgICAgIyBjb250YWlucyBhbGwgdGhlIGNvb2tpZXMgcmVjZWl2ZWQgc28gZmFyLgorCisgICAgZGVmIHRlc3RfaWV0Zl9leGFtcGxlXzIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICAjIDUuMiAgRXhhbXBsZSAyCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIGVmZmVjdCBvZiB0aGUgUGF0aCBhdHRyaWJ1dGUuICBBbGwgZGV0YWlsCisgICAgICAgICMgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGVhZGVycyBoYXMgYmVlbiBvbWl0dGVkLiAgQXNzdW1lIHRoZSB1c2VyIGFnZW50CisgICAgICAgICMgaGFzIG5vIHN0b3JlZCBjb29raWVzLgorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorCisgICAgICAgICMgSW1hZ2luZSB0aGUgdXNlciBhZ2VudCBoYXMgcmVjZWl2ZWQsIGluIHJlc3BvbnNlIHRvIGVhcmxpZXIgcmVxdWVzdHMsCisgICAgICAgICMgdGhlIHJlc3BvbnNlIGhlYWRlcnMKKyAgICAgICAgIworICAgICAgICAjIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgIFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgYW5kCisgICAgICAgICMKKyAgICAgICAgIyBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7IFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgUGF0aD0iL2FjbWUvYW1tbyIKKworICAgICAgICBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vL3NwZWNpZmljIiwKKyAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJywKKyAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUmlkaW5nX1JvY2tldF8wMDIzIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lL2FtbW8iJykKKworICAgICAgICAjIEEgc3Vic2VxdWVudCByZXF1ZXN0IGJ5IHRoZSB1c2VyIGFnZW50IHRvIHRoZSAoc2FtZSkgc2VydmVyIGZvciBVUkxzIG9mCisgICAgICAgICMgdGhlIGZvcm0gL2FjbWUvYW1tby8uLi4gIHdvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGhlYWRlcjoKKyAgICAgICAgIworICAgICAgICAjIENvb2tpZTogJFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7ICRQYXRoPSIvYWNtZS9hbW1vIjsKKyAgICAgICAgIyAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCB0aGUgTkFNRT1WQUxVRSBwYWlyIGZvciB0aGUgY29va2llIHdpdGggdGhlIG1vcmUgc3BlY2lmaWMgUGF0aAorICAgICAgICAjIGF0dHJpYnV0ZSwgL2FjbWUvYW1tbywgY29tZXMgYmVmb3JlIHRoZSBvbmUgd2l0aCB0aGUgbGVzcyBzcGVjaWZpYyBQYXRoCisgICAgICAgICMgYXR0cmlidXRlLCAvYWNtZS4gIEZ1cnRoZXIgbm90ZSB0aGF0IHRoZSBzYW1lIGNvb2tpZSBuYW1lIGFwcGVhcnMgbW9yZQorICAgICAgICAjIHRoYW4gb25jZS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvYW1tby8uLi4iKQorICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICByZS5zZWFyY2gociJSaWRpbmdfUm9ja2V0XzAwMjMuKlJvY2tldF9MYXVuY2hlcl8wMDAxIiwgY29va2llKSkKKworICAgICAgICAjIEEgc3Vic2VxdWVudCByZXF1ZXN0IGJ5IHRoZSB1c2VyIGFnZW50IHRvIHRoZSAoc2FtZSkgc2VydmVyIGZvciBhIFVSTCBvZgorICAgICAgICAjIHRoZSBmb3JtIC9hY21lL3BhcnRzLyB3b3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBoZWFkZXI6CisgICAgICAgICMKKyAgICAgICAgIyBDb29raWU6ICRWZXJzaW9uPSIxIjsgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgSGVyZSwgdGhlIHNlY29uZCBjb29raWUncyBQYXRoIGF0dHJpYnV0ZSAvYWNtZS9hbW1vIGlzIG5vdCBhIHByZWZpeCBvZgorICAgICAgICAjIHRoZSByZXF1ZXN0IFVSTCwgL2FjbWUvcGFydHMvLCBzbyB0aGUgY29va2llIGRvZXMgbm90IGdldCBmb3J3YXJkZWQgdG8KKyAgICAgICAgIyB0aGUgc2VydmVyLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wYXJ0cy8iKQorICAgICAgICBzZWxmLmFzc2VydF8oIlJvY2tldF9MYXVuY2hlcl8wMDAxIiBpbiBjb29raWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAiUmlkaW5nX1JvY2tldF8wMDIzIiBub3QgaW4gY29va2llKQorCisgICAgZGVmIHRlc3RfcmVqZWN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmVqZWN0aW9uIG9mIFNldC1Db29raWUyIHJlc3BvbnNlcyBiYXNlZCBvbiBkb21haW4sIHBhdGgsIHBvcnQuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBEZWZhdWx0Q29va2llUG9saWN5LCBMV1BDb29raWVKYXIKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKworICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCisKKyAgICAgICAgbWF4X2FnZSA9ICJtYXgtYWdlPTM2MDAiCisKKyAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAobm8gZW1iZWRkZWQgZG90cykKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYykKKworICAgICAgICAjIGxlZ2FsIGRvbWFpbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGluZz1wb25nOyBkb21haW49ImFjbWUuY29tIjsgdmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQorCisgICAgICAgICMgaWxsZWdhbCBkb21haW4gKGhvc3QgcHJlZml4ICJ3d3cuYSIgY29udGFpbnMgYSBkb3QpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYS5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doaXo9YmFuZzsgZG9tYWluPSJhY21lLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKKworICAgICAgICAjIGxlZ2FsIGRvbWFpbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmEuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3b3c9Zmx1dHRlcjsgZG9tYWluPSIuYS5hY21lLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKworICAgICAgICAjIGNhbid0IHBhcnRpYWxseSBtYXRjaCBhbiBJUC1hZGRyZXNzCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly8xMjUuMTI1LjEyNS4xMjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6enp6PXBpbmc7IGRvbWFpbj0iMTI1LjEyNS4xMjUiOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCisKKyAgICAgICAgIyBpbGxlZ2FsIHBhdGggKG11c3QgYmUgcHJlZml4IG9mIHJlcXVlc3QgcGF0aCkKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibGFoPXJodWJhcmI7IGRvbWFpbj0iLnNvbC5ubyI7IHBhdGg9Ii9mb28iOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKworICAgICAgICAjIGxlZ2FsIHBhdGgKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jpbmc9Ym9uZzsgZG9tYWluPSIuc29sLm5vIjsgcGF0aD0iL2ZvbyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAzKQorCisgICAgICAgICMgaWxsZWdhbCBwb3J0IChyZXF1ZXN0LXBvcnQgbm90IGluIGxpc3QpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hpej1mZmZ0OyBkb21haW49Ii5zb2wubm8iOyBwb3J0PSI5MCwxMDAiOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMykKKworICAgICAgICAjIGxlZ2FsIHBvcnQKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKKyAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LnNvbC5ubyIsCisgICAgICAgICAgICByJ2Jhbmc9d2FsbG9wOyB2ZXJzaW9uPTE7IGRvbWFpbj0iLnNvbC5ubyI7ICcKKyAgICAgICAgICAgIHIncG9ydD0iOTAsMTAwLCA4MCw4MDgwIjsgJworICAgICAgICAgICAgcidtYXgtYWdlPTEwMDsgQ29tbWVudCA9ICJKdXN0IGtpZGRpbmchIChcInxcXFxcKSAiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCA0KQorCisgICAgICAgICMgcG9ydCBhdHRyaWJ1dGUgd2l0aG91dCBhbnkgdmFsdWUgKGN1cnJlbnQgcG9ydCkKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb285PWJhcjsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyBwb3J0OyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heC1hZ2U9MTAwOycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgNSkKKworICAgICAgICAjIGVuY29kZWQgcGF0aAorICAgICAgICAjIExXUCBoYXMgdGhpcyB0ZXN0LCBidXQgdW5lc2NhcGluZyBhbGxvd2VkIHBhdGggY2hhcmFjdGVycyBzZWVtcworICAgICAgICAjIGxpa2UgYSBiYWQgaWRlYSwgc28gSSB0aGluayB0aGlzIHNob3VsZCBmYWlsOgorIyMgICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5uby9mb28vIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTY2b28iJykKKyAgICAgICAgIyBidXQgdGhpcyBpcyBPSywgYmVjYXVzZSAnPCcgaXMgbm90IGFuIGFsbG93ZWQgSFRUUCBVUkwgcGF0aAorICAgICAgICAjIGNoYXJhY3RlcjoKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vPG9vLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTNjb28iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCA2KQorCisgICAgICAgICMgc2F2ZSBhbmQgcmVzdG9yZQorICAgICAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjLnNhdmUoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgICAgICBvbGQgPSByZXByKGMpCisKKyAgICAgICAgICAgIGMgPSBMV1BDb29raWVKYXIocG9saWN5PXBvbCkKKyAgICAgICAgICAgIGMubG9hZChmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvbGQsIHJlcHIoYykpCisKKyAgICBkZWYgdGVzdF91cmxfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICMgVHJ5IHNvbWUgVVJMIGVuY29kaW5ncyBvZiB0aGUgUEFUSHMuCisgICAgICAgICMgKHRoZSBiZWhhdmlvdXIgaGVyZSBoYXMgY2hhbmdlZCBmcm9tIGxpYnd3dy1wZXJsKQorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1LyUzYyUzYyUwQW5ldyVFNS8lRTUiLAorICAgICAgICAgICAgICAgICAgICAgICJmb28gID0gICBiYXI7IHZlcnNpb24gICAgPSAgIDEiKQorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28lMmYlMjUvPDwlMGFuZXflL+b45SIsCisgICAgICAgICAgICAnYmFyPWJhejsgcGF0aD0iL2Zvby8iOyB2ZXJzaW9uPTEnKTsKKyAgICAgICAgdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocideXCR2ZXJzaW9uPVwiPzFcIj8nLCByZS5JKQorICAgICAgICBzZWxmLmFzc2VydF8oImZvbz1iYXIiIGluIGNvb2tpZSBhbmQgdmVyc2lvbl9yZS5zZWFyY2goY29va2llKSkKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyUyNS88PCUwYW5ld+Uv5vjlIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUpCisKKyAgICAgICAgIyB1bmljb2RlIFVSTCBkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsIHUiaHR0cDovL3d3dy5hY21lLmNvbS9ceGZjIikKKworICAgIGRlZiB0ZXN0X21vemlsbGEoc2VsZik6CisgICAgICAgICMgU2F2ZSAvIGxvYWQgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgZmlsZSBmb3JtYXQuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCisKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IG1heC1hZ2U9MTAwOyBWZXJzaW9uPTEiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBwb3J0PSI4MCI7IG1heC1hZ2U9MTAwOyBEaXNjYXJkOyBWZXJzaW9uPTEnKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICJmb28zPWJhcjsgc2VjdXJlOyBWZXJzaW9uPTEiKQorCisgICAgICAgIGV4cGlyZXMgPSAiZXhwaXJlcz0wOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlICh5ZWFyX3BsdXNfb25lLCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYT1iYXI7ICVzIiAlIGV4cGlyZXMpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2I9YmFyOyBEb21haW49LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2M9YmFyOyBEb21haW49d3d3LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCisKKyAgICAgICAgZGVmIHNhdmVfYW5kX3Jlc3RvcmUoY2osIGlnbm9yZV9kaXNjYXJkKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjai5zYXZlKGlnbm9yZV9kaXNjYXJkPWlnbm9yZV9kaXNjYXJkKQorICAgICAgICAgICAgICAgIG5ld19jID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICAgICAgICAgIG5ld19jLmxvYWQoaWdub3JlX2Rpc2NhcmQ9aWdub3JlX2Rpc2NhcmQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisgICAgICAgICAgICByZXR1cm4gbmV3X2MKKworICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5ld19jKSwgNikgICMgbm9uZSBkaXNjYXJkZWQKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQorCisgICAgICAgIG5ld19jID0gc2F2ZV9hbmRfcmVzdG9yZShjLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5ld19jKSwgNCkgICMgMiBvZiB0aGVtIGRpc2NhcmRlZCBvbiBzYXZlCisgICAgICAgIHNlbGYuYXNzZXJ0XygibmFtZT0nZm9vMScsIHZhbHVlPSdiYXInIiBpbiByZXByKG5ld19jKSkKKworICAgIGRlZiB0ZXN0X25ldHNjYXBlX21pc2Moc2VsZik6CisgICAgICAgICMgU29tZSBhZGRpdGlvbmFsIE5ldHNjYXBlIGNvb2tpZXMgdGVzdHMuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGhlYWRlcnMgPSBbXQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQorCisgICAgICAgICMgTmV0c2NhcGUgYWxsb3dzIGEgaG9zdCBwYXJ0IHRoYXQgY29udGFpbnMgZG90cworICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogQ3VzdG9tZXI9V0lMRV9FX0NPWU9URTsgZG9tYWluPS5hY21lLmNvbSIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICAjIGFuZCB0aGF0IHRoZSBkb21haW4gaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3Qgd2l0aG91dCBhZGRpbmcgYSBsZWFkaW5nCisgICAgICAgICMgZG90IHRvIHRoZSBkb21haW4uICBTaG91bGQgbm90IHF1b3RlIGV2ZW4gaWYgc3RyYW5nZSBjaGFycyBhcmUgdXNlZAorICAgICAgICAjIGluIHRoZSBjb29raWUgdmFsdWUuCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBQQVJUX05VTUJFUj0zLDQ7IGRvbWFpbj1mb28uYmFyLmFjbWUuY29tIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9mb28uYmFyLmFjbWUuY29tL2ZvbyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Myw0IiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikgYW5kCisgICAgICAgICAgICAiQ3VzdG9tZXI9V0lMRV9FX0NPWU9URSIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc18yOTY1KHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFuZGxpbmcgb2YgbG9jYWwgaW50cmFuZXQgaG9zdG5hbWVzIHdpdGhvdXQgYSBkb3QuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IFBPUlQ7IERpc2NhcmQ7IFZlcnNpb249MTsiKQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgZG9tYWluPSIubG9jYWwiOyBWZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydF8oImZvbzE9YmFyIiBpbiBjb29raWUpCisKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwgJ2ZvbzM9YmFyOyBWZXJzaW9uPTEnKQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iKQorICAgICAgICBzZWxmLmFzc2VydF8oImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQorCisgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc19ucyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gRmFsc2UpKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwgImZvbzE9YmFyIikKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgZG9tYWluPS5sb2NhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28xPWJhciIgaW4gY29va2llKQorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iKQorICAgICAgICBzZWxmLmFzc2VydF8oImZvbzI9YmFyIiBpbiBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKKworICAgIGRlZiB0ZXN0X2VtcHR5X3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIyBUZXN0IGZvciBlbXB0eSBwYXRoCisgICAgICAgICMgQnJva2VuIHdlYi1zZXJ2ZXIgT1JJT04vMS4zLjM4IHJldHVybnMgdG8gdGhlIGNsaWVudCByZXNwb25zZSBsaWtlCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzOyBQYXRoPQorICAgICAgICAjCisgICAgICAgICMgaWUuIHdpdGggUGF0aCBzZXQgdG8gbm90aGluZy4KKyAgICAgICAgIyBJbiB0aGlzIGNhc2UsIGV4dHJhY3RfY29va2llcygpIG11c3Qgc2V0IGNvb2tpZSB0byAvIChyb290KQorICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IFRydWUpKQorICAgICAgICBoZWFkZXJzID0gW10KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzOyBQYXRoPSIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKKworICAgICAgICAjIG1pc3NpbmcgcGF0aCBpbiB0aGUgcmVxdWVzdCBVUkkKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hbnRzLmNvbTo4MDgwIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQorCisgICAgZGVmIHRlc3Rfc2Vzc2lvbl9jb29raWVzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgICMgQ2hlY2sgc2Vzc2lvbiBjb29raWVzIGFyZSBkZWxldGVkIHByb3Blcmx5IGJ5CisgICAgICAgICMgQ29va2llSmFyLmNsZWFyX3Nlc3Npb25fY29va2llcyBtZXRob2QKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCdodHRwOi8vd3d3LnBlcmxtZWlzdGVyLmNvbS9zY3JpcHRzJykKKyAgICAgICAgaGVhZGVycyA9IFtdCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBzMT1zZXNzaW9uO1BhdGg9L3NjcmlwdHMiKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogcDE9cGVybTsgRG9tYWluPS5wZXJsbWVpc3Rlci5jb207IgorICAgICAgICAgICAgICAgICAgICAgICAiUGF0aD0vO2V4cGlyZXM9RnJpLCAwMi1GZWItJWQgMjM6MjQ6MjAgR01UIiAlCisgICAgICAgICAgICAgICAgICAgICAgIHllYXJfcGx1c19vbmUpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBwMj1wZXJtO1BhdGg9LztleHBpcmVzPUZyaSwgIgorICAgICAgICAgICAgICAgICAgICAgICAiMDItRmViLSVkIDIzOjI0OjIwIEdNVCIgJSB5ZWFyX3BsdXNfb25lKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogczI9c2Vzc2lvbjtQYXRoPS9zY3JpcHRzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbj0ucGVybG1laXN0ZXIuY29tIikKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUyOiBzMz1zZXNzaW9uO1ZlcnNpb249MTtEaXNjYXJkO1BhdGg9Ii8iJykKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICdodHRwOi8vd3d3LnBlcmxtZWlzdGVyLmNvbS9zY3JpcHRzJykKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgICMgSG93IG1hbnkgc2Vzc2lvbi9wZXJtYW5lbnQgY29va2llcyBkbyB3ZSBoYXZlPworICAgICAgICBjb3VudGVyID0geyJzZXNzaW9uX2FmdGVyIjogMCwKKyAgICAgICAgICAgICAgICAgICAicGVybV9hZnRlciI6IDAsCisgICAgICAgICAgICAgICAgICAgInNlc3Npb25fYmVmb3JlIjogMCwKKyAgICAgICAgICAgICAgICAgICAicGVybV9iZWZvcmUiOiAwfQorICAgICAgICBmb3IgY29va2llIGluIGM6CisgICAgICAgICAgICBrZXkgPSAiJXNfYmVmb3JlIiAlIGNvb2tpZS52YWx1ZQorICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQorICAgICAgICBjLmNsZWFyX3Nlc3Npb25fY29va2llcygpCisgICAgICAgICMgSG93IG1hbnkgbm93PworICAgICAgICBmb3IgY29va2llIGluIGM6CisgICAgICAgICAgICBrZXkgPSAiJXNfYWZ0ZXIiICUgY29va2llLnZhbHVlCisgICAgICAgICAgICBjb3VudGVyW2tleV0gPSBjb3VudGVyW2tleV0gKyAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoCisgICAgICAgICAgICAjIGEgcGVybWFuZW50IGNvb2tpZSBnb3QgbG9zdCBhY2NpZGVudGx5CisgICAgICAgICAgICBjb3VudGVyWyJwZXJtX2FmdGVyIl0gIT0gY291bnRlclsicGVybV9iZWZvcmUiXSBvcgorICAgICAgICAgICAgIyBhIHNlc3Npb24gY29va2llIGhhc24ndCBiZWVuIGNsZWFyZWQKKyAgICAgICAgICAgIGNvdW50ZXJbInNlc3Npb25fYWZ0ZXIiXSAhPSAwIG9yCisgICAgICAgICAgICAjIHdlIGRpZG4ndCBoYXZlIHNlc3Npb24gY29va2llcyBpbiB0aGUgZmlyc3QgcGxhY2UKKyAgICAgICAgICAgIGNvdW50ZXJbInNlc3Npb25fYmVmb3JlIl0gPT0gMCkpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zZXRzCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgRGF0ZVRpbWVUZXN0cywKKyAgICAgICAgSGVhZGVyVGVzdHMsCisgICAgICAgIENvb2tpZVRlc3RzLAorICAgICAgICBMV1BDb29raWVUZXN0cywKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKaW5kZXggZjM4YTRhMy4uOGE3Y2Y2NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQpAQCAtNTQsNiArNTQsMTAgQEAKICAgICBkZWYgcmVhZGxpbmUoc2VsZiwgY291bnQ9Tm9uZSk6IHBhc3MKICAgICBkZWYgY2xvc2Uoc2VsZik6IHBhc3MKIAorY2xhc3MgTW9ja0hlYWRlcnMoZGljdCk6CisgICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlcygpCisKIGNsYXNzIE1vY2tSZXNwb25zZShTdHJpbmdJTy5TdHJpbmdJTyk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIG1zZywgaGVhZGVycywgZGF0YSwgdXJsPU5vbmUpOgogICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTy5fX2luaXRfXyhzZWxmLCBkYXRhKQpAQCAtNjMsNiArNjcsMTIgQEAKICAgICBkZWYgZ2V0dXJsKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi51cmwKIAorY2xhc3MgTW9ja0Nvb2tpZUphcjoKKyAgICBkZWYgYWRkX2Nvb2tpZV9oZWFkZXIoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgIHNlbGYuYWNoX3JlcSA9IHJlcXVlc3QKKyAgICBkZWYgZXh0cmFjdF9jb29raWVzKHNlbGYsIHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgc2VsZi5lY19yZXEsIHNlbGYuZWNfciA9IHJlcXVlc3QsIHJlc3BvbnNlCisKIGNsYXNzIEZha2VNZXRob2Q6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhfbmFtZSwgYWN0aW9uLCBoYW5kbGUpOgogICAgICAgICBzZWxmLm1ldGhfbmFtZSA9IG1ldGhfbmFtZQpAQCAtNDc0LDcgKzQ4NCw3IEBACiAgICAgICAgIGZvciBkYXRhIGluICIiLCBOb25lOiAgIyBQT1NULCBHRVQKICAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBkYXRhKQogICAgICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKLSAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdChyZXEpCisgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZTogICMgR0VUCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LWxlbmd0aCIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtdHlwZSIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKQEAgLTQ5MSw3ICs1MDEsNyBAQAogICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYmFyIikKICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiSG9zdCIsICJiYXoiKQogICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgImZvbyIpCi0gICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3QocmVxKQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1sZW5ndGgiXSwgImZvbyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC10eXBlIl0sICJiYXIiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwgImJheiIpCkBAIC01MTQsNiArNTI0LDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5wcm90bywgImh0dHAiKSAgIyBvLmVycm9yIGNhbGxlZAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uYXJncywgKHJlcSwgciwgMjAxLCAiQ3JlYXRlZCIsIHt9KSkKIAorICAgIGRlZiB0ZXN0X2Nvb2tpZXMoc2VsZik6CisgICAgICAgIGNqID0gTW9ja0Nvb2tpZUphcigpCisgICAgICAgIGggPSB1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQorICAgICAgICBuZXdyZXEgPSBoLmh0dHBfcmVxdWVzdChyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjai5hY2hfcmVxIGlzIHJlcSBpcyBuZXdyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcS5nZXRfb3JpZ2luX3JlcV9ob3N0KCksICJleGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcmVxLmlzX3VudmVyaWZpYWJsZSgpKQorICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNqLmVjX3JlcSBpcyByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjai5lY19yIGlzIHIgaXMgbmV3cikKKwogICAgIGRlZiB0ZXN0X3JlZGlyZWN0KHNlbGYpOgogICAgICAgICBmcm9tX3VybCA9ICJodHRwOi8vZXhhbXBsZS5jb20vYS5odG1sIgogICAgICAgICB0b191cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tL2IuaHRtbCIKQEAgLTUyOCw3ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJOb25zZW5zZSIsICJ2aWtpbmc9d2l0aGhvbGQiKQogICAgICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiU3BhbSIsICJzcGFtIikKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZChyZXEsIE1vY2tGaWxlKCksIGNvZGUsICJCbGFoIiwgeyJsb2NhdGlvbiI6IHRvX3VybH0pCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZChyZXEsIE1vY2tGaWxlKCksIGNvZGUsICJCbGFoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiB0b191cmx9KSkKICAgICAgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICMgMzA3IGluIHJlc3BvbnNlIHRvIFBPU1QgcmVxdWlyZXMgdXNlciBPSwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY29kZSA9PSAzMDcgYW5kIGRhdGEgaXMgbm90IE5vbmUpCkBAIC01NDQsMzggKzU3MCw2NSBAQAogCiAgICAgICAgICMgbG9vcCBkZXRlY3Rpb24KICAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCkKLSAgICAgICAgcmVxLm9yaWdpbl9yZXFfaG9zdCA9ICJleGFtcGxlLmNvbSIKLSAgICAgICAgZGVmIHJlZGlyZWN0KGgsIHJlcSwgY29kZSwgdXJsPXRvX3VybCk6Ci0gICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKGgsICJodHRwX2Vycm9yXyVzIiAlIGNvZGUpCi0gICAgICAgICAgICBtZXRob2QocmVxLCBNb2NrRmlsZSgpLCBjb2RlLCAiQmxhaCIsIHsibG9jYXRpb24iOiB1cmx9KQorICAgICAgICBkZWYgcmVkaXJlY3QoaCwgcmVxLCB1cmw9dG9fdXJsKToKKyAgICAgICAgICAgIGguaHR0cF9lcnJvcl8zMDIocmVxLCBNb2NrRmlsZSgpLCAzMDIsICJCbGFoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0hlYWRlcnMoeyJsb2NhdGlvbiI6IHVybH0pKQogICAgICAgICAjIE5vdGUgdGhhdCB0aGUgKm9yaWdpbmFsKiByZXF1ZXN0IHNoYXJlcyB0aGUgc2FtZSByZWNvcmQgb2YKICAgICAgICAgIyByZWRpcmVjdGlvbnMgd2l0aCB0aGUgc3ViLXJlcXVlc3RzIGNhdXNlZCBieSB0aGUgcmVkaXJlY3Rpb25zLgotICAgICAgICAjIG9uY2UKLSAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAzMDIpCi0gICAgICAgICMgdHdpY2U6IGxvb3AgZGV0ZWN0ZWQKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsIHJlZGlyZWN0LCBoLCByZXEsIDMwMikKLSAgICAgICAgIyBhbmQgYWdhaW4KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsIHJlZGlyZWN0LCBoLCByZXEsIDMwMikKLSAgICAgICAgIyBidXQgdGhpcyBpcyBhIGRpZmZlcmVudCByZWRpcmVjdCBjb2RlLCBzbyBPSy4uLgotICAgICAgICByZWRpcmVjdChoLCByZXEsIDMwMSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsIHJlZGlyZWN0LCBoLCByZXEsIDMwMSkKLSAgICAgICAgIyBvcmRlciBkb2Vzbid0IG1hdHRlcgotICAgICAgICByZWRpcmVjdChoLCByZXEsIDMwMykKLSAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAzMDcpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuSFRUUEVycm9yLCByZWRpcmVjdCwgaCwgcmVxLCAzMDMpCiAKLSAgICAgICAgIyBkZXRlY3QgZW5kbGVzcyBub24tcmVwZWF0aW5nIGNoYWluIG9mIHJlZGlyZWN0cwotICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsKQotICAgICAgICByZXEub3JpZ2luX3JlcV9ob3N0ID0gImV4YW1wbGUuY29tIgorICAgICAgICAjIGRldGVjdCBpbmZpbml0ZSBsb29wIHJlZGlyZWN0IG9mIGEgVVJMIHRvIGl0c2VsZgorICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsLCBvcmlnaW5fcmVxX2hvc3Q9ImV4YW1wbGUuY29tIikKICAgICAgICAgY291bnQgPSAwCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAzMDIsICJodHRwOi8vZXhhbXBsZS5jb20vJWQiICUgY291bnQpCisgICAgICAgICAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgorICAgICAgICAgICAgIyBkb24ndCBzdG9wIHVudGlsIG1heF9yZXBlYXRzLCBiZWNhdXNlIGNvb2tpZXMgbWF5IGludHJvZHVjZSBzdGF0ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyLm1heF9yZXBlYXRzKQorCisgICAgICAgICMgZGV0ZWN0IGVuZGxlc3Mgbm9uLXJlcGVhdGluZyBjaGFpbiBvZiByZWRpcmVjdHMKKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCwgb3JpZ2luX3JlcV9ob3N0PSJleGFtcGxlLmNvbSIpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgImh0dHA6Ly9leGFtcGxlLmNvbS8lZCIgJSBjb3VudCkKICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQogICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIubWF4X3JlZGlyZWN0aW9ucykKIAorICAgIGRlZiB0ZXN0X2Nvb2tpZV9yZWRpcmVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgTW9ja0hUVFBIYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLl9jb3VudCA9IDAKKyAgICAgICAgICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbWltZXRvb2xzCisgICAgICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb3VudCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50ICsgMQorICAgICAgICAgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0lPKCJMb2NhdGlvbjogaHR0cDovL3d3dy5jcmFja2VyLmNvbS9cclxuXHJcbiIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCIsIHJlcSwgTW9ja0ZpbGUoKSwgMzAyLCAiRm91bmQiLCBtc2cpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXEgPSByZXEKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8oIlxyXG5cclxuIikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCBtc2csICIiLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisgICAgICAgICMgY29va2llcyBzaG91bGRuJ3QgbGVhayBpbnRvIHJlZGlyZWN0ZWQgcmVxdWVzdHMKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IGJ1aWxkX29wZW5lciwgSFRUUEhhbmRsZXIsIEhUVFBFcnJvciwgXAorICAgICAgICAgICAgIEhUVFBDb29raWVQcm9jZXNzb3IKKworICAgICAgICBmcm9tIHRlc3RfY29va2llbGliIGltcG9ydCBpbnRlcmFjdF9uZXRzY2FwZQorCisgICAgICAgIGNqID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIsICJzcGFtPWVnZ3MiKQorICAgICAgICBoaCA9IE1vY2tIVFRQSGFuZGxlcigpCisgICAgICAgIGNwID0gSFRUUENvb2tpZVByb2Nlc3NvcihjaikKKyAgICAgICAgbyA9IGJ1aWxkX29wZW5lcihoaCwgY3ApCisgICAgICAgIG8ub3BlbigiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IGhoLnJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKwogCiBjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDc3M2NkN2QuLjQ0OGU5NDggMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC0xMDYsNiArMTA2LDcgQEAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdXJscGFyc2UKIGltcG9ydCBiaXNlY3QKK2ltcG9ydCBjb29raWVsaWIKIAogdHJ5OgogICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtMTc2LDcgKzE3Nyw4IEBACiAKIGNsYXNzIFJlcXVlc3Q6CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBkYXRhPU5vbmUsIGhlYWRlcnM9e30pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGRhdGE9Tm9uZSwgaGVhZGVycz17fSwKKyAgICAgICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0PU5vbmUsIHVudmVyaWZpYWJsZT1GYWxzZSk6CiAgICAgICAgICMgdW53cmFwKCc8VVJMOnR5cGU6Ly9ob3N0L3BhdGg+JykgLS0+ICd0eXBlOi8vaG9zdC9wYXRoJwogICAgICAgICBzZWxmLl9fb3JpZ2luYWwgPSB1bndyYXAodXJsKQogICAgICAgICBzZWxmLnR5cGUgPSBOb25lCkBAIC0xODgsNiArMTkwLDEwIEBACiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcihrZXksIHZhbHVlKQogICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzID0ge30KKyAgICAgICAgaWYgb3JpZ2luX3JlcV9ob3N0IGlzIE5vbmU6CisgICAgICAgICAgICBvcmlnaW5fcmVxX2hvc3QgPSBjb29raWVsaWIucmVxdWVzdF9ob3N0KHNlbGYpCisgICAgICAgIHNlbGYub3JpZ2luX3JlcV9ob3N0ID0gb3JpZ2luX3JlcV9ob3N0CisgICAgICAgIHNlbGYudW52ZXJpZmlhYmxlID0gdW52ZXJpZmlhYmxlCiAKICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgICMgWFhYIHRoaXMgaXMgYSBmYWxsYmFjayBtZWNoYW5pc20gdG8gZ3VhcmQgYWdhaW5zdCB0aGVzZQpAQCAtMjQyLDYgKzI0OCwxMiBAQAogICAgICAgICBzZWxmLmhvc3QsIHNlbGYudHlwZSA9IGhvc3QsIHR5cGUKICAgICAgICAgc2VsZi5fX3JfaG9zdCA9IHNlbGYuX19vcmlnaW5hbAogCisgICAgZGVmIGdldF9vcmlnaW5fcmVxX2hvc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9yaWdpbl9yZXFfaG9zdAorCisgICAgZGVmIGlzX3VudmVyaWZpYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW52ZXJpZmlhYmxlCisKICAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgICMgdXNlZnVsIGZvciBzb21ldGhpbmcgbGlrZSBhdXRoZW50aWNhdGlvbgogICAgICAgICBzZWxmLmhlYWRlcnNba2V5LmNhcGl0YWxpemUoKV0gPSB2YWwKQEAgLTI1NCw2ICsyNjYsMTUgQEAKICAgICAgICAgcmV0dXJuIGJvb2woaGVhZGVyX25hbWUgaW4gc2VsZi5oZWFkZXJzIG9yCiAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lIGluIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMpCiAKKyAgICBkZWYgZ2V0X2hlYWRlcihzZWxmLCBoZWFkZXJfbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQoCisgICAgICAgICAgICBoZWFkZXJfbmFtZSwKKyAgICAgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMuZ2V0KGhlYWRlcl9uYW1lLCBkZWZhdWx0KSkKKworICAgIGRlZiBoZWFkZXJfaXRlbXMoc2VsZik6CisgICAgICAgIGhkcnMgPSBzZWxmLnVucmVkaXJlY3RlZF9oZHJzLmNvcHkoKQorICAgICAgICBoZHJzLnVwZGF0ZShzZWxmLmhlYWRlcnMpCisgICAgICAgIHJldHVybiBoZHJzLml0ZW1zKCkKIAogY2xhc3MgT3BlbmVyRGlyZWN0b3I6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtNDYwLDcgKzQ4MSwxMSBAQAogICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBjb2RlLCBtc2csIGhkcnMsIGZwKQogCiBjbGFzcyBIVFRQUmVkaXJlY3RIYW5kbGVyKEJhc2VIYW5kbGVyKToKLSAgICAjIG1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0aW9ucyBiZWZvcmUgYXNzdW1pbmcgd2UncmUgaW4gYSBsb29wCisgICAgIyBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdGlvbnMgdG8gYW55IHNpbmdsZSBVUkwKKyAgICAjIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHN0YXRlIHRoYXQgY29va2llcyBpbnRyb2R1Y2UKKyAgICBtYXhfcmVwZWF0cyA9IDQKKyAgICAjIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIHJlZGlyZWN0aW9ucyAocmVnYXJkbGVzcyBvZiBVUkwpIGJlZm9yZQorICAgICMgYXNzdW1pbmcgd2UncmUgaW4gYSBsb29wCiAgICAgbWF4X3JlZGlyZWN0aW9ucyA9IDEwCiAKICAgICBkZWYgcmVkaXJlY3RfcmVxdWVzdChzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMsIG5ld3VybCk6CkBAIC00ODEsNyArNTA2LDEwIEBACiAgICAgICAgICAgICAjIGZyb20gdGhlIHVzZXIgKG9mIHVybGxpYjIsIGluIHRoaXMgY2FzZSkuICBJbiBwcmFjdGljZSwKICAgICAgICAgICAgICMgZXNzZW50aWFsbHkgYWxsIGNsaWVudHMgZG8gcmVkaXJlY3QgaW4gdGhpcyBjYXNlLCBzbyB3ZQogICAgICAgICAgICAgIyBkbyB0aGUgc2FtZS4KLSAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0KG5ld3VybCwgaGVhZGVycz1yZXEuaGVhZGVycykKKyAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0KG5ld3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9cmVxLmhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5fcmVxX2hvc3Q9cmVxLmdldF9vcmlnaW5fcmVxX2hvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudmVyaWZpYWJsZT1UcnVlKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgY29kZSwgbXNnLCBoZWFkZXJzLCBmcCkKIApAQCAtNDkwLDEwICs1MTgsMTIgQEAKICAgICAjIGhhdmUgYWxyZWFkeSBzZWVuLiAgRG8gdGhpcyBieSBhZGRpbmcgYSBoYW5kbGVyLXNwZWNpZmljCiAgICAgIyBhdHRyaWJ1dGUgdG8gdGhlIFJlcXVlc3Qgb2JqZWN0LgogICAgIGRlZiBodHRwX2Vycm9yXzMwMihzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgorICAgICAgICAjIFNvbWUgc2VydmVycyAoaW5jb3JyZWN0bHkpIHJldHVybiBtdWx0aXBsZSBMb2NhdGlvbiBoZWFkZXJzCisgICAgICAgICMgKHNvIHByb2JhYmx5IHNhbWUgZ29lcyBmb3IgVVJJKS4gIFVzZSBmaXJzdCBoZWFkZXIuCiAgICAgICAgIGlmICdsb2NhdGlvbicgaW4gaGVhZGVyczoKLSAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnNbJ2xvY2F0aW9uJ10KKyAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnMuZ2V0aGVhZGVycygnbG9jYXRpb24nKVswXQogICAgICAgICBlbGlmICd1cmknIGluIGhlYWRlcnM6Ci0gICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzWyd1cmknXQorICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVycy5nZXRoZWFkZXJzKCd1cmknKVswXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIG5ld3VybCA9IHVybHBhcnNlLnVybGpvaW4ocmVxLmdldF9mdWxsX3VybCgpLCBuZXd1cmwpCkBAIC01MDYsMjAgKzUzNiwxNiBAQAogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgIyBsb29wIGRldGVjdGlvbgotICAgICAgICAjIC5yZWRpcmVjdF9kaWN0IGhhcyBhIGtleSAodXJsLCBjb2RlKSBpZiB1cmwgd2FzIHByZXZpb3VzbHkKLSAgICAgICAgIyB2aXNpdGVkIGFzIGEgcmVzdWx0IG9mIGEgcmVkaXJlY3Rpb24gd2l0aCB0aGF0IGNvZGUuICBUaGUKLSAgICAgICAgIyBjb2RlIGlzIG5lZWRlZCBpbiBhZGRpdGlvbiB0byB0aGUgVVJMIGJlY2F1c2UgdmlzaXRpbmcgYSBVUkwKLSAgICAgICAgIyB0d2ljZSBpc24ndCBuZWNlc3NhcmlseSBhIGxvb3A6IHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgd2F5Ci0gICAgICAgICMgdG8gcmVkaXJlY3QgKDMwMSwgMzAyLCAzMDMsIDMwNywgcmVmcmVzaCkuCi0gICAgICAgIGtleSA9IChuZXd1cmwsIGNvZGUpCisgICAgICAgICMgLnJlZGlyZWN0X2RpY3QgaGFzIGEga2V5IHVybCBpZiB1cmwgd2FzIHByZXZpb3VzbHkgdmlzaXRlZC4KICAgICAgICAgaWYgaGFzYXR0cihyZXEsICdyZWRpcmVjdF9kaWN0Jyk6CiAgICAgICAgICAgICB2aXNpdGVkID0gbmV3LnJlZGlyZWN0X2RpY3QgPSByZXEucmVkaXJlY3RfZGljdAotICAgICAgICAgICAgaWYga2V5IGluIHZpc2l0ZWQgb3IgbGVuKHZpc2l0ZWQpID49IHNlbGYubWF4X3JlZGlyZWN0aW9uczoKKyAgICAgICAgICAgIGlmICh2aXNpdGVkLmdldChuZXd1cmwsIDApID49IHNlbGYubWF4X3JlcGVhdHMgb3IKKyAgICAgICAgICAgICAgICBsZW4odmlzaXRlZCkgPj0gc2VsZi5tYXhfcmVkaXJlY3Rpb25zKToKICAgICAgICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZl9tc2cgKyBtc2csIGhlYWRlcnMsIGZwKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdmlzaXRlZCA9IG5ldy5yZWRpcmVjdF9kaWN0ID0gcmVxLnJlZGlyZWN0X2RpY3QgPSB7fQotICAgICAgICB2aXNpdGVkW2tleV0gPSBOb25lCisgICAgICAgIHZpc2l0ZWRbbmV3dXJsXSA9IHZpc2l0ZWQuZ2V0KG5ld3VybCwgMCkgKyAxCiAKICAgICAgICAgIyBEb24ndCBjbG9zZSB0aGUgZnAgdW50aWwgd2UgYXJlIHN1cmUgdGhhdCB3ZSB3b24ndCB1c2UgaXQKICAgICAgICAgIyB3aXRoIEhUVFBFcnJvci4KQEAgLTkxMiw3ICs5MzgsNyBAQAogICAgIGRlZiBzZXRfaHR0cF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKICAgICAgICAgc2VsZi5fZGVidWdsZXZlbCA9IGxldmVsCiAKLSAgICBkZWYgZG9fcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICBkZWYgZG9fcmVxdWVzdF8oc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIGhvc3QgPSByZXF1ZXN0LmdldF9ob3N0KCkKICAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgICByYWlzZSBVUkxFcnJvcignbm8gaG9zdCBnaXZlbicpCkBAIC05ODcsNyArMTAxMyw3IEBACiAgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgogICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKGh0dHBsaWIuSFRUUENvbm5lY3Rpb24sIHJlcSkKIAotICAgIGh0dHBfcmVxdWVzdCA9IEFic3RyYWN0SFRUUEhhbmRsZXIuZG9fcmVxdWVzdAorICAgIGh0dHBfcmVxdWVzdCA9IEFic3RyYWN0SFRUUEhhbmRsZXIuZG9fcmVxdWVzdF8KIAogaWYgaGFzYXR0cihodHRwbGliLCAnSFRUUFMnKToKICAgICBjbGFzcyBIVFRQU0hhbmRsZXIoQWJzdHJhY3RIVFRQSGFuZGxlcik6CkBAIC05OTUsNyArMTAyMSwyNCBAQAogICAgICAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihodHRwbGliLkhUVFBTQ29ubmVjdGlvbiwgcmVxKQogCi0gICAgICAgIGh0dHBzX3JlcXVlc3QgPSBBYnN0cmFjdEhUVFBIYW5kbGVyLmRvX3JlcXVlc3QKKyAgICAgICAgaHR0cHNfcmVxdWVzdCA9IEFic3RyYWN0SFRUUEhhbmRsZXIuZG9fcmVxdWVzdF8KKworY2xhc3MgSFRUUENvb2tpZVByb2Nlc3NvcihCYXNlSGFuZGxlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvb2tpZWphcj1Ob25lKToKKyAgICAgICAgaWYgY29va2llamFyIGlzIE5vbmU6CisgICAgICAgICAgICBjb29raWVqYXIgPSBDb29raWVKYXIoKQorICAgICAgICBzZWxmLmNvb2tpZWphciA9IGNvb2tpZWphcgorCisgICAgZGVmIGh0dHBfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgc2VsZi5jb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxdWVzdCkKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QKKworICAgIGRlZiBodHRwX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlKToKKyAgICAgICAgc2VsZi5jb29raWVqYXIuZXh0cmFjdF9jb29raWVzKHJlc3BvbnNlLCByZXF1ZXN0KQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGh0dHBzX3JlcXVlc3QgPSBodHRwX3JlcXVlc3QKKyAgICBodHRwc19yZXNwb25zZSA9IGh0dHBfcmVzcG9uc2UKIAogY2xhc3MgVW5rbm93bkhhbmRsZXIoQmFzZUhhbmRsZXIpOgogICAgIGRlZiB1bmtub3duX29wZW4oc2VsZiwgcmVxKToKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCAwMzJmNzZlLi40NWExNzJjIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0zMTEsNiArMzExLDEwIEBACiBMaWJyYXJ5CiAtLS0tLS0tCiAKKy0gQWRkZWQgYSBuZXcgbW9kdWxlOiBjb29raWVsaWIuICBBdXRvbWF0aWMgY29va2llIGhhbmRsaW5nIGZvciBIVFRQCisgIGNsaWVudHMuICBBbHNvLCBzdXBwb3J0IGZvciBjb29raWVsaWIgaGFzIGJlZW4gYWRkZWQgdG8gdXJsbGliMiwgc28KKyAgdXJsbGliMi51cmxvcGVuKCkgY2FuIHRyYW5zcGFyZW50bHkgaGFuZGxlIGNvb2tpZXMuCisKIC0gc3RyaW5ncHJlcC5weSBub3cgdXNlcyBidWlsdC1pbiBzZXQoKSBpbnN0ZWFkIG9mIHNldHMuU2V0KCkuCiAKIC0gQnVnICM4NzYyNzg6IFVuYm91bmRlZCByZWN1cnNpb24gaW4gbW9kdWxlZmluZGVyCg==