IyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMuCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLAojIE1BIDAyMTEwLTEzMDEsIFVTQS4KCiMgQ2hlY2sgdGhhdCBzY3JpcHRzIHVzaW5nIHRoZSAiPSIgc3lzcm9vdC1wcmVmaXggd29yaywgZm9yIGJvdGgKIyB0b29sY2hhaW5zIHdpdGggYW5kIHdpdGhvdXQgLS1zeXNyb290IHN1cHBvcnQuCgojIFdlIHRlc3QgdGhpcyBieSBlbWl0dGluZyBhcmNoaXZlcyBpbnRvIGEgc3ViZGlyZWN0b3J5IGFuZCBleHBlY3QKIyBjb25zdHJ1Y3RzIHN1Y2ggYXMgR1JPVVAgYW5kIEFTX05FRURFRCAodGhlIG9ubHkgdHdvIGNvbnN0cnVjdHMKIyBhY3R1YWxseSB0ZXN0ZWQpIHRvIGZpbmQgdGhlbSAob3Igbm90KTsgYm90aCBxdW90ZWQgYW5kIHVucXVvdGVkCiMgcGF0aHMsIHdpdGggZGlmZmVyZW50IHByZWZpeGVzIG9uIHRoZSBwYXRoIGFuZCB3aXRoIC0tc3lzcm9vdAojIHByZXNlbnQgb3Igbm90LCB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMuCgojIEZpbmQgb3V0IGlmIHRoZSBsaW5rZXIgc3VwcG9ydHMgc3lzcm9vdDsgaWYgaXQgd2FzIGNvbmZpZ3VyZWQKIyAiLS13aXRoLXN5c3Jvb3QgWCIgd2hlcmUgWCBpcyBhIG5vbi1lbXB0eSBzdHJpbmcuCnNldCB3aXRoX3N5c3Jvb3QgW2NoZWNrX3N5c3Jvb3RfYXZhaWxhYmxlXQp2ZXJib3NlIC1sb2cgIkhhcyAobm9uLWVtcHR5KSBzeXNyb290IHN1cHBvcnQ6ICR3aXRoX3N5c3Jvb3Q7IFwiJGxkX3N5c3Jvb3RcIiIKCiMgV2UgYWxzbyBuZWVkIHRvIGtub3cgaWYgdGhlIHN5c3Jvb3QgaXMgIi8iIChhIGNvbW1vbiB1c2UpIGFzIHNvbWUgb2YKIyB0aGUgdGVzdHMgcHJlcGVuZCBzeXNyb290IHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgb24gbW9zdAojIGNvbW1vbiBzeXN0ZW1zICIvL2Rpci9wYXRoIiBpcyBoYW5kbGVkIGFzICIvZGlyL3BhdGgiLgppZiB7JGxkX3N5c3Jvb3QgPT0gIi8ifSB7CiAgICAjIFVzZSBhIG1vZGlmaWVkIHRlc3Qtc3Vic2V0IGZvciB0ZXN0aW5nLgogICAgc2V0IHdpdGhfc3lzcm9vdCAzCn0KCiMgRW50cmllcyBpbiB0aGUgYXJyYXktdGFibGVzOgojIDA6IFRlc3R0eXBlOyBhbiBpbmNsdXNpdmUgYml0bWFzayBpbmRpY2F0aW5nIHRoYXQgdGhlIHRlc3Qgc2hvdWxkIHJ1biBvbiBhCiMgYnVpbGQgY29uZmlndXJlZCBmb3I6IDE6IG5vbi1zeXNyb290LCAyOiBzeXNyb290ICE9ICIvIiwgNDogc3lzcm9vdCA9PSAiLyIuCiMgMTogRGVzY3JpcHRpb24sIGZvcm1pbmcgcGFydCBvZiB0aGUgZGVqYWdudSB0ZXN0LW5hbWUuCiMgMjogUmVwbGFjZW1lbnQgZm9yIEBwQC4KIyAzOiBPcHRpb24gdG8gcGFzcyB0byBsaW5rZXIgKHVzdWFsbHkgc29tZXRoaW5nIHdpdGggLS1zeXNyb290KS4KIyA0OiBNZXNzYWdlIHN1YnN0cmluZzsgYSBzdWJzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgZXJyb3IgbWVzc2FnZQojIGlmIGFuIGVycm9yIGlzIGV4cGVjdGVkLCBvciBlbXB0eSBpZiBubyBlcnJvciBpcyBleHBlY3RlZC4KIwojIElmIHRoZSByZXBsYWNlbWVudCBvciBvcHRpb24gY29udGFpbnMgQGN3ZEAsIHRoYXQnbGwgYmUgcmVwbGFjZWQgYnkKIyAiJGJhc2VfZGlyL3RtcGRpciIsIHRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQKIyAod2l0aCB0aGUgYWN0dWFsIGZpbGVzIGluIHRoZSAic3lzcm9vdCIgc3ViZGlyZWN0b3J5KS4gIElmIHRoZQojIGRlc2NyaXB0aW9uIGNvbnRhaW5zIEBjd2RALCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgIjxDV0Q+Ii4KCnNldCBzeXNyb290X3ByZWZpeF90ZXN0cyB7CiAgICB7NyAicGxhaW4gLUxwYXRoIiAic3lzcm9vdC8iIHt9ICIifQogICAgezcgInJvb3QtYW5jaG9yZWQgYnV0IC1McGF0aCIgIi9zeXNyb290LyIge30gImNhbm5vdCBmaW5kIn0KICAgIHs3ICJmdWxsLXBhdGgiICJAY3dkQC9zeXNyb290LyIge30gIiJ9CiAgICB7NyAicm9vdC1hbmNob3JlZCA9LXByZWZpeGVkIC1McGF0aCIgIj0vc3lzcm9vdC8iIHt9ICJjYW5ub3QgZmluZCJ9CiAgICB7NyAiZnVsbC1wYXRoID0tcHJlZml4ZWQgd2l0aCBlbXB0eSIgIj1AY3dkQC9zeXNyb290LyIgIi0tc3lzcm9vdD0iICIifQogICAgezcgInBsYWluID0tcHJlZml4ZWQgd2l0aCBlbXB0eSIgIj1zeXNyb290LyIgIi0tc3lzcm9vdD0iICIifQogICAgezYgInJvb3QtYW5jaG9yZWQgYnV0IHNjcmlwdCBvdXRzaWRlIHN5c3Jvb3QiICIvIiAiLS1zeXNyb290PUBjd2RAL3N5c3Jvb3QiICJjYW5ub3QgZmluZCJ9CiAgICB7NiAicm9vdC1hbmNob3JlZCBhbmQgc2NyaXB0IGluc2lkZSBzeXNyb290IiAiL3N5c3Jvb3QvIiAiLS1zeXNyb290PUBjd2RAIiAiIn0KICAgIHs2ICJyb290LWFuY2hvcmVkID0tcHJlZml4ZWQgc2NyaXB0IG91dHNpZGUiICI9LyIgIi0tc3lzcm9vdD1AY3dkQC9zeXNyb290IiAiIn0KICAgIHs2ICJyb290LWFuY2hvcmVkID0tcHJlZml4ZWQgc2NyaXB0IGluc2lkZSIgIj0vc3lzcm9vdC8iICItLXN5c3Jvb3Q9QGN3ZEAiICIifQogICAgezIgInBsYWluID0tcHJlZml4ZWQgd2l0aG91dCBidXQgLUxwYXRoIiAiPXN5c3Jvb3QvIiB7fSAiY2Fubm90IGZpbmQifQogICAgezIgImZ1bGwtcGF0aCA9LXByZWZpeGVkIHdpdGhvdXQiICI9QGN3ZEAvc3lzcm9vdC8iIHt9ICJjYW5ub3QgZmluZCJ9CiAgICB7MSAicGxhaW4gPS1wcmVmaXhlZCAtTHBhdGgiICI9c3lzcm9vdC8iIHt9ICIifQogICAgezEgImZ1bGwtcGF0aCA9LXByZWZpeGVkIHdpdGhvdXQiICI9QGN3ZEAvc3lzcm9vdC8iIHt9ICIifQp9CgojIE1heSBoYXZlIHRvIHByb3ZpZGUgYSB0YXJnZXQtc3BlY2lmaWMgYXNzZW1ibGVyIG9wdGlvbiBmb3Igc29tZSB0YXJnZXRzLgpzZXQgZ2Fzb3B0ICIiCgojIEludGVudGlvbmFsbHkgc2ltaWxhciB0byB0aGUgdWJpcXVpdG91cyBnbGliYyBsaWJjLnNvIHNjcmlwdC4Kc2V0IHRlbXBsYXRlICJHUk9VUCAoIEBxQEBwQHRtcC9sZHRlc3QteHl6enkvbGlieC5hQHFAIEFTX05FRURFRCAoIEBxQEBwQHRtcC9sZHRlc3QteHl6enkvbGlieS5hQHFAICkgKSIKCiMgU2V0IHVwIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgdmFyaWFibGVzIGFib3ZlLgpwcm9jIHN5c3Jvb3RfcHJlZml4X3Rlc3Rfc2V0dXAgeyB9IHsKICAgIGdsb2JhbCBhcyBnYXNvcHQgc3JjZGlyIHN1YmRpciBhcgoKICAgIGlmIHshW2xkX2Fzc2VtYmxlX2ZsYWdzICRhcyAkZ2Fzb3B0ICRzcmNkaXIvJHN1YmRpci9wcjE0OTYyYS5zIHRtcGRpci9tYWluLm9dfSB7CgllcnJvciAiRXJyb3IgYXNzZW1ibGluZyBhIHRyaXZpYWwgZmlsZSBmb3Igc3lzcm9vdC1wcmVmaXggdGVzdHOgZnJhbWV3b3JrIgoJcmV0dXJuIDAKICAgIH0KCiAgICAjIFdlIG5lZWQgc29tZXdoZXJlIHVuZGVyIHRtcGRpciB0byBwb2ludCB0aGUgc3lzcm9vdCwgYSBzdWJkaXJlY3RvcnkKICAgICMgdGhhdCBpcyBiZW5ldm9sZW50IGlmIGl0IGVzY2FwZXMgaW50byAiLyIuCiAgICByZW1vdGVfZXhlYyBob3N0ICJta2RpciAtcCB0bXBkaXIvc3lzcm9vdC90bXAvbGR0ZXN0LXh5enp5IgoKICAgICMgMDogYSAibWFpbiIgb2JqZWN0IHRoYXQgbmVlZHMgYSBzeW1ib2wgKHgpIChtb3N0IHBvcnRhYmx5IGJ5CiAgICAjIHVzaW5nIGEgcHJlLWV4aXN0aW5nIGZpbGUpLiAgMTogYSBsaWJyYXJ5IHdpdGggYW4gb2JqZWN0IHRoYXQKICAgICMgcHJvdmlkZXMgdGhhdCBzeW1ib2wgYW5kIG5lZWRzIGFub3RoZXIgb25lICh5KS4gIDI6IGFub3RoZXIKICAgICMgbGlicmFyeSB3aXRoIGEgdGhpcmQgb2JqZWN0IHByb3ZpZGluZyB0aGF0IG90aGVyIHN5bWJvbC4KICAgIHNldCBzeXNyb290X3ByZWZpeF90ZXN0c19mcmFtZXdvcmtfb2JqZWN0cyAgewoJeyJwcjE0OTYyYS5zIiAibWFpbiIgIiJ9Cgl7InN5c3Jvb3QtcHJlZml4LXgucyIgIngiICJ4In0KCXsic3lzcm9vdC1wcmVmaXgteS5zIiAieSIgICJ5In0KICAgIH0KCiAgICBmb3JlYWNoIHRlc3Rfb2JqZWN0ICRzeXNyb290X3ByZWZpeF90ZXN0c19mcmFtZXdvcmtfb2JqZWN0cyB7CglzZXQgc25hbWUgW2xpbmRleCAkdGVzdF9vYmplY3QgMF0KCXNldCBvbmFtZWJhc2UgW2xpbmRleCAkdGVzdF9vYmplY3QgMV0KCXNldCBvbmFtZSAidG1wZGlyLyRvbmFtZWJhc2UubyIKCXNldCBsaWJuYW1lYmFzZSBbbGluZGV4ICR0ZXN0X29iamVjdCAyXQoKCWlmICFbbGRfYXNzZW1ibGVfZmxhZ3MgJGFzICRnYXNvcHQgJHNyY2Rpci8kc3ViZGlyLyRzbmFtZSAkb25hbWVdIHsKCSAgICBlcnJvciAiRXJyb3IgYXNzZW1ibGluZyB0cml2aWFsIGZpbGUgJHNuYW1lIGZvciBzeXNyb290LXByZWZpeCB0ZXN0c6BmcmFtZXdvcmsiCgkgICAgcmV0dXJuIDAKCX0KCglpZiB7IFtzdHJpbmcgbGVuZ3RoICRsaWJuYW1lYmFzZV0gIT0gMCAmJgoJICAgICAhW2FyX3NpbXBsZV9jcmVhdGUgJGFyICIiIHRtcGRpci9zeXNyb290L3RtcC9sZHRlc3QteHl6enkvbGliJGxpYm5hbWViYXNlLmEgJG9uYW1lXSB9IHsKCSAgICBlcnJvciAiRXJyb3IgY3JlYXRpbmcgYXJjaGl2ZSAkbGlibmFtZWJhc2UgZm9yIHN5c3Jvb3QtcHJlZml4IHRlc3RzoGZyYW1ld29yayIKCSAgICByZXR1cm4gMAoJfQogICAgfQoKICAgIHJldHVybiAxCn0KCiMgUnVuIGEgc2luZ2xlIGxpbmtlciB0ZXN0Lgpwcm9jIHNpbmdsZV9zeXNyb290X3ByZWZpeF90ZXN0IHsgdHlwZSB4dGVzdG5hbWUgZmluYWxzY3JpcHQgbGRvcHQgZXJyc3RyIH0gewogICAgZ2xvYmFsIGxkIGV4ZWNfb3V0cHV0IHdpdGhfc3lzcm9vdAogICAgc2V0IHNjcmlwdG5hbWUgInRtcGRpci9saWJzeXNyb290dGVzdC5hIgogICAgc2V0IHRlc3RuYW1lICJzeXNyb290LXByZWZpeCAkeHRlc3RuYW1lIgoKICAgIGlmIHsgKCR0eXBlICYgKCR3aXRoX3N5c3Jvb3QgKyAxKSkgPT0gMCB9IHsKCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQoJcmV0dXJuCiAgICB9CgogICAgaWYgW2NhdGNoIHsgc2V0IG9mZCBbb3BlbiAkc2NyaXB0bmFtZSB3XSB9IHhdIHsKCXBlcnJvciAiJHgiCgl1bnJlc29sdmVkICR0ZXN0bmFtZQoJcmV0dXJuCiAgICB9CgogICAgcHV0cyAkb2ZkICIkZmluYWxzY3JpcHQiCiAgICBjbG9zZSAkb2ZkCiAgICB2ZXJib3NlIC1sb2cgInNjcmlwdDogJGZpbmFsc2NyaXB0IgoKICAgIHNldCByZXMgW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvb3V0cHV0ICIkbGRvcHQgdG1wZGlyL21haW4ubyAtTHRtcGRpciAtbHN5c3Jvb3R0ZXN0Il0KICAgIHNldCBsZF9vdXRwdXQgIiRleGVjX291dHB1dCIKICAgIHNldCBleHBlY3Rfc3VjY2VzcyBbZXhwciBbc3RyaW5nIGxlbmd0aCAkZXJyc3RyXSA9PSAwXQoKICAgIGlmIHsgJHJlcyA9PSAkZXhwZWN0X3N1Y2Nlc3MgJiYKICAgICAgICAgKCRleHBlY3Rfc3VjY2VzcyB8fCBbcmVnZXhwICIkZXJyc3RyIiAkbGRfb3V0cHV0XSkgfSB7CglwYXNzICR0ZXN0bmFtZQoJY2F0Y2ggImV4ZWMgcm0gLWYgJHNjcmlwdG5hbWUiCiAgICB9IHsKCWZhaWwgJHRlc3RuYW1lCiAgICB9Cn0KCiMgUnVuIGFsbCBpbnRlcmVzdGluZyB2YXJpYW50cyBmcm9tIGFuIG9wdGlvbi1hbmQtcGF0aCBjb21iaW5hdGlvbi4KcHJvYyBydW5fc3lzcm9vdF9wcmVmaXhfdGVzdCB7IHR5cGUgbmFtZSB0ZW1wbCBwIGxkb3B0IGVycnN0ciB9IHsKICAgIGdsb2JhbCBiYXNlX2RpcgogICAgc2V0IHFsaXN0IHsgeyAicXVvdGVkIiAiXCIiIH0geyAidW5xdW90ZWQiIHt9IH0gfQoKICAgIHJlZ3N1YiAtYWxsICJAcEAiICR0ZW1wbCAkcCB0ZW1wbAogICAgcmVnc3ViIC1hbGwgIkBjd2RAIiAkdGVtcGwgIiRiYXNlX2Rpci90bXBkaXIiIHRlbXBsCiAgICByZWdzdWIgLWFsbCAiQGN3ZEAiICRsZG9wdCAiJGJhc2VfZGlyL3RtcGRpciIgbGRvcHQKICAgIHJlZ3N1YiAtYWxsICJAY3dkQCIgJG5hbWUgIjxDV0Q+IiBuYW1lCgogICAgZm9yZWFjaCBxaXRlbXMgJHFsaXN0IHsKCXJlZ3N1YiAtYWxsICJAcUAiICR0ZW1wbCBbbGluZGV4ICRxaXRlbXMgMV0gZmluYWxzY3JpcHQKCXNpbmdsZV9zeXNyb290X3ByZWZpeF90ZXN0ICR0eXBlICIkbmFtZSwgW2xpbmRleCAkcWl0ZW1zIDBdIiBcCgkJJGZpbmFsc2NyaXB0ICRsZG9wdCAkZXJyc3RyCiAgICB9Cn0KCiMgUnVuIGEgbGlzdCBvZiBvcHRpb24tYW5kLXBhdGggdGVzdC1jb21iaW5hdGlvbnMuCnByb2MgcnVuX3N5c3Jvb3RfcHJlZml4X3Rlc3RzIHsgZGVzY3IgdGVtcGwgaXRlbXMgfSB7CiAgICBmb3JlYWNoIGl0ZW0gJGl0ZW1zIHsKCXNldCB0eXBlIFtsaW5kZXggJGl0ZW0gMF0KCXNldCBuYW1lIFtsaW5kZXggJGl0ZW0gMV0KCXNldCBwIFtsaW5kZXggJGl0ZW0gMl0KCXNldCBsZG9wdCBbbGluZGV4ICRpdGVtIDNdCglzZXQgZXJyc3RyIFtsaW5kZXggJGl0ZW0gNF0KCXJ1bl9zeXNyb290X3ByZWZpeF90ZXN0ICR0eXBlICIkZGVzY3IgJG5hbWUiICR0ZW1wbCAiJHAiICIkbGRvcHQiICIkZXJyc3RyIgogICAgfQp9CgppZiAhW3N5c3Jvb3RfcHJlZml4X3Rlc3Rfc2V0dXBdIHsKICAgIHJldHVybgp9CgpydW5fc3lzcm9vdF9wcmVmaXhfdGVzdHMgImNvbW1vbiIgJHRlbXBsYXRlICRzeXNyb290X3ByZWZpeF90ZXN0cwo=