IyByZWdyZXNzaW9uIHRlc3QgZm9yIFNBWCAyLjAgICAgICAgICAgICAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojICRJZCQKCmZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyLCBDb250ZW50SGFuZGxlciwgXAogICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgp0cnk6CiAgICBtYWtlX3BhcnNlcigpCmV4Y2VwdCBTQVhSZWFkZXJOb3RBdmFpbGFibGU6CiAgICAjIGRvbid0IHRyeSB0byB0ZXN0IHRoaXMgbW9kdWxlIGlmIHdlIGNhbm5vdCBjcmVhdGUgYSBwYXJzZXIKICAgIHJhaXNlIEltcG9ydEVycm9yKCJubyBYTUwgcGFyc2VycyBhdmFpbGFibGUiKQpmcm9tIHhtbGNvcmUuc2F4LnNheHV0aWxzIGltcG9ydCBYTUxHZW5lcmF0b3IsIGVzY2FwZSwgdW5lc2NhcGUsIHF1b3RlYXR0ciwgXAogICAgIFhNTEZpbHRlckJhc2UKZnJvbSB4bWxjb3JlLnNheC5leHBhdHJlYWRlciBpbXBvcnQgY3JlYXRlX3BhcnNlcgpmcm9tIHhtbGNvcmUuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCmZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RGYWlsZWQsIGZpbmRmaWxlCmltcG9ydCBvcwoKIyA9PT09PSBVdGlsaXRpZXMKCnRlc3RzID0gMApmYWlsdXJlcyA9IFtdCgpkZWYgY29uZmlybShvdXRjb21lLCBuYW1lKToKICAgIGdsb2JhbCB0ZXN0cwoKICAgIHRlc3RzID0gdGVzdHMgKyAxCiAgICBpZiBvdXRjb21lOgogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIHByaW50ICJQYXNzZWQiLCBuYW1lCiAgICBlbHNlOgogICAgICAgIGZhaWx1cmVzLmFwcGVuZChuYW1lKQoKZGVmIHRlc3RfbWFrZV9wYXJzZXIyKCk6CiAgICB0cnk6CiAgICAgICAgIyBDcmVhdGluZyBwYXJzZXJzIHNldmVyYWwgdGltZXMgaW4gYSByb3cgc2hvdWxkIHN1Y2NlZWQuCiAgICAgICAgIyBUZXN0aW5nIHRoaXMgYmVjYXVzZSB0aGVyZSBoYXZlIGJlZW4gZmFpbHVyZXMgb2YgdGhpcyBraW5kCiAgICAgICAgIyBiZWZvcmUuCiAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQogICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQogICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICBleGNlcHQ6CiAgICAgICAgcmV0dXJuIDAKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHAKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgICBzYXh1dGlscyB0ZXN0cwojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojID09PT09IGVzY2FwZQoKZGVmIHRlc3RfZXNjYXBlX2Jhc2ljKCk6CiAgICByZXR1cm4gZXNjYXBlKCJEb25hbGQgRHVjayAmIENvIikgPT0gIkRvbmFsZCBEdWNrICZhbXA7IENvIgoKZGVmIHRlc3RfZXNjYXBlX2FsbCgpOgogICAgcmV0dXJuIGVzY2FwZSgiPERvbmFsZCBEdWNrICYgQ28+IikgPT0gIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiCgpkZWYgdGVzdF9lc2NhcGVfZXh0cmEoKToKICAgIHJldHVybiBlc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSkgPT0gIkhlaSBwJmFyaW5nOyBkZWciCgojID09PT09IHVuZXNjYXBlCgpkZWYgdGVzdF91bmVzY2FwZV9iYXNpYygpOgogICAgcmV0dXJuIHVuZXNjYXBlKCJEb25hbGQgRHVjayAmYW1wOyBDbyIpID09ICJEb25hbGQgRHVjayAmIENvIgoKZGVmIHRlc3RfdW5lc2NhcGVfYWxsKCk6CiAgICByZXR1cm4gdW5lc2NhcGUoIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiKSA9PSAiPERvbmFsZCBEdWNrICYgQ28+IgoKZGVmIHRlc3RfdW5lc2NhcGVfZXh0cmEoKToKICAgIHJldHVybiB1bmVzY2FwZSgiSGVpIHDlIGRlZyIsIHsi5SIgOiAiJmFyaW5nOyJ9KSA9PSAiSGVpIHAmYXJpbmc7IGRlZyIKCmRlZiB0ZXN0X3VuZXNjYXBlX2FtcF9leHRyYSgpOgogICAgcmV0dXJuIHVuZXNjYXBlKCImYW1wO2ZvbzsiLCB7IiZmb287IjogInNwbGF0In0pID09ICImZm9vOyIKCiMgPT09PT0gcXVvdGVhdHRyCgpkZWYgdGVzdF9xdW90ZWF0dHJfYmFzaWMoKToKICAgIHJldHVybiBxdW90ZWF0dHIoIkRvbmFsZCBEdWNrICYgQ28iKSA9PSAnIkRvbmFsZCBEdWNrICZhbXA7IENvIicKCmRlZiB0ZXN0X3NpbmdsZV9xdW90ZWF0dHIoKToKICAgIHJldHVybiAocXVvdGVhdHRyKCdJbmNsdWRlcyAiZG91YmxlIiBxdW90ZXMnKQogICAgICAgICAgICA9PSAnXCdJbmNsdWRlcyAiZG91YmxlIiBxdW90ZXNcJycpCgpkZWYgdGVzdF9kb3VibGVfcXVvdGVhdHRyKCk6CiAgICByZXR1cm4gKHF1b3RlYXR0cigiSW5jbHVkZXMgJ3NpbmdsZScgcXVvdGVzIikKICAgICAgICAgICAgPT0gIlwiSW5jbHVkZXMgJ3NpbmdsZScgcXVvdGVzXCIiKQoKZGVmIHRlc3Rfc2luZ2xlX2RvdWJsZV9xdW90ZWF0dHIoKToKICAgIHJldHVybiAocXVvdGVhdHRyKCJJbmNsdWRlcyAnc2luZ2xlJyBhbmQgXCJkb3VibGVcIiBxdW90ZXMiKQogICAgICAgICAgICA9PSAiXCJJbmNsdWRlcyAnc2luZ2xlJyBhbmQgJnF1b3Q7ZG91YmxlJnF1b3Q7IHF1b3Rlc1wiIikKCiMgPT09PT0gbWFrZV9wYXJzZXIKCmRlZiB0ZXN0X21ha2VfcGFyc2VyKCk6CiAgICB0cnk6CiAgICAgICAgIyBDcmVhdGluZyBhIHBhcnNlciBzaG91bGQgc3VjY2VlZCAtIGl0IHNob3VsZCBmYWxsIGJhY2sKICAgICAgICAjIHRvIHRoZSBleHBhdHJlYWRlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcihbJ3htbGNvcmUucGFyc2Vycy5ub19zdWNoX3BhcnNlciddKQogICAgZXhjZXB0OgogICAgICAgIHJldHVybiAwCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwCgoKIyA9PT09PSBYTUxHZW5lcmF0b3IKCnN0YXJ0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz5cbicKCmRlZiB0ZXN0X3htbGdlbl9iYXNpYygpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgIGdlbi5zdGFydERvY3VtZW50KCkKICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQogICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICBnZW4uZW5kRG9jdW1lbnQoKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPjwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9jb250ZW50KCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQoKICAgIGdlbi5zdGFydERvY3VtZW50KCkKICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQogICAgZ2VuLmNoYXJhY3RlcnMoImh1aGVpIikKICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz5odWhlaTwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9waSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4ucHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ0ZXN0IiwgImRhdGEiKQogICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCiAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKICAgIGdlbi5lbmREb2N1bWVudCgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9jb250ZW50X2VzY2FwZSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgIGdlbi5jaGFyYWN0ZXJzKCI8aHVoZWkmIikKICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz4mbHQ7aHVoZWkmYW1wOzwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9hdHRyX2VzY2FwZSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7ImEiOiAnIid9KQogICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICInIn0pCiAgICBnZW4uZW5kRWxlbWVudCgiZSIpCiAgICBnZW4uc3RhcnRFbGVtZW50KCJlIiwgeyJhIjogIidcIiJ9KQogICAgZ2VuLmVuZEVsZW1lbnQoImUiKQogICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICBnZW4uZW5kRG9jdW1lbnQoKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCBcCiAgICAgICAgICAgKyAiPGRvYyBhPSdcIic+PGUgYT1cIidcIj48L2U+PGUgYT1cIicmcXVvdDtcIj48L2U+PC9kb2M+IgoKZGVmIHRlc3RfeG1sZ2VuX2lnbm9yYWJsZSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgIGdlbi5pZ25vcmFibGVXaGl0ZXNwYWNlKCIgIikKICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz4gPC9kb2M+IgoKbnNfdXJpID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy94bWwtbnMvc2F4dGVzdC8iCgpkZWYgdGVzdF94bWxnZW5fbnMoKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQogICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygibnMxIiwgbnNfdXJpKQogICAgZ2VuLnN0YXJ0RWxlbWVudE5TKChuc191cmksICJkb2MiKSwgIm5zMTpkb2MiLCB7fSkKICAgICMgYWRkIGFuIHVucXVhbGlmaWVkIG5hbWUKICAgIGdlbi5zdGFydEVsZW1lbnROUygoTm9uZSwgInVkb2MiKSwgTm9uZSwge30pCiAgICBnZW4uZW5kRWxlbWVudE5TKChOb25lLCAidWRvYyIpLCBOb25lKQogICAgZ2VuLmVuZEVsZW1lbnROUygobnNfdXJpLCAiZG9jIiksICJuczE6ZG9jIikKICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKCJuczEiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyBcCiAgICAgICAgICAgKCc8bnMxOmRvYyB4bWxuczpuczE9IiVzIj48dWRvYz48L3Vkb2M+PC9uczE6ZG9jPicgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zX3VyaSkKCiMgPT09PT0gWE1MRmlsdGVyQmFzZQoKZGVmIHRlc3RfZmlsdGVyX2Jhc2ljKCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgZmlsdGVyID0gWE1MRmlsdGVyQmFzZSgpCiAgICBmaWx0ZXIuc2V0Q29udGVudEhhbmRsZXIoZ2VuKQoKICAgIGZpbHRlci5zdGFydERvY3VtZW50KCkKICAgIGZpbHRlci5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQogICAgZmlsdGVyLmNoYXJhY3RlcnMoImNvbnRlbnQiKQogICAgZmlsdGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQogICAgZmlsdGVyLmVuZEVsZW1lbnQoImRvYyIpCiAgICBmaWx0ZXIuZW5kRG9jdW1lbnQoKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPmNvbnRlbnQgPC9kb2M+IgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojICAgZXhwYXRyZWFkZXIgdGVzdHMKIwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyA9PT09PSBYTUxSZWFkZXIgc3VwcG9ydAoKZGVmIHRlc3RfZXhwYXRfZmlsZSgpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQoKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICBwYXJzZXIucGFyc2Uob3BlbihmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHhtbF90ZXN0X291dAoKIyA9PT09PSBEVERIYW5kbGVyIHN1cHBvcnQKCmNsYXNzIFRlc3REVERIYW5kbGVyOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9ub3RhdGlvbnMgPSBbXQogICAgICAgIHNlbGYuX2VudGl0aWVzICA9IFtdCgogICAgZGVmIG5vdGF0aW9uRGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgogICAgICAgIHNlbGYuX25vdGF0aW9ucy5hcHBlbmQoKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCgogICAgZGVmIHVucGFyc2VkRW50aXR5RGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKToKICAgICAgICBzZWxmLl9lbnRpdGllcy5hcHBlbmQoKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmRhdGEpKQoKZGVmIHRlc3RfZXhwYXRfZHRkaGFuZGxlcigpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBoYW5kbGVyID0gVGVzdERUREhhbmRsZXIoKQogICAgcGFyc2VyLnNldERUREhhbmRsZXIoaGFuZGxlcikKCiAgICBwYXJzZXIuZmVlZCgnPCFET0NUWVBFIGRvYyBbXG4nKQogICAgcGFyc2VyLmZlZWQoJyAgPCFFTlRJVFkgaW1nIFNZU1RFTSAiZXhwYXQuZ2lmIiBOREFUQSBHSUY+XG4nKQogICAgcGFyc2VyLmZlZWQoJyAgPCFOT1RBVElPTiBHSUYgUFVCTElDICItLy9Db21wdVNlcnZlLy9OT1RBVElPTiBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQgODlhLy9FTiI+XG4nKQogICAgcGFyc2VyLmZlZWQoJ10+XG4nKQogICAgcGFyc2VyLmZlZWQoJzxkb2M+PC9kb2M+JykKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIGhhbmRsZXIuX25vdGF0aW9ucyA9PSBbKCJHSUYiLCAiLS8vQ29tcHVTZXJ2ZS8vTk9UQVRJT04gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IDg5YS8vRU4iLCBOb25lKV0gYW5kIFwKICAgICAgICAgICBoYW5kbGVyLl9lbnRpdGllcyA9PSBbKCJpbWciLCBOb25lLCAiZXhwYXQuZ2lmIiwgIkdJRiIpXQoKIyA9PT09PSBFbnRpdHlSZXNvbHZlciBzdXBwb3J0CgpjbGFzcyBUZXN0RW50aXR5UmVzb2x2ZXI6CgogICAgZGVmIHJlc29sdmVFbnRpdHkoc2VsZiwgcHVibGljSWQsIHN5c3RlbUlkKToKICAgICAgICBpbnBzcmMgPSBJbnB1dFNvdXJjZSgpCiAgICAgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oIjxlbnRpdHkvPiIpKQogICAgICAgIHJldHVybiBpbnBzcmMKCmRlZiB0ZXN0X2V4cGF0X2VudGl0eXJlc29sdmVyKCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihUZXN0RW50aXR5UmVzb2x2ZXIoKSkKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihYTUxHZW5lcmF0b3IocmVzdWx0KSkKCiAgICBwYXJzZXIuZmVlZCgnPCFET0NUWVBFIGRvYyBbXG4nKQogICAgcGFyc2VyLmZlZWQoJyAgPCFFTlRJVFkgdGVzdCBTWVNURU0gIndoYXRldmVyIj5cbicpCiAgICBwYXJzZXIuZmVlZCgnXT5cbicpCiAgICBwYXJzZXIuZmVlZCgnPGRvYz4mdGVzdDs8L2RvYz4nKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz48ZW50aXR5PjwvZW50aXR5PjwvZG9jPiIKCiMgPT09PT0gQXR0cmlidXRlcyBzdXBwb3J0CgpjbGFzcyBBdHRyR2F0aGVyZXIoQ29udGVudEhhbmRsZXIpOgoKICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgogICAgICAgIHNlbGYuX2F0dHJzID0gYXR0cnMKCiAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUsIGF0dHJzKToKICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCgpkZWYgdGVzdF9leHBhdF9hdHRyc19lbXB0eSgpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBnYXRoZXIgPSBBdHRyR2F0aGVyZXIoKQogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGdhdGhlcikKCiAgICBwYXJzZXIuZmVlZCgiPGRvYy8+IikKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9hdHRycyhnYXRoZXIuX2F0dHJzKQoKZGVmIHRlc3RfZXhwYXRfYXR0cnNfd2F0dHIoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgZ2F0aGVyID0gQXR0ckdhdGhlcmVyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCgogICAgcGFyc2VyLmZlZWQoIjxkb2MgYXR0cj0ndmFsJy8+IikKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIHZlcmlmeV9hdHRyc193YXR0cihnYXRoZXIuX2F0dHJzKQoKZGVmIHRlc3RfZXhwYXRfbnNhdHRyc19lbXB0eSgpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQogICAgZ2F0aGVyID0gQXR0ckdhdGhlcmVyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCgogICAgcGFyc2VyLmZlZWQoIjxkb2MvPiIpCiAgICBwYXJzZXIuY2xvc2UoKQoKICAgIHJldHVybiB2ZXJpZnlfZW1wdHlfbnNhdHRycyhnYXRoZXIuX2F0dHJzKQoKZGVmIHRlc3RfZXhwYXRfbnNhdHRyc193YXR0cigpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQogICAgZ2F0aGVyID0gQXR0ckdhdGhlcmVyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCgogICAgcGFyc2VyLmZlZWQoIjxkb2MgeG1sbnM6bnM9JyVzJyBuczphdHRyPSd2YWwnLz4iICUgbnNfdXJpKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICBhdHRycyA9IGdhdGhlci5fYXR0cnMKCiAgICByZXR1cm4gYXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldE5hbWVzKCkgPT0gWyhuc191cmksICJhdHRyIildIGFuZCBcCiAgICAgICAgICAgKGF0dHJzLmdldFFOYW1lcygpID09IFtdIG9yIGF0dHJzLmdldFFOYW1lcygpID09IFsibnM6YXR0ciJdKSBhbmQgXAogICAgICAgICAgIGxlbihhdHRycykgPT0gMSBhbmQgXAogICAgICAgICAgIGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkgYW5kIFwKICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gWyhuc191cmksICJhdHRyIildIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0KChuc191cmksICJhdHRyIikpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLml0ZW1zKCkgPT0gWygobnNfdXJpLCAiYXR0ciIpLCAidmFsIildIGFuZCBcCiAgICAgICAgICAgYXR0cnMudmFsdWVzKCkgPT0gWyJ2YWwiXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFZhbHVlKChuc191cmksICJhdHRyIikpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0gPT0gInZhbCIKCiMgPT09PT0gSW5wdXRTb3VyY2Ugc3VwcG9ydAoKeG1sX3Rlc3Rfb3V0ID0gb3BlbihmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiK29zLmV4dHNlcCsib3V0IikpLnJlYWQoKQoKZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX2ZpbGVuYW1lKCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgIHBhcnNlci5wYXJzZShmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0geG1sX3Rlc3Rfb3V0CgpkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3lzaWQoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgcGFyc2VyLnBhcnNlKElucHV0U291cmNlKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIpKSkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0geG1sX3Rlc3Rfb3V0CgpkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3RyZWFtKCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgIGlucHNyYyA9IElucHV0U291cmNlKCkKICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKG9wZW4oZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQogICAgcGFyc2VyLnBhcnNlKGlucHNyYykKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0geG1sX3Rlc3Rfb3V0CgojID09PT09IEluY3JlbWVudGFsUGFyc2VyIHN1cHBvcnQKCmRlZiB0ZXN0X2V4cGF0X2luY3JlbWVudGFsKCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQoKICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCiAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+PC9kb2M+IgoKZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWxfcmVzZXQoKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCgogICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKICAgIHBhcnNlci5mZWVkKCJ0ZXh0IikKCiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgIHBhcnNlci5yZXNldCgpCgogICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKICAgIHBhcnNlci5mZWVkKCJ0ZXh0IikKICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz50ZXh0PC9kb2M+IgoKIyA9PT09PSBMb2NhdG9yIHN1cHBvcnQKCmRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfbm9pbmZvKCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQoKICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCiAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIHBhcnNlci5nZXRTeXN0ZW1JZCgpIGlzIE5vbmUgYW5kIFwKICAgICAgICAgICBwYXJzZXIuZ2V0UHVibGljSWQoKSBpcyBOb25lIGFuZCBcCiAgICAgICAgICAgcGFyc2VyLmdldExpbmVOdW1iZXIoKSA9PSAxCgpkZWYgdGVzdF9leHBhdF9sb2NhdG9yX3dpdGhpbmZvKCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgcGFyc2VyLnBhcnNlKGZpbmRmaWxlKCJ0ZXN0LnhtbCIpKQoKICAgIHJldHVybiBwYXJzZXIuZ2V0U3lzdGVtSWQoKSA9PSBmaW5kZmlsZSgidGVzdC54bWwiKSBhbmQgXAogICAgICAgICAgIHBhcnNlci5nZXRQdWJsaWNJZCgpIGlzIE5vbmUKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgICBlcnJvciByZXBvcnRpbmcKIwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX2xvY2F0aW9uKCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcigpKSAjIGRvIG5vdGhpbmcKICAgIHNvdXJjZSA9IElucHV0U291cmNlKCkKICAgIHNvdXJjZS5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKCI8Zm9vIGJhciBmb29iYXI+IikpICAgI2lsbC1mb3JtZWQKICAgIG5hbWUgPSAiYSBmaWxlIG5hbWUiCiAgICBzb3VyY2Uuc2V0U3lzdGVtSWQobmFtZSkKICAgIHRyeToKICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlKQogICAgZXhjZXB0IFNBWEV4Y2VwdGlvbiwgZToKICAgICAgICByZXR1cm4gZS5nZXRTeXN0ZW1JZCgpID09IG5hbWUKCmRlZiB0ZXN0X2V4cGF0X2luY29tcGxldGUoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyKCkpICMgZG8gbm90aGluZwogICAgdHJ5OgogICAgICAgIHBhcnNlci5wYXJzZShTdHJpbmdJTygiPGZvbz4iKSkKICAgIGV4Y2VwdCBTQVhQYXJzZUV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gMSAjIG9rLCBlcnJvciBmb3VuZAogICAgZWxzZToKICAgICAgICByZXR1cm4gMAoKZGVmIHRlc3Rfc2F4X3BhcnNlX2V4Y2VwdGlvbl9zdHIoKToKICAgICMgcGFzcyB2YXJpb3VzIHZhbHVlcyBmcm9tIGEgbG9jYXRvciB0byB0aGUgU0FYUGFyc2VFeGNlcHRpb24gdG8KICAgICMgbWFrZSBzdXJlIHRoYXQgdGhlIF9fc3RyX18oKSBkb2Vzbid0IGZhbGwgYXBhcnQgd2hlbiBOb25lIGlzCiAgICAjIHBhc3NlZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIgbGluZSBhbmQgY29sdW1uIG51bWJlcgogICAgIwogICAgIyB1c2UgIm5vcm1hbCIgdmFsdWVzIGZvciB0aGUgbG9jYXRvcjoKICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKDEsIDEpKSkKICAgICMgdXNlIE5vbmUgZm9yIHRoZSBsaW5lIG51bWJlcjoKICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKE5vbmUsIDEpKSkKICAgICMgdXNlIE5vbmUgZm9yIHRoZSBjb2x1bW4gbnVtYmVyOgogICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1teUxvY2F0b3IoMSwgTm9uZSkpKQogICAgIyB1c2UgTm9uZSBmb3IgYm90aDoKICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKE5vbmUsIE5vbmUpKSkKICAgIHJldHVybiAxCgpjbGFzcyBEdW1teUxvY2F0b3I6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZW5vLCBjb2xubyk6CiAgICAgICAgc2VsZi5fbGluZW5vID0gbGluZW5vCiAgICAgICAgc2VsZi5fY29sbm8gPSBjb2xubwoKICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKICAgICAgICByZXR1cm4gInB1YmlkIgoKICAgIGRlZiBnZXRTeXN0ZW1JZChzZWxmKToKICAgICAgICByZXR1cm4gInN5c2lkIgoKICAgIGRlZiBnZXRMaW5lTnVtYmVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9saW5lbm8KCiAgICBkZWYgZ2V0Q29sdW1uTnVtYmVyKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9jb2xubwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojICAgeG1scmVhZGVyIHRlc3RzCiMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgPT09PT0gQXR0cmlidXRlc0ltcGwKCmRlZiB2ZXJpZnlfZW1wdHlfYXR0cnMoYXR0cnMpOgogICAgdHJ5OgogICAgICAgIGF0dHJzLmdldFZhbHVlKCJhdHRyIikKICAgICAgICBndmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3ZrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoImF0dHIiKQogICAgICAgIGd2cWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3ZxayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKQogICAgICAgIGducWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ25xayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKQogICAgICAgIGdxbmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3FuayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnNbImF0dHIiXQogICAgICAgIGdpayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBnaWsgPSAxCgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDAgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBsZW4oYXR0cnMpID09IDAgYW5kIFwKICAgICAgICAgICBub3QgYXR0cnMuaGFzX2tleSgiYXR0ciIpIGFuZCBcCiAgICAgICAgICAgYXR0cnMua2V5cygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRycyIpIGlzIE5vbmUgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoImF0dHJzIiwgMjUpID09IDI1IGFuZCBcCiAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbXSBhbmQgXAogICAgICAgICAgIGF0dHJzLnZhbHVlcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgZ3ZrIGFuZCBndnFrIGFuZCBnbnFrIGFuZCBnaWsgYW5kIGdxbmsKCmRlZiB2ZXJpZnlfYXR0cnNfd2F0dHIoYXR0cnMpOgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFsiYXR0ciJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gWyJhdHRyIl0gYW5kIFwKICAgICAgICAgICBsZW4oYXR0cnMpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5oYXNfa2V5KCJhdHRyIikgYW5kIFwKICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gWyJhdHRyIl0gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoImF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldCgiYXR0ciIsIDI1KSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLml0ZW1zKCkgPT0gWygiYXR0ciIsICJ2YWwiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoImF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgiYXR0ciIpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKSA9PSAiYXR0ciIgYW5kIFwKICAgICAgICAgICBhdHRyc1siYXR0ciJdID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKSA9PSAiYXR0ciIKCmRlZiB0ZXN0X2F0dHJzX2VtcHR5KCk6CiAgICByZXR1cm4gdmVyaWZ5X2VtcHR5X2F0dHJzKEF0dHJpYnV0ZXNJbXBsKHt9KSkKCmRlZiB0ZXN0X2F0dHJzX3dhdHRyKCk6CiAgICByZXR1cm4gdmVyaWZ5X2F0dHJzX3dhdHRyKEF0dHJpYnV0ZXNJbXBsKHsiYXR0ciIgOiAidmFsIn0pKQoKIyA9PT09PSBBdHRyaWJ1dGVzSW1wbAoKZGVmIHZlcmlmeV9lbXB0eV9uc2F0dHJzKGF0dHJzKToKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRWYWx1ZSgobnNfdXJpLCAiYXR0ciIpKQogICAgICAgIGd2ayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBndmsgPSAxCgogICAgdHJ5OgogICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpCiAgICAgICAgZ3ZxayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBndnFrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXROYW1lQnlRTmFtZSgibnM6YXR0ciIpCiAgICAgICAgZ25xayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBnbnFrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKQogICAgICAgIGdxbmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3FuayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0KICAgICAgICBnaWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ2lrID0gMQoKICAgIHJldHVybiBhdHRycy5nZXRMZW5ndGgoKSA9PSAwIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0TmFtZXMoKSA9PSBbXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAwIGFuZCBcCiAgICAgICAgICAgbm90IGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkgYW5kIFwKICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgaXMgTm9uZSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSkgPT0gMjUgYW5kIFwKICAgICAgICAgICBhdHRycy5pdGVtcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMudmFsdWVzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBndmsgYW5kIGd2cWsgYW5kIGducWsgYW5kIGdpayBhbmQgZ3FuawoKZGVmIHRlc3RfbnNhdHRyc19lbXB0eSgpOgogICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9uc2F0dHJzKEF0dHJpYnV0ZXNOU0ltcGwoe30sIHt9KSkKCmRlZiB0ZXN0X25zYXR0cnNfd2F0dHIoKToKICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh7KG5zX3VyaSwgImF0dHIiKSA6ICJ2YWwifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KG5zX3VyaSwgImF0dHIiKSA6ICJuczphdHRyIn0pCgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFsobnNfdXJpLCAiYXR0ciIpXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFsibnM6YXR0ciJdIGFuZCBcCiAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaGFzX2tleSgobnNfdXJpLCAiYXR0ciIpKSBhbmQgXAogICAgICAgICAgIGF0dHJzLmtleXMoKSA9PSBbKG5zX3VyaSwgImF0dHIiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSwgMjUpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbKChuc191cmksICJhdHRyIiksICJ2YWwiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoIm5zOmF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldE5hbWVCeVFOYW1lKCJuczphdHRyIikgPT0gKG5zX3VyaSwgImF0dHIiKSBhbmQgXAogICAgICAgICAgIGF0dHJzWyhuc191cmksICJhdHRyIildID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gIm5zOmF0dHIiCgoKIyA9PT09PSBNYWluIHByb2dyYW0KCmRlZiBtYWtlX3Rlc3Rfb3V0cHV0KCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgIHBhcnNlci5wYXJzZShmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkKCiAgICBvdXRmID0gb3BlbihmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiK29zLmV4dHNlcCsib3V0IiksICJ3IikKICAgIG91dGYud3JpdGUocmVzdWx0LmdldHZhbHVlKCkpCiAgICBvdXRmLmNsb3NlKCkKCml0ZW1zID0gbG9jYWxzKCkuaXRlbXMoKQppdGVtcy5zb3J0KCkKZm9yIChuYW1lLCB2YWx1ZSkgaW4gaXRlbXM6CiAgICBpZiBuYW1lWyA6IDVdID09ICJ0ZXN0XyI6CiAgICAgICAgY29uZmlybSh2YWx1ZSgpLCBuYW1lKQojIFdlIGRlbGV0ZSB0aGUgaXRlbXMgdmFyaWFibGUgc28gdGhhdCB0aGUgYXNzaWdubWVudCB0byBpdGVtcyBhYm92ZQojIGRvZXNuJ3QgcGljayB1cCB0aGUgb2xkIHZhbHVlIG9mIGl0ZW1zICh3aGljaCBtZXNzZXMgd2l0aCBhdHRlbXB0cwojIHRvIGZpbmQgcmVmZXJlbmNlIGxlYWtzKS4KZGVsIGl0ZW1zCgppZiB2ZXJib3NlOgogICAgcHJpbnQgIiVkIHRlc3RzLCAlZCBmYWlsdXJlcyIgJSAodGVzdHMsIGxlbihmYWlsdXJlcykpCmlmIGZhaWx1cmVzOgogICAgcmFpc2UgVGVzdEZhaWxlZCgiJWQgb2YgJWQgdGVzdHMgZmFpbGVkOiAlcyIKICAgICAgICAgICAgICAgICAgICAgJSAobGVuKGZhaWx1cmVzKSwgdGVzdHMsICIsICIuam9pbihmYWlsdXJlcykpKQo=