Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTmFtZSBkZXMgT2JqZWN0czogICAgU2NobHVlc3NlbGJyZXR0Ci8vIExldHp0ZSBBZW5kZXJ1bmc6ICAgIDAyLjA2LjIwMDEKLy8gT3JpZ2luYWw6ICAgICAgICAgICAgU3dpZnQKLy8gTmV1ZSBWZXJzaW9uOiAgICAgICAgU2VsZXZlbgovLyDcYmVybm9tbWVuOiAgICAgICAgICAyMy4wMS4yMDA2Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8qIENoYW5nZWxvZwogICAqIDIxLjA2LjIwMDcsIFplc3N0cmEKICAgICBpbSBpbmhlcml0IGFicy4gUGZhZCBkdXJjaCBMQURFTih4KSBlcnNldHp0LgogICAqIDAxLjA3LjIwMDcsIFplc3N0cmEKICAgICBHZXRPd25lcigpIGRlZmluaWVydC4KICAgKiAxMS4wNS4yMDE1LCBBcmF0aG9ybgogICAgIHdlaXRyYWV1bWlnIHVlYmVyYXJiZWl0ZXQgenVyIEJlaGVidW5nIHZvbiBGZWhsZnVua3Rpb25lbgoqLwojcHJhZ21hIHN0cm9uZ190eXBlcywgcnR0X2NoZWNrcwoKI2luY2x1ZGUgIi9kL3NlaGVyL2hhZXVzZXIvbW9lYmVsL3NjaHJhbmtsYWRlbi5oIgojaW5jbHVkZSA8YW5zaS5oPgppbmhlcml0ICBMQURFTigic3dpZnRfc3RkX2NvbnRhaW5lciIpOwoKI2RlZmluZSBWRVJTSU9OX09CSiAiMyIKLy8gWnVyIEluZGl6aWVydW5nIGRlcyBNYXBwaW5ncyA8aGFrZW4+CiNkZWZpbmUgSE9PS19PQiAgICAwCiNkZWZpbmUgSE9PS19MQUJFTCAxCgpwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIEtleURlc2NyaXB0aW9uKGludCBrZXludW0pOwpwcml2YXRlIGludCBJc1ZhbGlkS2V5KG9iamVjdCBvYik7CnByaXZhdGUgaW50IEdldE5leHRGcmVlU2xvdCgpOwpwcml2YXRlIG9iamVjdCBHZXRLZXlGb3JMYWJlbChzdHJpbmcgbGFiZWwpOwpwcml2YXRlIGludCBHZXRIb29rTnVtYmVyRm9yS2V5KG9iamVjdCBvYik7CnByaXZhdGUgdm9pZCBDb25zb2xpZGF0ZUludmVudG9yeSgpOwoKLy8gU3RydWt0dXI6IChbIGhha2VuX25yIDogb2JqZWt0OyBiZXNjaHJpZnR1bmcgXSkKcHJpdmF0ZSBtYXBwaW5nIGhha2VuPShbOjJdKTsKcHJpdmF0ZSBpbnQgaG9va2xpc3RfbG9uZyA9IDA7Cgpwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CiAgaWYgKCFjbG9uZXAoVE8pKSB7CiAgICBzZXRfbmV4dF9yZXNldCgtMSk7CiAgICByZXR1cm47CiAgfQogIDo6Y3JlYXRlKCk7CiAgCiAgZm9yZWFjaChpbnQgaTogMS4uMTYpIHsKICAgIG1fYWRkKGhha2VuLCBpKTsKICB9CgogIC8vIERFQlVHISBTb25zdCBmdW5rdGlvbmllcnQncyBhdXNzZXJoYWxiIHZvbiBTZWhlcmhhZXVzZXJuIG5pY2h0LgogIFNldFByb3AoInRlc3QiLDEpOwogIFNldFByb3AoUF9TSE9SVCwgIkVpbiBTY2hsdWVzc2VsYnJldHQiKTsKICBTZXQoUF9MT05HLCBmdW5jdGlvbiBzdHJpbmcgKCkgewogICAgc3RyaW5nIHRleHQgPSBCUygKICAgICAgIkVpbiBrbGVpbmVzIEJyZXR0IGF1cyBIb2x6LCBhbiBkZW0gaW4gMiBSZWloZW4gamUgOCBIYWtlbiBiZWZlc3RpZ3QgIgogICAgICAic2luZCwgYW4gZGllIG1hbiBpbnNnZXNhbXQgMTYgU2NobHVlc3NlbCBoYWVuZ2VuIGthbm4uIFVtIGRpZSAiCiAgICAgICJVZWJlcnNpY2h0IG5pY2h0IHp1IHZlcmxpZXJlbiwgYmVmaW5kZXQgc2ljaCB1ZWJlciBqZWRlbSBkZXIgSGFrZW4gIgogICAgICAiZWluIGtsZWluZXMgU2NoaWxkY2hlbiBhdXMgU2NoaWVmZXIsIGRhcyBzaWNoIGJlc2NocmlmdGVuIGxhZXNzdC4gIgogICAgICAiQXVmIGRpZXNlIFdlaXNlIGdlaHQgZGVyIFNpbm4gdW5kIFp3ZWNrIGRlcyBTY2hsdWVzc2VscywgZGVyIGFuICIKICAgICAgImRpZXNlbSBIYWtlbiBydWh0LCBuaWNodCB2ZXJsb3Jlbi4gUHJha3Rpc2NoZXJ3ZWlzZSBoYWVuZ3QgYW4gZWluZXIgIgogICAgICAiU2NobnVyIGVpbiBTdHVlY2sgS3JlaWRlIHZvbiBkZW0gQnJldHQgaGVyYWIsIG1pdCBkZW0gRHUgZGllICIKICAgICAgIlNjaGlsZGNoZW4gYmVzY2hyaWZ0ZW4ga2FubnN0LiIpOwogICAgdGV4dCArPSBLZXlEZXNjcmlwdGlvbigwKTsKICAgIHJldHVybiB0ZXh0OyAKICB9LCBGX1FVRVJZX01FVEhPRCk7CgogIEFkZElkKCh7InNjaGx1ZXNzZWxicmV0dCIsImJyZXR0In0pKTsKICBTZXRQcm9wKCJjbnRfdmVyc2lvbl9vYmoiLCBWRVJTSU9OX09CSik7CiAgU2V0UHJvcChQX0NOVF9TVEFUVVMsIDApOwogIFNldFByb3AoUF9OQU1FLCAiU2NobHVlc3NlbGJyZXR0Iik7CiAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKICBTZXRQcm9wKFBfV0VJR0hULCAxMDAwKTsgICAgICAgICAvLyBHZXdpY2h0IDEgS2cKICBTZXRQcm9wKFBfTUFYX1dFSUdIVCwgMTAwMDAwMCk7ICAvLyBFcyBwYXNzZW4gZnVlciAxMDAwIGtnIFNhY2hlbiByZWluLgogIFNldFByb3AoUF9XRUlHSFRfUEVSQ0VOVCwgMTAwKTsgIC8vIERhZnVlciBtYWNodCBlciBhdWNoIG5peCBsZWljaHRlciA6KQogIFNldFByb3AoUF9NQVhfT0JKRUNUUywgMTYpOwogIC8vIE1hbiBzb2xsIG5pY2h0cyB1ZWJlciBkZW4gbm9ybWFsZW4gTWVjaGFuaXNtdXMgcmVpbnN0ZWNrZW4gb2RlciAKICAvLyByYXVzbmVobWVuIGtvZW5uZW4uIFdpcmQgdm9uIHB1dF9hbmRfZ2V0LmMgZ2VwcnVlZnQuCiAgU2V0UHJvcChQX0NPTlRBSU5FUiwgMCk7CiAgU2V0UHJvcChQX05PSU5TRVJUX01TRywgQlMoIkFuIGRhcyBTY2hsdWVzc2VsYnJldHQga2FubnN0IER1IG51ciAiCiAgICAiU2NobHVlc3NlbCBoYWVuZ2VuLlxuU3ludGF4OiAnaGFlbmdlIDxzY2hsdWVzc2VsPiBhbiBicmV0dCcuIikpOwogIFNldFByb3AoUF9OT0dFVCwgIkRhcyBnZWh0IG5pY2h0LiAiK05hbWUoV0VSLDEpKwogICAgIiBsYWVzc3Qgc2ljaCBuaWNodCBiZXdlZ2VuLlxuIik7CiAgU2V0UHJvcChQX01BVEVSSUFMLCAoe01BVF9PQUssIE1BVF9NSVNDX01BR0lDfSkgKTsKICBTZXRQcm9wKFBfSU5GTywgIlZlcnN1Y2gncyBtYWwgbWl0OiBcInNrb21tYW5kb3Mgc2NobHVlc3NlbGJyZXR0XCIuXG4iKTsKCiAgQUQoKHsiaG9seiJ9KSwgQlMoIkVjaHRlLCByb2J1c3RlIEVpY2hlLiIpKTsKCiAgUmVtb3ZlQ21kKCh7InNjaGxpZXNzZSIsInNjaGxpZXNzIiwib2VmZm5lIn0pKTsKCiAgQWRkQ21kKCh7InVudCIsICJ1bnRlcnN1Y2hlIiwgImJldHJhY2h0ZSIsICJiZXRyYWNodCIsICJiZXRyIiwKICAgICAgICAgICAic2NoYXVlIiwgInNjaGF1In0pLCAidW50X2hha2VuIik7CiAgQWRkQ21kKCh7ImhhZW5nIiwgImhhZW5nZSJ9KSwgInNjaGx1ZXNzZWxfYW5faGFrZW5faGFlbmdlbiIpOwogIEFkZENtZCgoeyJuaW1tIn0pLCAic2NobHVlc3NlbF92b25faGFrZW5fbmVobWVuIik7CiAgQWRkQ21kKCJzYmVzY2hyaWZ0ZSIsICJjbWRfYmVzY2hyaWZ0ZW4iKTsKICBBZGRDbWQoInNsaXN0ZSIsICJjbWRfc2xpc3RlIik7Cn0KCi8qKioqKiBLT01NQU5ET0ZVTktUSU9ORU4gKioqKiovCgovLyBLb25maWd1cmF0aW9uIGRlciBTY2hsdWVzc2VsbGlzdGUsIGVudHdlZGVyICJhbGxlIiBhbnplaWdlbiBvZGVyIG51ciBkaWUKLy8gYmVsZWd0ZW4gSGFrZW4uCnN0YXRpYyBpbnQgY21kX3NsaXN0ZShzdHJpbmcgc3RyKSB7CiAgbm90aWZ5X2ZhaWwoIlN5bnRheDogJ3NsaXN0ZSBhbGxlfGJlbGVndGUnLlxuIik7CiAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCiAgICByZXR1cm4gMDsKCiAgaWYgKCBzdHIgPT0gImFsbGUiICkgewogICAgaWYgKCAhaG9va2xpc3RfbG9uZyApIHsKICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJPaywgZXMgd2VyZGVuIGpldHp0IGltbWVyIGFsbGUgSGFrZW4gIgogICAgICAgICJhdWZnZWxpc3RldC4iKSk7CiAgICAgIGhvb2tsaXN0X2xvbmcgPSAxOwogICAgfQogICAgZWxzZSAKICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEaWUgRWluc3RlbGx1bmcgd2FyIHNjaG9uICdhbGxlJy4iKSk7CiAgfQogIGVsc2UgaWYgKCBzdHIgPT0gImJlbGVndGUiICkgewogICAgaWYgKCBob29rbGlzdF9sb25nICkgewogICAgICB0ZWxsX29iamVjdChUUCwgQlMoIk9rLCBlcyB3ZXJkZW4gamV0enQgbnVyIGRpZSBiZWxlZ3RlbiBIYWtlbiAiCiAgICAgICAgImF1ZmdlbGlzdGV0LiIpKTsKICAgICAgaG9va2xpc3RfbG9uZyA9MDsKICAgIH0KICAgIGVsc2UgCiAgICAgIHRlbGxfb2JqZWN0KFRQLCBCUygiRGllIEVpbnN0ZWxsdW5nIHdhciBzY2hvbiAnYmVsZWd0ZScuIikpOwogIH0KICBlbHNlIAogICAgcmV0dXJuIDA7CiAgcmV0dXJuIDE7Cn0KCi8vIEhha2VuIHVudGVyc3VjaGVuLiBPaG5lIEFuZ2FiZSBkZXIgTnVtbWVyIHdlcmRlbiBhbGxlIGF1c2dlZ2ViZW4sCi8vIGFuc29uc3RlbiBkZXIgZ2V3dWVuc2NodGUsIHNvZmVybiBlcyBkaWVzZW4gZ2lidC4Kc3RhdGljIGludCB1bnRfaGFrZW4oc3RyaW5nIHN0cikgewogIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgc3Ryc3RyKHN0ciwgImhha2VuIikgPT0gLTEgKQogICAgcmV0dXJuIDA7CiAgCiAgaW50IGhha2VubnI7CiAgaWYgKCBzc2NhbmYoc3RyLCAiaGFrZW4gJWQiLCBoYWtlbm5yKSAhPSAxICkgewogICAgc3RyaW5nIGRldCA9IEtleURlc2NyaXB0aW9uKGhha2VubnIpOwogICAgdGVsbF9vYmplY3QoVFAsIHNpemVvZihkZXQpID8gZGV0IDogIkRpZSBIYWtlbiBzaW5kIGFsbGUgbGVlci5cbiIpOwogICAgcmV0dXJuIDE7CiAgfQoKICBub3RpZnlfZmFpbCgiV2VsY2hlbiBIYWtlbiBtb2VjaHRlc3QgRHUgdW50ZXJzdWNoZW4/IEVzIGdpYnQgbnVyIGRpZSAiCiAgICAiSGFrZW4gMSBiaXMgMTYuXG4iKTsKICBpZiggaGFrZW5ucjwxIHx8IGhha2VubnIgPiAxNiApCiAgICByZXR1cm4gMDsKCi8vICBhdXNnYWJlX2hha2VuKGhha2VubnIpOwogIHRlbGxfb2JqZWN0KFRQLCBLZXlEZXNjcmlwdGlvbihoYWtlbm5yKSk7CiAgcmV0dXJuIDE7Cn0KCi8vIFNjaGx1ZXNzZWwgYXVmaGFlbmdlbi4Kc3RhdGljIGludCBzY2hsdWVzc2VsX2FuX2hha2VuX2hhZW5nZW4oc3RyaW5nIHN0cikgewogIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IHdvcmFuIGhhZW5nZW4/XG4iKTsKICBpZighc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKICAgIHJldHVybiAwOwogIAogIG5vdGlmeV9mYWlsKCJEYXMgZGFyZnN0IER1IG5pY2h0LlxuIik7CiAgaWYoIWVybGF1YnQoKSkKICAgIHJldHVybiAwOwoKICBzdHJpbmcgd2FzLCB3b3JhbjsKICBub3RpZnlfZmFpbCgiRm9sZ2VuZGUgU3ludGF4IHZlcnN0ZWh0IERlaW4gU2NobHVlc3NlbGJyZXR0OlxuIgogICAgIiAgXCJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBoYWtlbiBbbnJdXCIgb2RlclxuIgogICAgIiAgXCJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBbc2NobHVlc3NlbF1icmV0dFwiLlxuIik7CiAgaWYgKCBzc2NhbmYoc3RyLCAiJXMgYW4gJXMiLCB3YXMsIHdvcmFuKSAhPSAyICkKICAgIHJldHVybiAwOwoKICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSBhbiBkYXMgU2NobHVlc3NlbGJyZXR0IGhhZW5nZW4/XG4iKTsKICBpZiAoICFzdHJpbmdwKHdhcykgKSAKICAgIHJldHVybiAwOwoKICBub3RpZnlfZmFpbCgiV29yYW4gd2lsbHN0IER1IGRhcyBkZW5uIGhhZW5nZW4/XG4iKTsKICBpZiAoIHN0cnN0cih3b3JhbiwgImhha2VuIiwgMCk9PS0xICYmICFpZCh3b3JhbikgKQogICAgcmV0dXJuIDA7CgogIC8vIFRlc3QsIG9iIGVzIE9iamVrdGUgZGllc2VzIE5hbWVucyBnaWJ0LgogIG9iamVjdCAqb2JzID0gVFAtPmZpbmRfb2JzKHdhcywgUFVUX0dFVF9OT05FKTsKICAvLyBBdXMgZGVyIExpc3RlIGRlciBnZWZ1bmRlbmVuIE9iamVrdGUgYWxsZSByYXVzZmlsdGVybiwgZGllIGtlaW5lCiAgLy8gU2NobHVlc3NlbCBzaW5kLiBBbHMgU2NobHVlc3NlbCBnZWx0ZW4gaGllciBhbGxlIE9iamVrdGUsIGRpZSBkaWUKICAvLyBJRCAic2NobHVlc3NlbCIgaGFiZW4gb2RlciBkaWUgbWl0dGVscyBRdWVyeURvb3JLZXkoKSBlaW5lciBiZXN0aW1tdGVuCiAgLy8gVHVlciB6dWdlb3JkbmV0IHNpbmQuCiAgb2JzID0gZmlsdGVyKG9icywgIydJc1ZhbGlkS2V5KTsKICBub3RpZnlfZmFpbCgiS2VpbmUobikgU2NobHVlc3NlbCBtaXQgZGVtIE5hbWVuIGdlZnVuZGVuLlxuIik7CiAgaWYgKCAhc2l6ZW9mKG9icykgKQogICAgcmV0dXJuIDA7CgogIGludCBuciA9IEdldE5leHRGcmVlU2xvdCgpOwogIG5vdGlmeV9mYWlsKCJBbSBTY2hsdWVzc2VsYnJldHQgaXN0IGtlaW4gSGFrZW4gbWVociBmcmVpLlxuIik7CiAgaWYgKCAhbnIgKQogICAgcmV0dXJuIDA7CgogIC8vIFdlbm4gbnVyIGVpbiBTY2hsdWVzc2VsIGdlZnVuZGVuIHd1cmRlLCB3aXJkIGdlbmF1ZXIgZ2VzY2hhdXQsIG9iCiAgLy8gZGVyIFNwaWVsZXIgZ2VzYWd0IGhhdCwgd28gZGVyIGhpbnNvbGwuCiAgaWYgKCBzaXplb2Yob2JzKSA9PSAxICkgewogICAgaWYgKCB3b3JhbiAhPSAiaGFrZW4iIHx8ICFpZCh3b3JhbikgKQogICAgICBzc2NhbmYod29yYW4sICJoYWtlbiAlZCIsIG5yKTsKICB9CgogIG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG51ciBkaWUgSGFrZW4gMSBiaXMgMTYuXG4iKTsKICBpZiAoIG5yIDwgMSB8fCBuciA+IDE2ICkKICAgIHJldHVybiAwOwoKICBub3RpZnlfZmFpbCgiRGVyIEhha2VuIGlzdCBuaWNodCBtZWhyIGZyZWkuXG4iKTsKICBpZiAoIG9iamVjdHAoaGFrZW5bbnIsSE9PS19PQl0pICkKICAgIHJldHVybiAwOwoKICAvLyBBbGxlIGdlZnVuZGVuZW4gU2NobHVlc3NlbG9iamVrdGUgYW5zIEJyZXR0IGhhZW5nZW4uCiAgZm9yZWFjaCggb2JqZWN0IGtleSA6IG9icyApIHsKICAgIHN3aXRjaCAoa2V5LT5tb3ZlKE1FLCBNX1BVVCkpIHsKICAgICAgLy8gRGllIEthcGF6aXRhZXQgaXN0IHVlYmVyIFBfTUFYX09CSkVDVFMgYmVncmVuenQuIEFsbGUKICAgICAgLy8gU2NobGVpZmVuZHVyY2hsYWV1ZmUsIGRpZSBkaWUgS2FwYXppdGFldHNncmVuemUgZXJyZWljaGVuLCBsYW5kZW4KICAgICAgLy8gaW4gZGVmYXVsdCB1bmQgYmVlbmRlbiBkYW1pdCBkaWUgU2NobGVpZmUuIERhaGVyIG11ZXNzZW4gc2llIAogICAgICAvLyBuaWNodCBnZXNvbmRlcnQgYmVoYW5kZWx0IHdlcmRlbi4KICAgICAgY2FzZSBNT1ZFX09LIDoKICAgICAgICAvLyBGYWxscyBkYXMgQnJldHQgdm9sbCBzZWluIHNvbGx0ZSwgYWJlciBmYWVsc2NobGljaGVyd2Vpc2UgCiAgICAgICAgLy8gZGVubm9jaCBlaW4gd2VpdGVyZXIgU2NobHVlc3NlbCBoaW5laW5iZXdlZ3Qgd3VyZGUsIGlzdCBucj09MCwKICAgICAgICAvLyB1bmQgZXMgd2lyZCBlaW4gRmVobGVyIGF1c2dlbG9lc3QsIGRhbWl0IG5pY2h0IGhpbnRlcmhlciBlaW4KICAgICAgICAvLyBTY2hsdWVzc2VsIGFuIEhha2VuIDAgaGFlbmd0LgogICAgICAgIGlmICggIW5yICkgewogICAgICAgICAgcmFpc2VfZXJyb3IoIkZlaGxlcjogSGFrZW4gMCBkYXJmIG5pY2h0IGJlbGVndCB3ZXJkZW4uIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBoYWVuZ3N0ICIrb2JzWzBdLT5uYW1lKFdFTiwxKSsiIGFuIEhha2VuICIrCiAgICAgICAgICBucisiLiIpKTsKICAgICAgICAvLyBOdXIgd2VubiBlaW4gU2NobHVlc3NlbCBlcmZvbGdyZWljaCBkcmFuZ2VoYWVuZ3Qgd3VyZGUsIHdpcmQgZXIKICAgICAgICAvLyBpbiBkaWUgTGlzdGUgZWluZ2V0cmFnZW4uIEV0d2FpZ2UgQmVzY2hyaWZ0dW5nZW4gYmxlaWJlbiBiZXN0ZWhlbiwKICAgICAgICBoYWtlbltuciwgSE9PS19PQl0gPSBrZXk7CiAgICAgICAgLy8gdW5kIG51ciBkYW5uIHdpcmQgZGVyIG5hZWNoc3RlIFNsb3QgcHJvYmllcnQuIFdlbm4gbnVyIGVpbiAKICAgICAgICAvLyBTY2hsdWVzc2VsIHZlcmFyYmVpdGV0IHdpcmQsIGlzdCBkYXMgaGllciB1bnNjaGFlZGxpY2gsIHdlaWwgZXMgCiAgICAgICAgLy8gbmljaHQgbm9jaG1hbCBhdXNnZXdlcnRldCB3aXJkLgogICAgICAgIG5yID0gR2V0TmV4dEZyZWVTbG90KCk7CiAgICAgICAgLy8gU2NobHVlc3NlbCB3dXJkZSB2ZXJhcmJlaXRldCB1bmQgTWVsZHVuZyBhdXNnZWdlYmVuCiAgICAgICAgb2JzIC09ICh7a2V5fSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTUVfQ0FOVF9MRUFWRV9FTlYgOgogICAgICBjYXNlIE1FX0NBTlRfQkVfSU5TRVJURUQgOgogICAgICBjYXNlIE1FX0NBTlRfQkVfRFJPUFBFRCA6CiAgICAgICAgLy8gU2NobHVlc3NlbCB3dXJkZSBuaWNodCBlcmZvbGdyZWljaCBkcmFuZ2VoYWVuZ3QuCiAgICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKGtleS0+TmFtZShXRVIsMSkrIiB3ZWlnZXJ0IHNpY2gsIGFucyAiCiAgICAgICAgICAiU2NobHVlc3NlbGJyZXR0IGdlaGFlbmd0IHp1IHdlcmRlbi4iKSk7CiAgICAgICAgLy8gTWVsZHVuZyB3dXJkZSBhdXNnZWdlYmVuLCBuaWNodHMgd2VpdGVyIHp1IHR1bi4KICAgICAgICBvYnMgLT0gKHtrZXl9KTsKICAgICAgICBicmVhazsKICAgICAgLy8gVE9PX01BTllfT0JKRUNUUyB3aXJkIG5pY2h0IGhpZXIgYmVoYW5kZWx0LCBzb25kZXJuIHdlaXRlciB1bnRlbiwKICAgICAgLy8gdW0gZWluZSBBdWZsaXN0dW5nIGRlciBTY2hsdWVzc2VsbmFtZW4gYXVzZ2ViZW4genUga29lbm5lbiwgc3RhdHQKICAgICAgLy8gZWluZSBaZWlsZSBwcm8gU2NobHVlc3NlbC4gRGllIGFuZGVyZW4gUnVlY2tnYWJld2VydGUgdm9uIG1vdmUoKSAKICAgICAgLy8gc2luZCBiZWkgZGllc2VyIEFydCBkZXIgQmV3ZWd1bmcgbmljaHQgenUgZXJ3YXJ0ZW4uCiAgICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgfQogIH0KICAvLyBGdWVyIGFsbGUgdWVicmlnZW4gd2FyIHdvaGwgVE9PX01BTllfT0JKRUNUUyBkZXIgUnVlY2tnYWJld2VydCwgZGVubgogIC8vIGRhcyBTY2hsdWVzc2VsYnJldHQgZXJsYXVidCBudXIgUF9NQVhfT0JKRUNUUyA9IDE2LgogIGlmICggc2l6ZW9mKG9icykgKSB7CiAgICB0ZWxsX29iamVjdChUUCwgQlMoIkZ1ZXIgIitDb3VudFVwKG9icy0+bmFtZShXRU4pKSsiIGlzdCBsZWlkZXIga2VpbiAiCiAgICAgICJIYWtlbiBtZWhyIGFtIFNjaGx1ZXNzZWxicmV0dCBmcmVpLiIpKTsKICB9CiAgcmV0dXJuIDE7Cn0KCi8vIFNjaGx1ZXNzZWwgYWJuZWhtZW4Kc3RhdGljIGludCBzY2hsdWVzc2VsX3Zvbl9oYWtlbl9uZWhtZW4oc3RyaW5nIHN0cikgewogIGlmKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApIAogICAgcmV0dXJuIDA7CgogIHN0cmluZyB3YXMsIHdvcmF1czsKICBpZiAoIHNzY2FuZihzdHIsICIlcyBhdXMgJXMiLCB3YXMsIHdvcmF1cykgIT0gMiAmJiAKICAgICAgIHNzY2FuZihzdHIsICIlcyB2b24gJXMiLCB3YXMsIHdvcmF1cykgIT0gMiApCiAgICByZXR1cm4gMDsKCiAgbm90aWZ5X2ZhaWwoIkRhcyBkYXJmc3QgRHUgbmljaHQhXG4iKTsKICBpZighZXJsYXVidCgpKSAKICAgIHJldHVybiAwOwogCiAgbm90aWZ5X2ZhaWwoIldvcmF1cyB3aWxsc3QgRHUgZGFzIGRlbm4gbmVobWVuP1xuIik7CiAgaWYgKCAhaWQod29yYXVzKSAmJiBzdHJzdHIod29yYXVzLCAiaGFrZW4iLCAwKSA9PSAtMSApIAogICAgcmV0dXJuIDA7CgogIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gdm9tIFNjaGx1ZXNzZWxicmV0dCBuZWhtZW4/XG4iKTsKICBpZiggIXN0cmluZ3Aod2FzKSApIAogICAgcmV0dXJuIDA7CiAgCiAgbm90aWZ5X2ZhaWwoIkRhcyBTY2hsdWVzc2VsYnJldHQgaXN0IGRvY2ggYWJlciBsZWVyLlxuIik7CiAgaWYgKCAhc2l6ZW9mKGFsbF9pbnZlbnRvcnkoTUUpKSApCiAgICByZXR1cm4gMDsKCiAgaW50IGhha2VubnI7CiAgb2JqZWN0ICprZXlzID0gKHt9KTsKICAvLyBFcyBtdWVzc2VuIGF1Y2ggU2NobHVlc3NlbCB2b24gYmVzdGltbXRlbiBIYWtlbiBhYmdlbm9tbWVuCiAgLy8gd2VyZGVuIGtvZW5uZW4sIG5pY2h0IG51ciBqZXdlaWxzIGRlciBlcnN0ZSBtaXQgZGVyIGFuZ2VnZWJlbmVuIElELgogIC8vIERpZXMgaGF0IGF1Y2ggUHJpbyBnZWdlbnVlYmVyIGRlciBhbGxnZW1laW5lbiBCZWdyaWZmc3N1Y2hlIG1pdAogIC8vIGZpbmRfb2JzKCkuCiAgaWYgKCBzc2NhbmYod29yYXVzLCAiaGFrZW4gJWQiLCBoYWtlbm5yKSA9PSAxICkgewogICAgbm90aWZ5X2ZhaWwoIkVzIGdpYnQgbnVyIGRpZSBIYWtlbiAxIGJpcyAxNi5cbiIpOwogICAgaWYgKCBoYWtlbm5yIDwgMSB8fCBoYWtlbm5yID4gMTYgKSAKICAgICAgcmV0dXJuIDA7CiAgICBub3RpZnlfZmFpbCgiQW4gZGllc2VtIEhha2VuIGhhZW5ndCBhYmVyIGRvY2gga2VpbiBTY2hsdWVzc2VsLlxuIik7CiAgICBpZiAoICFvYmplY3RwKGhha2VuW2hha2VubnIsSE9PS19PQl0pICkKICAgICAgcmV0dXJuIDA7CiAgICAKICAgIGtleXMgKz0gKHsgaGFrZW5baGFrZW5ucixIT09LX09CXSB9KTsKICB9CgogIC8vIEtlaW5lciBnZWZ1bmRlbj8gVmllbGxlaWNodCBpc3QgamEgZWluZXIgbWl0IGVpbmVyIGJlc3RpbW10ZW4gCiAgLy8gQmVzY2hyaWZ0dW5nIGdlbWVpbnQ/CiAgaWYgKCAhc2l6ZW9mKGtleXMpICkgewogICAgLy8gU2NobHVlc3NlbCBtaXQgZGVtIGFuZ2VnZWJlbmVuIE5hbWVuIHN1Y2hlbgogICAga2V5cyA9IFRQLT5maW5kX29icyh3YXMrIiBpbiBicmV0dCBpbiByYXVtIik7CiAgICAvLyBIYWtlbm51bW1lciBlcm1pdHRlbG4sIHdlbm4gZWluZSBCZXNjaHJpZnR1bmcgYW5nZWdlYmVuIHd1cmRlLgogICAgc3RyaW5nIHdhbnRlZF9kZXNjOwogICAgc3NjYW5mKHdhcywgInNjaGx1ZXNzZWwgZnVlciAlcyIsIHdhbnRlZF9kZXNjKTsKICAgIG9iamVjdCB3YW50ZWRfa2V5ID0gR2V0S2V5Rm9yTGFiZWwod2FudGVkX2Rlc2MpOwogICAgaWYgKCBvYmplY3RwKHdhbnRlZF9rZXkpICkKICAgICAga2V5cyArPSAoe3dhbnRlZF9rZXl9KTsKICB9CiAgLy8gSW1tZXIgbm9jaCBuaXggZ2VmdW5kZW4/IERhbm4gbXVzcyBzaWNoIGRlciBTcGllbGVyIHdhcyBhbmRlcmVzIAogIC8vIGVpbmZhbGxlbiBsYXNzZW4uCiAgbm90aWZ5X2ZhaWwoIkFtIFNjaGx1ZXNzZWxicmV0dCBoYWVuZ3Qga2VpbiBzb2xjaGVyIFNjaGx1ZXNzZWwuXG4iKTsKICBpZiAoICFzaXplb2Yoa2V5cykgKQogICAgcmV0dXJuIDA7CgogIC8vIEFsbGUgZ2VmdW5kZW5lbiBTY2hsdWVzc2VsIHZlcmFyYmVpdGVuLiBBbGxlLCBkaWUgbmljaHQgYmV3ZWd0IHdlcmRlbgogIC8vIGtvZW5uZW4sIHZlcmJsZWliZW4gaW4gZGVyIExpc3RlLgogIGZvcmVhY2goIG9iamVjdCBrZXkgOiBrZXlzICkgewogICAgaW50IGN1cnJlbnRfaG9vayA9IEdldEhvb2tOdW1iZXJGb3JLZXkoa2V5KTsKICAgIGlmICgga2V5LT5tb3ZlKFRQLE1fR0VUKSA9PSBNT1ZFX09LICkgewogICAgICBrZXlzIC09ICh7IGtleSB9KTsKICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBuaW1tc3QgIitrZXktPm5hbWUoV0VOLDEpKyIgdm9uIEhha2VuICIrCiAgICAgICAgY3VycmVudF9ob29rKyIgYWIuIikpOwogICAgICAvLyBTY2hsdWVzc2VsIGF1c3RyYWdlbjsgYmVzdGVoZW5kZSBCZXNjaHJpZnR1bmdlbiBibGVpYmVuIGVyaGFsdGVuCiAgICAgIGhha2VuW2N1cnJlbnRfaG9vaywgSE9PS19PQl0gPSAwOwogICAgfQogIH0KICAvLyBWb24gYWxsZW4gbmljaHQgdm9tIEhha2VuIGdlbm9tbWVuZW4gU2NobHVlc3NlbG4gZGllIE5hbWVuIGVybWl0dGVsbgogIC8vIHVuZCBhdWZsaXN0ZW4uCiAgaWYgKCBzaXplb2Yoa2V5cykgKSB7CiAgICB0ZWxsX29iamVjdChUUCwgQlMoY2FwaXRhbGl6ZShDb3VudFVwKGtleXMtPm5hbWUoV0VSLDEpKSkrIiAiKwogICAgICAoc2l6ZW9mKGtleXMpPT0xPyJrb25udGUiOiJrb25udGVuIikrIiBuaWNodCB2b20gU2NobHVlc3NlbGJyZXR0ICIKICAgICAgImFiZ2Vub21tZW4gd2VyZGVuLiIpKTsKICB9CiAgcmV0dXJuIDE7Cn0KCi8vIFZlcmZ1ZWdiYXJlIEtvbW1hbmRvcyBhdWZsaXN0ZW4uCnZhcmFyZ3MgaW50IHNrb21tYW5kb3Moc3RyaW5nIHN0cikgewogIG5vdGlmeV9mYWlsKCAiRmVobGVyOiBEaWVzZXIgQmVmZWhsIGJlbm9ldGlndCBlaW5lIGd1ZWx0aWdlIE9iamVrdC1JZCBhbHMgIgogICAgKyJQYXJhbWV0ZXIuXG5CZWlzcGllbDogc2tvbW1hbmRvcyBbc2NobHVlc3NlbF1icmV0dFxuIik7CiAgCiAgaWYoICFpZChzdHIpICkgcmV0dXJuIDA7CgogIHdyaXRlKAogICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCiAgICAiPT09PT09PT09PVxuIgogICAgIkFrdHVlbGxlIFZlcnNpb246ICIrUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9zdGQiKSsKICAgICAgUXVlcnlQcm9wKCJjbnRfdmVyc2lvbl9vYmoiKSsiXG4iKwogICAgQlMoTmFtZShXRVIsMSkrIiBrYW5uIG51ciBpbiBkaWVzZW0gU2VoZXJoYXVzIHZlcndlbmRldCB3ZXJkZW4sICIKICAgICJkYSAiK1F1ZXJ5UHJvbm91bihXRVIpKyIgc3BlemllbGwgZGFmdWVyIGdla2F1ZnQgd3VyZGUuICIrCiAgICBDQVAoUXVlcnlQcm9ub3VuKFdFUikpKyIgdmVyZnVlZ3QgdWViZXIgZm9sZ2VuZGUgS29tbWFuZG9zOiIpKwogICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAiLS0tLS0tLVxuIgogICAgInNlcmxhdWJlIFtzY2hsdWVzc2VsXWJyZXR0IFtzcGllbGVybmFtZXxcImhhdXNmcmV1bmRlXCJ8XCJ6d2VpdGllc1wiXVxuIgogICAgIiAgRXJsYXVidCBQZXJzb25lbiwgIituYW1lKFdFTiwxKSsiIG1pdHp1YmVudXR6ZW4uXG4iCiAgICAiICBzZXJsYXViZSBvaG5lIEFuZ2FiZSBlaW5lcyBBcmd1bWVudHMgbGlzdGV0IGFsbGUgUGVyc29uZW4gbWl0IFp1Z3JpZmYgIgogICAgICAiYXVmXG4gICIrbmFtZShXRU4sMSkrIiBhdWYuXG5cbiIKICAgICJ2ZXJzY2hpZWJlIFtzY2hsdWVzc2VsXWJyZXR0IG5hY2ggW2F1c2dhbmddXG4iCiAgICAiICBEYW1pdCBrYW5uc3QgRHUgIituYW1lKFdFTiwxKSsiIGlubmVyaGFsYiBEZWluZXMgU2VoZXJoYXVzZXMgIgogICAgInZlcnNjaGllYmVuLlxuXG4iCiAgICAic3ZlcnN0ZWNrZSBbc2NobHVlc3NlbF1icmV0dFxuIgogICAgIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB1bnNpY2h0YmFyLlxuIgogICAgInNob2xlIFtzY2hsdWVzc2VsXWJyZXR0IGhlcnZvclxuIgogICAgIiAgRGFtaXQgbWFjaHN0IER1ICIrbmFtZShXRU4sMSkrIiB3aWVkZXIgc2ljaHRiYXIuXG4iCiAgICAiemVydHJ1ZW1tZXIgW3NjaGx1ZXNzZWxdYnJldHRcbiIKICAgICIgIERhbWl0IHplcnN0b2Vyc3QgRHUgZGFzIFNjaGx1ZXNzZWxicmV0dC5cbiIKICAgICJzYmVzY2hyaWZ0ZSBoYWtlbiA8bnI+IG1pdCA8dGV4dD58bmljaHRzXG4iCiAgICAiICBFaW5lIEJlc2NocmlmdHVuZyBhbiBlaW5lbSBIYWtlbiBhbmJyaW5nZW4gb2RlciBsb2VzY2hlbi5cbiIKICAgICJzbGlzdGUgbGFuZ3xrdXJ6XG4iCiAgICAiICBTY2hsdWVzc2VsYW56ZWlnZSBrb25maWd1cmllcmVuOiBhbGxlIG9kZXIgbnVyIGJlbGVndGUgYXVmbGlzdGVuLlxuIgogICAgImhhZW5nZSA8c2NobHVlc3NlbG5hbWU+IGFuIGhha2VuIFtucl1cbiIKICAgICJoYWVuZ2UgPHNjaGx1ZXNzZWxuYW1lPiBhbiBbc2NobHVlc3NlbF1icmV0dFxuIgogICAgIiAgRGFtaXQgaGFlbmdzdCBEdSBlaW5lbiBTY2hsdWVzc2VsIGFuIGRhcyBCcmV0dC5cbiIKICAgICJuaW1tIHNjaGx1ZXNzZWwgdm9uIGhha2VuIDxucj5cbiIKICAgICJuaW1tIDxzY2hsdWVzc2VsbmFtZT4gdm9uIFtzY2hsdWVzc2VsXWJyZXR0XG4iCiAgICAibmltbSBzY2hsdWVzc2VsIGZ1ZXIgPGJlc2NocmlmdHVuZz4gdm9uIFtzY2hsdWVzc2VsXWJyZXR0LlxuIgogICAgIiAgRGFtaXQgbmltbXN0IER1IGVpbmVuIFNjaGx1ZXNzZWwgdm9tIFNjaGx1ZXNzZWxicmV0dC5cbiIKICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgIj09PT09PT09PT1cbiIpOwogIHJldHVybiAxOwp9CgpzdGF0aWMgaW50IGVybGF1Ym5pc19saXN0ZSgpCnsKICBpZiggUXVlcnlIYXVzYmVzaXR6ZXIoKSAhPSBRdWVyeVRQKCkgJiYgIVF1ZXJ5UHJvcCgidGVzdCIpICkKICB7CiAgICB0ZWxsX29iamVjdChUUCwgQlMoIk51ciAiK1F1ZXJ5SGF1c2Jlc2l0emVyKCkrIiBkYXJmIEJlcmVjaHRpZ3VuZ2VuICIKICAgICAgK25hbWUoV0VTU0VOLDEpKyIgYWJmcmFnZW4hIikpOwogICAgcmV0dXJuIDE7CiAgfQogIAogIHN0cmluZyAqc3RyczsKICBzdHJpbmcgc3RyID0gCiAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgICI9PT09PT09PT09XG4iOwogIGlmICggaGF1c2VybGF1Ym5pcyApIHsKICAgIHN0cnMgPSBTSFZFUldBTFRFUi0+SGF1c1Byb3AoTE9XRVIoUXVlcnlIYXVzYmVzaXR6ZXIoKSksIDIpOwogICAgc3RyICs9ICJGb2xnZW5kZSBGcmV1bmRlIERlaW5lcyBIYXVzZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKwogICAgICAiIG1pdGJlbnV0emVuOlxuIjsKICAgIGlmKHNpemVvZihzdHJzKSkgewogICAgICBzdHIgKz0gQlMoQ291bnRVcChzdHJzKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyICs9IEJTKCJEdSBoYXN0IGtlaW5lciBQZXJzb24gWnVncmlmZiBhdWYgRGVpbiBIYXVzIGdld2FlaHJ0Li4uIik7CiAgICB9CiAgfQogIGVsc2UgewogICAgc3RyKz0gQlMoIkRpZSBGcmV1bmRlIERlaW5lcyBIYXVzZXMgZHVlcmZlbiAiK25hbWUoV0VOLDEpKwogICAgICAiIG5pY2h0IG1pdGJlbnV0emVuLiIpOwogIH0KCiAgc3RyICs9IAogICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAiLS0tLS0tLS0tLVxuIjsKCiAgaWYoIHp3ZWl0aWVlcmxhdWJuaXMhPSIiICkgewogICAgaWYoIHp3ZWl0aWVlcmxhdWJuaXM9PWdldGV1aWQoVFApICkKICAgICAgc3RyICs9IEJTKCJBbGxlIERlaW5lIFp3ZWl0aWVzIGR1ZXJmZW4gIituYW1lKFdFTiwxKSsiIG1pdGJlbnV0emVuLiIpOwogICAgZWxzZQogICAgICBzdHIgKz0gQlMoIkFsbGUgWndlaXRpZXMgdm9uICIrQ0FQKHp3ZWl0aWVlcmxhdWJuaXMpKyIgZHVlcmZlbiAiCiAgICAgICAgK25hbWUoV0VOLDEpKyIgbWl0YmVudXR6ZW4uIik7CiAgICBzdHIgKz0KICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICItLS0tLS0tLS0tXG4iOwogIH0KICAKICBzdHJzPVF1ZXJ5UHJvcCgiY250X2VybGF1Ym5pcyIpOwoKICBpZihzaXplb2Yoc3RycykpIHsKICAgIHN0ciArPSBCUygiRm9sZ2VuZGUgc29uc3RpZ2UgUGVyc29uZW4gZHVlcmZlbiAiK25hbWUoV0VOLDEpKwogICAgICAiIG1pdGJlbnV0emVuOiIpOwogICAgc3RyICs9IENvdW50VXAoc3Rycyk7CiAgfQogIGVsc2UgewogICAgc3RyICs9IEJTKCJFcyBnaWJ0IGtlaW5lIHNvbnN0aWdlbiBQZXJzb25lbiwgZGllICIrbmFtZShXRU4sMSkrCiAgICAgICIgbWl0YmVudXR6ZW4gZHVlcmZlbi4iKTsKICB9CiAgc3RyICs9CiAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKICAgICI9PT09PT09PT09XG4iOwogIAogIHJldHVybiAxOwp9CgovLyBIYWtlbiBiZXNjaHJpZnRlbi4Kc3RhdGljIGludCBjbWRfYmVzY2hyaWZ0ZW4oc3RyaW5nIHN0cikgewogIHN0cmluZyBuZm0gPSAiU3ludGF4OiBzYmVzY2hyaWZ0ZSBoYWtlbiA8aGFrZW5udW1tZXI+IG1pdCAiCiAgICAiPHRleHQ+fG5pY2h0c1xuIgogICAgIkZ1ZXIgPHRleHQ+IGthbm5zdCBEdSBlaW5lbiBiZWxpZWJpZ2VuIFRleHQgbWl0IGJpcyB6dSAzMCBaZWljaGVuICIKICAgICJhbmdlYmVuLFxuIgogICAgIiduaWNodHMnIGxvZXNjaHQgZGllIEJlc2NocmlmdHVuZyBlaW5lcyBTY2hpbGRlcy5cbiI7CgogIG5vdGlmeV9mYWlsKCJEYXMgZGFyZnN0IER1IG5pY2h0IVxuIik7CiAgaWYoIWVybGF1YnQoKSkgCiAgICByZXR1cm4gMDsKICAKICBzdHJpbmcgdGV4dDsKICBpbnQgaG5yOwogIHN0ciA9IFRQLT5fdW5wYXJzZWRfYXJncygwKTsKICBub3RpZnlfZmFpbChuZm0pOwogIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKSAKICAgIHJldHVybiAwOwogIGlmICggc3NjYW5mKHN0ciwiaGFrZW4gJWQgbWl0ICVzIiwgaG5yLCB0ZXh0KSE9MiApCiAgICByZXR1cm4gMDsKCiAgbm90aWZ5X2ZhaWwoIldlbGNoZW4gSGFrZW4gbW9lY2h0ZXN0IER1IGJlc2NocmlmdGVuP1xuIituZm0pOwogIGlmKCFobnIpIAogICAgcmV0dXJuIDA7CiAgCiAgbm90aWZ5X2ZhaWwoIkVzIGdpYnQgbnVyIGRpZSBIYWtlbiAxIGJpcyAxNi5cbiIpOwogIGlmICggaG5yIDwgMSB8fCBobnIgPiAxNiApIAogICAgcmV0dXJuIDA7CgogIG5vdGlmeV9mYWlsKCJXb21pdCBtb2VjaHRlc3QgRHUgZGVuIEhha2VuIGJlc2NocmlmdGVuP1xuIituZm0pOwogIGlmKCAhc3RyaW5ncCh0ZXh0KSB8fCAhc2l6ZW9mKHRleHQpICkKICAgIHJldHVybiAwOwoKICBub3RpZnlfZmFpbCgiRGVyIFRleHQgc29sbHRlIG5pY2h0IGxhZW5nZXIgYWxzIDMwIFplaWNoZW4gc2Vpbi5cbiIpOwogIGlmKHNpemVvZih0ZXh0KSA+IDMwKSAKICAgIHJldHVybiAwOwoKICBpZiAoIGxvd2VyX2Nhc2UodGV4dCkgPT0gIm5pY2h0cyIgKSB7CiAgICBpZiAoIHN0cmluZ3AoaGFrZW5baG5yLEhPT0tfTEFCRUxdKSApIHsKICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJTb3JnZmFlbHRpZyB3aXNjaHN0IER1IGRpZSBCZXNjaHJpZnR1bmcgZGVzICIKICAgICAgICAiSGFrZW5zICIraG5yKyIgd2VnLiIpKTsKICAgICAgaGFrZW5baG5yLEhPT0tfTEFCRUxdPTA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJEdSBtdXNzdCBEaWNoIGdlaXJydCBoYWJlbi4gSGFrZW4gIitobnIrIiBpc3QgIgogICAgICAgICJnYXIgbmljaHQgYmVzY2hyaWZ0ZXQuIikpOwogICAgfQogIH0KICBlbHNlIGlmICggbG93ZXJfY2FzZSh0ZXh0KSA9PSAic2NobHVlc3NlbCIgKSB7CiAgICB0ZWxsX29iamVjdChUUCwgQlMoCiAgICAgICJEdSBzb2xsdGVzdCBEaXIgZXR3YXMgQXVzc2FnZWtyYWVmdGlnZXJlcyBlaW5mYWxsZW4gbGFzc2VuLiIpKTsKICB9CiAgZWxzZSB7CiAgICB0ZWxsX29iamVjdChUUCwgQlMoIkR1IGJlc2NocmlmdGVzdCBkYXMgU2NoaWxkY2hlbiB1ZWJlciBIYWtlbiAiK2hucisKICAgICAgIiBtaXQgIit0ZXh0KyIuIikpOwogICAgdGVsbF9yb29tKGVudmlyb25tZW50KCksIEJTKAogICAgICBUUC0+TmFtZShXRVIpKyIgc2NocmVpYnQgZXR3YXMgYW5zIFNjaGx1ZXNzZWxicmV0dC4iKSwgKHtUUH0pKTsKICAgIGhha2VuW2hucixIT09LX0xBQkVMXSA9IHRleHQ7CiAgfQogIHJldHVybiAxOwp9CgovKioqKiogSElMRlNGVU5LVElPTkVOICoqKioqLwoKLy8gQmVzY2hyZWlidW5nIGVpbmVzIEhha2VucyBlcnpldWdlbi4gV2VubiA8a2V5bnVtPiBhbmdlZ2ViZW4gd2lyZCwgCi8vIHdpcmQgbnVyIGRlciBnZXN1Y2h0ZSBIYWtlbiBhbmdlemVpZ3QsIGVnYWwgb2IgbGVlciBvZGVyIG5pY2h0LiAKLy8gQW5zb25zdGVuIHdlcmRlbiBkaWUgYmVsZWd0ZW4gSGFrZW4gYW5nZXplaWd0LCBhdXNzZXIgd2VubiAKLy8gPGhvb2tsaXN0X2xvbmc+IGdlc2V0enQgaXN0LiBEYW5uIHdlcmRlbiBhbGxlIEhha2VuIGF1ZmdlbGlzdGV0Lgpwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIEtleURlc2NyaXB0aW9uKGludCBrZXludW0pIHsKICBzdHJpbmcgZGVzYz0iIjsKICBtYXBwaW5nIGtleWxpc3Q9KFs6Ml0pOwoKICAvLyBMaXN0ZSBkZXJIYWtlbiBhdWYgZGVuL2RpZSBnZXN1Y2h0ZW4gZWluc2NocmFlbmtlbi4KICAvLyBOdXIgZWluIEhha2VuIHNvbGwgYW5nZXNjaGF1dCB3ZXJkZW4uIERpZXMgaGF0IGltbWVyIFByaW9yaXRhZXQsCiAgLy8gZC5oLiBhdWNoIGJlaSA8c2xpc3RlIGFsbGU+IHdpcmQgbnVyIGVpbiBIYWtlbiBnZWxpc3RldC4KICBpZiAoIGtleW51bSApIHsKICAgIG1fYWRkKGtleWxpc3QsIGtleW51bSwgbV9lbnRyeShoYWtlbiwga2V5bnVtKS4uLik7CiAgfQogIC8vIFdlbm4gPHNsaXN0ZSBhbGxlPiBnZXNldHp0IGlzdCwgYWxsZSBhdXNnZWJlbi4KICBlbHNlIGlmICggaG9va2xpc3RfbG9uZyApIHsKICAgIGtleWxpc3QgPSBoYWtlbjsKICB9CiAgLy8gQW5zb25zdGVyIG51ciBkaWUgYmVsZWd0ZW4uCiAgZWxzZSB7CiAgICBrZXlsaXN0ID0gZmlsdGVyKGhha2VuLCAKICAgICAgZnVuY3Rpb24gaW50IChpbnQgbnVtLCA8c3RyaW5nfG9iamVjdD4qIHZhbHVlcykgewogICAgICAgIHJldHVybiBvYmplY3RwKHZhbHVlc1swXSk7CiAgICAgIH0pOwogIH0KCiAgLy8gVWViZXIgZGFzIE1hcHBpbmcgbWl0IGRlbiBzZWxla3RpZXJ0ZW4gSGFrZW4gbGF1ZmVuIHVuZCBBdXNnYWJlbgogIC8vIGVyemV1Z2VuLgogIGZvcmVhY2goaW50IG51bSA6IDEuLjE2KSB7CiAgICAvLyBIaWVyIHdpcmQgZGVyIGFrdHVlbGxlIFdlcnQgdWViZXJzcHJ1bmdlbiwgd2VubiBlciBuaWNodCBlbnRoYWx0ZW4gCiAgICAvLyBpc3QsIGRhIGRpZSBadXdlaXN1bmcgaW4gPGtleT4gdW5kIDxrZXlkZXNjPiBhdWNoIGRhbm4gZWluZSAwIGVyZ2ViZW4KICAgIC8vIHd1ZXJkZSwgdW5kIHNvbWl0IEtleXMgbWl0IGxlZXJlbiBWYWx1ZXMgbmljaHQgdm9uIG5pY2h0IGV4aXN0aWVyZW5kZW4KICAgIC8vIEtleXMgenUgdW50ZXJzY2hlaWRlbiB3YWVyZW4uCiAgICBpZiAoIG1lbWJlcihtX2luZGljZXMoa2V5bGlzdCksIG51bSkgPT0gLTEgKQogICAgICBjb250aW51ZTsKICAgIHN0cmluZyBrZXlkZXNjID0ga2V5bGlzdFtudW0sIEhPT0tfTEFCRUxdOwogICAgb2JqZWN0IGtleSA9IGtleWxpc3RbbnVtLCBIT09LX09CXTsKICAgIGRlc2MgKz0gIkhha2VuICIgKyBudW0gKyAoc3RyaW5ncChrZXlkZXNjKT8iIFsiK2tleWRlc2MrIl06ICIgOiAiOiAiKTsKICAgIGRlc2MgKz0gKG9iamVjdHAoa2V5KSA/IGtleS0+c2hvcnQoKSA6ICJsZWVyXG4iKTsKICB9CiAgcmV0dXJuIGRlc2M7Cn0KCi8vIFJ1ZWNrZ2FiZXdlcnQ6IDEsIHdlbm4gZXMgc2ljaCB1bSBlaW4gU2NobHVlc3NlbG9iamVrdCBoYW5kZWx0LCBzb25zdCAwLgovLyBTY2hsdWVzc2VsIHdlcmRlbiBhbmhhbmQgZGVyIElEICJzY2hsdWVzc2VsIiBlcmthbm50IG9kZXIgZGFyYW4sIGRhc3MKLy8gUXVlcnlEb29yS2V5KCkgZWluZW4gV2VydCB6dXJ1ZWNrZ2lidCwgZC5oLiBkYXNzIGRpZXNlcyBPYmpla3QgZWluZQovLyBTdGFuZGFyZC1Eb29ybWFzdGVyLVR1ZXIgb2VmZm5ldC4KcHJpdmF0ZSBpbnQgSXNWYWxpZEtleShvYmplY3Qgb2IpIHsKICByZXR1cm4gKG9iamVjdHAob2IpICYmIChvYi0+aWQoInNjaGx1ZXNzZWwiKSB8fCBvYi0+UXVlcnlEb29yS2V5KCkhPTApKTsKfQoKLy8gR2lidCBkaWUgTnVtbWVyIGRlcyBuYWVjaHN0ZW4gZnJlaWVuIEhha2VucyB6dXJ1ZWNrIG9kZXIgMCwgd2VubgovLyBrZWluZXIgZnJlaSBpc3QuIERhIE1hcHBpbmdzIG5pY2h0IHNvcnRpZXJ0IHNpbmQsIG11c3Mgdm9uIDEtMTYgbnVtZXJpc2NoCi8vIGl0ZXJpZXJ0IHdlcmRlbiwgZGFtaXQgaW1tZXIgZGVyIGVyc3RlIGZyZWllIEhha2VuIGdlZnVuZGVuIHdpcmQgdW5kIG5pY2h0IAovLyBpcmdlbmRlaW5lci4KLy8gUnVlY2tnYWJld2VydDogSGFrZW5udW1tZXIgdm9uIDEtMTYgb2RlciAwLCB3ZW5uIGtlaW4gSGFrZW4gZnJlaSBpc3QuCnByaXZhdGUgaW50IEdldE5leHRGcmVlU2xvdCgpIHsKICBpbnQgc2xvdDsKICBmb3JlYWNoKGludCBpIDogMS4uMTYpIHsKICAgIGlmICggIW9iamVjdHAoaGFrZW5baSxIT09LX09CXSkgKSB7CiAgICAgIHNsb3QgPSBpOwogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3Q7Cn0KCi8vIEdpYnQgenUgZWluZXIgU2NoaWxkLUJlc2NocmlmdHVuZyBkaWUgenVnZWhvZXJpZ2UgSGFrZW5wb3NpdGlvbiBhdXMuCi8vIEVzIHdpcmQgZGllIGtsZWluZ2VzY2hyaWViZW5lIFZhcmlhbnRlIGdlc3VjaHQsIHNvIGRhc3MgU3BpZWxlciB6d2FyCi8vIEdyb3Nzc2NocmVpYnVuZyBpbiBkZW4gQmVzY2hyaWZ0dW5nZW4gdmVyd2VuZGVuIGtvZW5uZW4sIGRpZXNlIGFiZXIKLy8gbmljaHQgYmVydWVja3NpY2h0aWd0IHdpcmQuIEFuc29uc3RlbiBrb2VubnRlIGVzIHp1IFNjaHdpZXJpZ2tlaXRlbiBtaXQKLy8gRG9wcGx1bmdlbiB3aWUgIlZlc3JheSIgdW5kICJ2ZXNyYXkiIGtvbW1lbi4KLy8gUnVlY2tnYWJld2VydDogSGFrZW5udW1tZXIgdm9uIDEtMTYgb2RlciAwLCB3ZW5uIGRlciBUZXh0IG5pY2h0IGdlZnVuZGVuCi8vIHd1cmRlLgpwcml2YXRlIG9iamVjdCBHZXRLZXlGb3JMYWJlbChzdHJpbmcgbGFiZWwpIHsKICBpZiAoIGxhYmVsICkgCiAgICBsYWJlbCA9IGxvd2VyX2Nhc2UobGFiZWwpOwogIGZvcmVhY2goaW50IGk6IDEuLjE2KSB7CiAgICBpZiAoIGhha2VuW2ksIEhPT0tfTEFCRUxdICYmIGxhYmVsICYmCiAgICAgICAgIGxvd2VyX2Nhc2UoaGFrZW5baSxIT09LX0xBQkVMXSkgPT0gbGFiZWwgKQogICAgICByZXR1cm4gaGFrZW5baSxIT09LX09CXTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8vIEdpYnQgenUgZGVtIHVlYmVyZ2ViZW5lbiBPYmpla3QgZGllIE51bW1lciBkZXMgSGFrZW5zIHp1cnVlY2ssIGFuIGRlbQovLyBlcyBoYWVuZ3QuCnByaXZhdGUgaW50IEdldEhvb2tOdW1iZXJGb3JLZXkob2JqZWN0IG9iKSB7CiAgZm9yZWFjaChpbnQgbnVtLCBvYmplY3Qga2V5IDogaGFrZW4pIHsKICAgIGlmICgga2V5ID09IG9iICkKICAgICAgcmV0dXJuIG51bTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8vIEJlcmVpbmlndCBEYXRlbnN0cnVrdHVyIGluIDxoYWtlbj4gdW5kIGRhcyBJbnZlbnRhciBkZXMgQnJldHRlcywgaW5kZW0KLy8gYSkgZ2VwcnVlZnQgd2lyZCwgb2IgYWxsZSBpbiA8aGFrZW4+IGVpbmdldHJhZ2VuZW4gT2JqZWt0ZSBzaWNoIGF1Y2ggaW0gCi8vICAgIEJyZXR0IGJlZmluZGVuIHVuZAovLyBiKSBnZXBydWVmdCB3aXJkLCBvYiBhbGxlIGltIEludmVudGFyIGJlZmluZGxpY2hlbiBPYmpla3RlIGF1Y2gga29ycmVrdCBpbiAKLy8gICAgPGhha2VuPiBlaW5nZXRyYWdlbiBzaW5kLgovLyBVZWJlcnphZWhsaWdlIE9iamVrdGUgd2VyZGVuIHJhdXNnZXdvcmZlbi4KcHJpdmF0ZSB2b2lkIENvbnNvbGlkYXRlSW52ZW50b3J5KCkgewogIGZvcmVhY2goaW50IGksIG9iamVjdCBvYiA6IGhha2VuKSB7CiAgICAvLyBPYmpla3QgZXhpc3RpZXJ0LCBpc3QgYWJlciBuaWNodCBpbSBTY2hsdWVzc2VsYnJldHQ/IERhbm4gYXVzdHJhZ2VuLgogICAgaWYgKG9iamVjdHAob2IpICYmIGVudmlyb25tZW50KG9iKSAhPSBNRSkgewogICAgICBtX2RlbGV0ZShoYWtlbiwgaSk7CiAgICAgIC8vIFdpcmQgYXVjaCB2b20gcmVzZXQoKSBhdXMgZ2VydWZlbiwgZGFubiBpc3QgVFAgPT0gMC4KICAgICAgaWYgKCBvYmplY3RwKFRQKSApCiAgICAgICAgdGVsbF9vYmplY3QoVFAsIEJTKCJIb3BwbGEhICIrb2ItPk5hbWUoV0VSLDEpKyIgc2NoZWludCB2b20gIgogICAgICAgICAgIlNjaGx1ZXNzZWxicmV0dCB2ZXJzY2h3dW5kZW4genUgc2VpbiEiKSk7CiAgICB9CiAgfQogIG9iamVjdCAqcmVzdGVyYW1wZSA9IGFsbF9pbnZlbnRvcnkoTUUpIC0gbV92YWx1ZXMoaGFrZW4sIEhPT0tfT0IpOwogIGlmIChzaXplb2YocmVzdGVyYW1wZSkpIHsKICAgIHJlc3RlcmFtcGUtPm1vdmUoZW52aXJvbm1lbnQoKSxNX1BVVCk7CiAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgQlMoIlBsb2V0emxpY2ggZmFlbGx0IGV0d2FzIHZvbSAiCiAgICAgICJTY2hsdWVzc2VsYnJldHQgenUgQm9kZW4sIGRhcyBEdSB6dXZvciBnYXIgbmljaHQgZ2VzZWhlbiBoYXR0ZXN0LiIpKTsKICB9Cn0KCnN0cmluZyBzaG9ydCgpIHsKICBzdHJpbmcgc2g9UXVlcnlQcm9wKFBfU0hPUlQpOwoKICAvLyBVbnNpY2h0YmFyPyBEYW5uIGdpYnRzIG5pY2h0cyB6dSBzZWhlbiAuLi4KICBpZiAoIFF1ZXJ5UHJvcChQX0lOVklTKSB8fCAhc2ggKQogICAgcmV0dXJuIDA7CiAgaWYgKCBRdWVyeVByb3AoInZlcnN0ZWNrdCIpID09IDEgKSAKICAgIHNoID0gIiI7CiAgZWxzZSAKICAgIHNoICs9ICIuIjsKCiAgcmV0dXJuIHByb2Nlc3Nfc3RyaW5nKHNoKSsiXG4iOwp9CgovLyBJbSBSZXNldCB2b3JzaWNodHNoYWxiZXIgYXVjaCBtYWwgYXVmcmFldW1lbi4Kdm9pZCByZXNldCgpIHsKICBDb25zb2xpZGF0ZUludmVudG9yeSgpOwogIHJldHVybiA6OnJlc2V0KCk7Cn0KCnZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IG9iKSB7CiAgLy8gS2VpbiBTY2hsdWVzc2VsPyBIYXQgaW4gZGllc2VtIENvbnRhaW5lciBuaXggdmVybG9yZW4hCiAgaWYoICFJc1ZhbGlkS2V5KG9iICkpIHsKICAgIHJldHVybiAxOwogIH0KICBDb25zb2xpZGF0ZUludmVudG9yeSgpOwogIHJldHVybiA6OlByZXZlbnRJbnNlcnQob2IpOwp9CgovLyBXZW5uIGVpbiBTY2hsdWVzc2VsIHNpY2ggYXVmbG9lc3QsIG11c3MgZGllIExpc3RlIGFiZ2VnbGljaGVuIHdlcmRlbi4Kdm9pZCBOb3RpZnlSZW1vdmUob2JqZWN0IG9iKSB7CiAgdGVsbF9yb29tKGVudmlyb25tZW50KE1FKSwgQlMoIkhvcHBsYSEgIitvYi0+TmFtZShXRVIsMSkrIiBoYXQgc2ljaCAiCiAgICAiZ2VyYWRlIGluIFdvaGxnZWZhbGxlbiBhdWZnZWxvZXN0LiIpKTsKICAvLyBEYXMgT2JqZWt0IDxvYj4gemVyc3RvZXJ0IHNpY2ggZXJzdCBuYWNoIGRlbSBBdWZydWYgZGllc2VyIEZ1bmt0aW9uLAogIC8vIGRhaGVyIHBlciBjYWxsX291dCgpIGF1ZnJhZXVtZW4uCiAgY2FsbF9vdXQoIydDb25zb2xpZGF0ZUludmVudG9yeSwgMSk7Cn0KCi8vIFplc3N0cmEsIDEuNy4wNywgZnVlcnMgSG9lcnJvaHIKLy8gRGFyZiBpY2ggZGEgQXJhdGhvcm4gZWludHJhZ2VuPyA7LSkKc3RyaW5nIEdldE93bmVyKCkgewogIHJldHVybiAic2VsZXZlbiI7Cn0KCg==