LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBsb2cgZm9ybWF0IChhZGQgMC1wYWRkaW5nIGFzIGFwcHJvcHJpYXRlKToKICAgIGtleWNvZGUgICV1ICBhcyBpbiBvdXRwdXQgZnJvbSB4ZXYKICAgIGtleXN5bSAgICVseCBhcyBpbiBYMTEva2V5c3ltZGVmLmgKICAgIHZrZXkgICAgICVYICBhcyBpbiB3aW51c2VyLmgKICAgIHNjYW5jb2RlICV4CiovCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCi8qIGtleSBzdGF0ZSB0YWJsZSBiaXRzOgogIDB4ODAgLT4ga2V5IGlzIHByZXNzZWQKICAweDQwIC0+IGtleSBnb3QgcHJlc3NlZCBzaW5jZSBsYXN0IHRpbWUKICAweDAxIC0+IGtleSBpcyB0b2dnbGVkCiovCkJZVEUga2V5X3N0YXRlX3RhYmxlWzI1Nl07CgpzdGF0aWMgQllURSBUcmFja1N5c0tleSA9IDA7IC8qIGRldGVybWluZSB3aGV0aGVyIEFMVCBrZXkgdXAgd2lsbCBjYXVzZSBhIFdNX1NZU0tFWVVQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBXTV9LRVlVUCBtZXNzYWdlICovCgpzdGF0aWMgaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgU2Nyb2xsTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKICAvKiB0aGlzIGlzIG15ICgxMDYta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICBeICAgIFwgKi8KICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgyOSwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgQCAgICBbICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICA6ICAgIF0gKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7CiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4N2QsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDczIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNXzcsVktfT0VNXzUsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fMyxWS19PRU1fNCwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNX1BMVVMsVktfT0VNXzEsVktfT0VNXzYsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzUsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9QTFVTLFZLX09FTV80LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNX01JTlVTLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyLCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYXplcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV9QTFVTLAogICAnQScsJ1onLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdRJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLCdNJyxWS19PRU1fMyxWS19PRU1fNSwKICAgJ1cnLCdYJywnQycsJ1YnLCdCJywnTicsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzgsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2R2b3Jha1tNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsJ1AnLCdZJywnRicsJ0cnLCdDJywnUicsJ0wnLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICAnQScsJ08nLCdFJywnVScsJ0knLCdEJywnSCcsJ1QnLCdOJywnUycsVktfT0VNX01JTlVTLFZLX09FTV81LAogICBWS19PRU1fMSwnUScsJ0onLCdLJywnWCcsJ0InLCdNJywnVycsJ1YnLCdaJywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIFdJTkVERUJVRz0ra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/Igp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8KLyogKFhGcmVlODYgcmVwb3J0cyB0aGUgPD4ga2V5IGV2ZW4gaWYgaXQncyBub3QgcGh5c2ljYWxseSB0aGVyZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWsgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfZHZvcmFrW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiW3siLCJdfSIsCiAiJ1wiIiwiLDwiLCIuPiIsInBQIiwieVkiLCJmRiIsImdHIiwiY0MiLCJyUiIsImxMIiwiLz8iLCI9KyIsCiAiYUEiLCJvTyIsImVFIiwidVUiLCJpSSIsImREIiwiaEgiLCJ0VCIsIm5OIiwic1MiLCItXyIsIlxcfCIsCiAiOzoiLCJxUSIsImpKIiwia0siLCJ4WCIsImJCIiwibU0iLCJ3VyIsInZWIiwieloiCn07CgovKioqIEJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VLW01BSU5fTEVOXVs0XSA9CnsKICJgIiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidAIiwiI34iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXHwiCn07CgovKioqIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyIiwiXCIzIiwiJzQiLCIoNSIsIi02Iiwi6DciLCJfOCIsIuc5Iiwi4DAiLCIpsCIsIj0rIiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKMiLAogInFRIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi9tYiLCItXyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIrTEIiwiKyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PiIKfTsKCi8qIEFsbCBnZXJtYW4ga2V5YiBsYXlvdXQgdGFibGVzIGhhdmUgdGhlIGFjdXRlL2Fwb3N0cm9waGUgc3ltYm9sIG5leHQgdG8KICogdGhlIEJBQ0tTUEFDRSBrZXkgcmVtb3ZlZCAocmVwbGFjZWQgd2l0aCBOVUxMIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlCiAqIGRldGVjdGlvbiBjb2RlKS4KICogVGhpcyB3YXMgZG9uZSBiZWNhdXNlIHRoZSBtYXBwaW5nIG9mIHRoZSBhY3V0ZSAoYW5kIGFwb3N0cm9waGUpIGlzIGRvbmUKICogZGlmZmVyZW50bHkgaW4gdmFyaW91cyB4a2ItZGF0YS94a2V5Ym9hcmQtY29uZmlnIHZlcnNpb25zLiBTb21lIHJlcGxhY2UKICogdGhlIGFjdXRlIHdpdGggYSBub3JtYWwgYXBvc3Ryb3BoZSwgc28gdGhhdCB0aGUgYXBvc3Ryb3BoZSBpcyBmb3VuZCB0d2ljZQogKiBvbiB0aGUga2V5Ym9hcmQgKG9uZSBuZXh0IHRvIEJBQ0tTUEFDRSBhbmQgb25lIG5leHQgdG8gRU5URVIpLgogKiBPdGhlcnMgcHV0IHRoZSBhY3V0ZSBhbmQgZ3JhdmUgYWNjZW50cyBvbiB0aGUga2V5IGxlZnQgb2YgQkFDS1NQQUNFLgogKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBmZC5vIGJ1Z3RyYWNrZXI6CiAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTE0CiAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiXDBgIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCJceGZjXHhkYyIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiXHhmNlx4ZDYiLCJceGU0XHhjNCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIt8/IiwiXDBgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCIiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZGUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NHW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/OgiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9ukiLCLk4CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjaCAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0ZbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSsiLCIyXCIiLCIzKiIsIjTnIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCJeYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo/CIsIqghIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLp9iIsIuDkIiwiJKMiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgT3ZlIEvldmVuKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OT1tNQUlOX0xFTl1bNF0gPQp7CiAifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXGC0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRGFuaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRrKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9EQVtNQUlOX0xFTl1bNF0gPQp7CiAivaciLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwi+NgiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2VkaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBlZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVRbTUFJTl9MRU5dWzRdID0KewogIrd+IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIvXVIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhX2VuaGFuY2VkKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DRltNQUlOX0xFTl1bNF0gPQp7CiAiI3xcXCIsIjEhsSIsIjJcIkAiLCIzL6MiLCI0JKIiLCI1JaQiLCI2P6wiLCI3JqYiLCI4KrIiLCI5KLMiLCIwKbwiLCItX70iLCI9K74iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT6ciLCJwULYiLCJeXlsiLCK4qF0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6fiIsImBgeyIsIjw+fSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsJy0iLCIuIiwi6ckiLAogIqu7sCIKfTsKCi8qKiogQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhIC12YXJpYW50IGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DQV9mcltNQUlOX0xFTl1bNF0gPQp7CiAiI3wiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1JSIsIjY/IiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl5eIiwiuKgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiYGAiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsJyIsIi4iLCLpySIsCiAiq7siCn07CgovKioqIENhbmFkaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DQVtNQUlOX0xFTl1bNF0gPQp7CiAiL1xcIiwiMSG5oSIsIjJAsiIsIjMjs6MiLCI0JLykIiwiNSW9IiwiNj++IiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0/42CIsInBQ/t4iLCJeqKgiLCLnx34iLAogImFB5sYiLCJzU9+nIiwiZETw0CIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6tCIsIujIIiwi4MAiLAogInpaIiwieFgiLCJjQ6KpIiwidlYiLCJiQiIsIm5OIiwibU21uiIsIiwnIiwiLlwit/ciLCLpySIsCiAi+dkiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgcHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqu7IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIisqIiwitGAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwiuqoiLCJ+XiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGl0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCLsXiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo6SIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLy5yIsIuCwIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmaSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfYmRzW01BSU5fTEVOXVs0XSA9CnsKICJgfigpIiwiMSEiLCIyQDI/IiwiMyMzKyIsIjQkNFwiIiwiNSUiLCI2XjY9IiwiNyY3OiIsIjgqOC8iLCI5KCIsIjApIiwiLV8tSSIsIj0rLlYiLAogInFRLPsiLCJ3V/PTIiwiZUXlxSIsInJS6MgiLCJ0VPjYIiwieVn52SIsInVV6soiLCJpSfHRIiwib0/kxCIsInBQ58ciLCJbe/bWIiwiXX07IiwKICJhQfzcIiwic1P/3yIsImRE4MAiLCJmRu7OIiwiZ0fmxiIsImhI48MiLCJqSvLSIiwia0vtzSIsImxM4sIiLCI7OuzMIiwiJ1wi99ciLCJcXHwn2yIsCiAielr+3iIsInhY6ckiLCJjQ/raIiwidlb93SIsImJC9NQiLCJuTvXVIiwibU3vzyIsIiw88NAiLCIuPuvLIiwiLz/hwSIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfvfXIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUf/fIiwid1fiwiIsImVF5cUiLCJyUvDQIiwidFTy0iIsInlZ+toiLCJ1VfPTIiwiaUnoyCIsIm9P7s4iLCJwUO/PIiwiW3v42CIsIl19+dkiLAogImFB4MAiLCJzU/HRIiwiZETkxCIsImZG9NQiLCJnR+PDIiwiaEj11SIsImpK6ckiLCJrS+rKIiwibEzryyIsIjs6IiwiJ1wiIiwiXFx8/t4iLAogInpa58ciLCJ4WPzcIiwiY0P21iIsInZW5sYiLCJiQuHBIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQmVsYXJ1c2lhbiBzdGFuZGFyZCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEhsZWIgVmFsb3NrYSkgKi8KLyoqKiBJdCBtYXRjaGVzIGJlbGFydXNpYW4gbGF5b3V0IGZvciBYS0IgZnJvbSBBbGV4YW5kZXIgTWlraGFpbGlhbiAgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CWVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6jsyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT66+IiwicFDa+iIsIlt7yOgiLCJdfScnIiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwvfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCprYiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8uLCIsICI8PnymIiwKfTsKCgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQYXZlbCBSb3NraW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfa29pOHJbTUFJTl9MRU5dWzRdID0KewogIigpIiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNToiLCI2LCIsIjcuIiwiODsiLCI5PyIsIjAlIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFx8IiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfY3AxMjUxW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHpySIsIndX9tYiLCJlRfPTIiwiclLqyiIsInRU5cUiLCJ5We3NIiwidVXjwyIsImlJ+NgiLCJvT/nZIiwicFDnxyIsIlt79dUiLCJdffraIiwKICJhQfTUIiwic1P72yIsImRE4sIiLCJmRuDAIiwiZ0fvzyIsImhI8NAiLCJqSu7OIiwia0vryyIsImxM5MQiLCI7OubGIiwiJ1wi/d0iLCJcXHwiLAogInpa/98iLCJ4WPfXIiwiY0Px0SIsInZW7MwiLCJiQujIIiwibk7y0iIsIm1N/NwiLCIsPOHBIiwiLj7+3iIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHR8SIsIndX1/ciLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdn5IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfd39IiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSsrqIiwia0vL6yIsImxMzOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielra+iIsInhY2PgiLCJjQ8PjIiwidlbW9iIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6tvSIsIjEhMSEiLCIyQDJcIiIsIjMjMyciLCI0JDQqIiwiNSU1OiIsIjZeNiwiLCI3JjcuIiwiOCo4OyIsIjkoOSgiLCIwKTApIiwiLV8tXyIsIj0rPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX2ntyIsCiAiYUHG5iIsInNTprYiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcIqS0IiwiXFx8XFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIGJ5IE8uIE55a3lmb3JjaHluICovCi8qKiogIChhcyBpdCBhcHBlYXJzIG9uIG1vc3Qgb2Yga2V5Ym9hcmRzIHNvbGQgdG9kYXkpICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKtvSIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCKntyIsCiAixuYiLCKmtiIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCKktCIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIChwYWlyIHRvIHRoZSBwcmV2aW91cykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKjsyIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVNbTUFJTl9MRU5dWzRdID0KewogIrqqIiwiMSEiLCIyXCIiLCIztyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKhvyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJgXiIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIrSoIiwi58ciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGh1KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IVVtNQUlOX0xFTl1bNF0gPQp7CiAiMKciLCIxJyIsIjJcIiIsIjMrIiwiNCEiLCI1JSIsIjYvIiwiNz0iLCI4KCIsIjkpIiwi9tYiLCL83CIsIvPTIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvXVIiwi+toiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIunJIiwi4cEiLCL72yIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIu3NIgp9OwoKLyoqKiBQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUExbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyanIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVF6soiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0/z0yIsInBQIiwiW3siLCJdfSIsCiAiYUGxoSIsInNTtqYiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTLOjIiwiOzoiLCInXCIiLCJcXHwiLAogInpav68iLCJ4WLysIiwiY0PmxiIsInZWIiwiYkIiLCJuTvHRIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNpKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NJW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc3IpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU1JbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAiqbkiLCKquiIsIsXlIiwi0vIiLCLU9CIsItr6Iiwi1fUiLCLJ6SIsIs/vIiwi0PAiLCLb+yIsIltdIiwKICLB4SIsItPzIiwixOQiLCLG5iIsIsfnIiwiyOgiLCKouCIsIsvrIiwizOwiLCLe/iIsIqu7IiwiLV8iLAogIqGxIiwir78iLCLD4yIsItf3IiwiwuIiLCLO7iIsIs3tIiwiLDsiLCIuOiIsItb2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsc3IpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfU1JbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQDJcIiIsIjMjIiwiNCQiLCI1JSIsIjZeNiYiLCI3JjcvIiwiOCo4KCIsIjkoOSkiLCIwKTA9IiwiLV8nPyIsIj0rKyoiLAogInFRqbkiLCJ3V6q6IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVna+iIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX1bXSIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakqouCIsImtLy+siLCJsTMzsIiwiOzre/iIsIidcIqu7IiwiXFx8LV8iLAogInpaobEiLCJ4WK+/IiwiY0PD4yIsInZW1/ciLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCw7IiwiLj4uOiIsIi8/1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IHNwZWNpZmljIGZvciBtZSA8amVsbHlAc3JrLmZlci5ocj4gKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUl9qZWxseVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3u5qSIsIl198NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs66MgiLCInXCLmxiIsIlxcfL6uIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBocikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUltNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfanAxMDZbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwfiIsIi09IiwiXn4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX21hY2pwW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXn4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiX18iLAp9OwoKLyoqKiBKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfcGM5OHgxW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXmAiLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQH4iLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgR29tZXMgRmVybmFuZGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjaoIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrRgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IHdpdGggPEFMVCBHUj4gKGNvbnRyaWJ1dGVkIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJfYWx0X2dyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxITkiLCIyQDIiLCIzIzMiLCI0JCMiLCI1JVwiIiwiNigsIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rJyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCI0YCIsIlt7KiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiZ0ciLCJ+XiIsIl19OiIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPzAiCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiOzAiLCIrMSIsIrUyIiwiuTMiLCLoNCIsIrs1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwiJ3YiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCLkKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9FwiIiwipyEiLCLyKSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjeikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjel9xd2VydHkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaX3F3ZXJ0eVtNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIFNsb3ZhayBhbmQgQ3plY2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19kdWFsKGNzX3NrX3VjdykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLX3Byb2dbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUeTEIiwid1fszCIsImVF6ckiLCJyUvjYIiwidFS7qyIsInlZ/d0iLCJ1VfnZIiwiaUntzSIsIm9P89MiLCJwUPbWIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTuakiLCJkRO/PIiwiZkbryyIsImdH4MAiLCJoSPraIiwiakr83CIsImtL9NQiLCJsTLWlIiwiOzoiLCInXCIiLCJcXHwiLAogInpavq4iLCJ4WKQiLCJjQ+jIIiwidlbnxyIsImJCIiwibk7y0iIsIm1N5cUiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShjc19xd2VydHkpIGluIHhrYnNlbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1NbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpML0pIiwiPSUiLCIiLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i9beyIsIikoXX0iLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIvlcIiQiLCKnId8iLCKoJyIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEdhYnJpZWwgT3JsYW5kbyBHYXJjaWEpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xBW01BSU5fTEVOXVs0XSA9CnsKICJ8sCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiv6EiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrSoIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwie1teIiwifV0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBsdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTFRfQltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCLgwCIsIujIIiwi5sYiLCLryyIsIuHBIiwi8NAiLCL42CIsIvvbIiwipSgiLCK0KSIsIi1fIiwi/t4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICKqrCIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJbTUFJTl9MRU5dWzRdID0KewoiXCJcXCIsIjEhIiwiMiciLCIzXiIsIjQrIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKj8iLCItXyIsCiJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIlx4YjlJIiwib08iLCJwUCIsIlx4YmJceGFiIiwi/NwiLAoiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiXHhiYVx4YWEiLCJpXDAiLCIsOyIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIsCiI8PiIKfTsKCi8qKiogVHVya2lzaCBGIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyZikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJfRltNQUlOX0xFTl1bNF0gPQp7CiIrKiIsIjEhIiwiMlwiIiwiM14jIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMD0iLCIvPyIsIi1fIiwKImZGIiwiZ0ciLCJceGJiXHhhYiIsIlx4YjlJIiwib08iLCJkRCIsInJSIiwibk4iLCJoSCIsInBQIiwicVEiLCJ3VyIsCiJ1VSIsImlcMCIsImVFIiwiYUEiLCL83CIsInRUIiwia0siLCJtTSIsImxMIiwieVkiLCJceGJhXHhhYSIsInhYIiwKImpKIiwi9tYiLCJ2ViIsImNDIiwi58ciLCJ6WiIsInNTIiwiYkIiLCIuOiIsIiw7IiwKIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMW01BSU5fTEVOXVs0XSA9CnsKICJgfjsiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRLyIsIndXJyIsImVF9yIsInJS+CIsInRU4CIsInlZ6CIsInVV5SIsImlJ7yIsIm9P7SIsInBQ9CIsIlt7IiwiXX0iLAogImFB+SIsInNT4yIsImRE4iIsImZG6yIsImdH8iIsImhI6SIsImpK5yIsImtL7CIsImxM6iIsIjs68yIsIlwnXCIsIiwiXFx8IiwKICJ6WuYiLCJ4WPEiLCJjQ+EiLCJ2VuQiLCJiQvAiLCJuTu4iLCJtTfYiLCIsPPoiLCIuPvUiLCIvPy4iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWxfcGhvbmV0aWMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1flIiwiZUXgIiwiclL4IiwidFT6IiwieVnyIiwidVXlIiwiaUnpIiwib0/xIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1P5IiwiZETjIiwiZkb0IiwiZ0fiIiwiaEjkIiwiakrpIiwia0vrIiwibEzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW5SIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIC1zeW1ib2xzICJ1cyhwYzEwNSkraWxfc2FoYXJvbiIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3NhaGFyb25bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V/EiLCJlRSIsInJS+CIsInRU6CIsInlZ4yIsInVVIiwiaUkiLCJvTyIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT5SIsImRE7CIsImZG+iIsImdH4iIsImhI5CIsImpK+SIsImtL6yIsImxM6SIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VvIiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBHcmVlayBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEtyaXRvbiBLeXJpbWlzIDxreXJpbWlzQGN0aS5ncj4pCiAgR3JlZWsgY2hhcmFjdGVycyBmb3IgIndXIiBhbmQgInNTIiBhcmUgb21pdHRlZCB0byBub3QgcHJvZHVjZSBhIG1pc21hdGNoCiAgbWVzc2FnZSBzaW5jZSB0aGV5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgaW4gZ3IgYW5kIGVsIFhGcmVlODYgbGF5b3V0cy4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRUxbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUTs6Iiwid1ciLCJlReXFIiwiclLx0SIsInRU9NQiLCJ5WfXVIiwidVXoyCIsImlJ6ckiLCJvT+/PIiwicFDw0CIsIlt7IiwiXX0iLAogImFB4cEiLCJzUyIsImRE5MQiLCJmRvbWIiwiZ0fjwyIsImhI58ciLCJqSu7OIiwia0vqyiIsImxM68siLCI7OrSoIiwiJ1wiIiwiXFx8IiwKICJ6WubGIiwieFj31yIsImND+NgiLCJ2VvnZIiwiYkLiwiIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogVGhhaSAoS2VkbWFuZWUpIGtleWJvYXJkIGxheW91dCBieSBTdXBwaGFjaG9rZSBTdW50aXdpY2hheWEgPG1yY2hva2VAb3BlbnRsZS5vcmc+ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3RoW01BSU5fTEVOXVs0XSA9CnsKICJgfl8lIiwiMSHlKyIsIjJAL/EiLCIzIy3yIiwiNCTA8yIsIjUltvQiLCI2XtjZIiwiNybW3yIsIjgqpPUiLCI5KLX2IiwiMCmo9yIsIi1fovgiLCI9K6r5IiwKICJxUebwIiwid1fkXCIiLCJlRdOuIiwiclK+sSIsInRU0LgiLCJ5WdHtIiwidVXV6iIsImlJw7MiLCJvT7nPIiwicFDCrSIsIlt7urAiLCJdfcUsIiwKICJhQb/EIiwic1PLpiIsImREoa8iLCJmRrTiIiwiZ0fgrCIsImhI6eciLCJqSujrIiwia0vSySIsImxMysgiLCI7OserIiwiXCdcIqcuIiwiXFx8o6UiLAogInpavCgiLCJ4WLspIiwiY0PhqSIsInZWzc4iLCJiQtoiLCJuTtfsIiwibU23PyIsIiw8wbIiLCIuPuPMIiwiLz+9xiIKfTsgCgovKioqIFZOQyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl92bmNbTUFJTl9MRU5dID0KewogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDFBLDB4MUIsMHgyNywweDI4LDB4MjksMHgzMywweDM0LDB4MzUsMHgyQiwKICAgMHgxRSwweDMwLDB4MkUsMHgyMCwweDEyLDB4MjEsMHgyMiwweDIzLDB4MTcsMHgyNCwweDI1LDB4MjYsMHgzMiwweDMxLDB4MTgsMHgxOSwweDEwLDB4MTMsMHgxRiwweDE0LDB4MTYsMHgyRiwweDExLDB4MkQsMHgxNSwweDJDLAogICAweDU2Cn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3ZuY1tNQUlOX0xFTl0gPQp7CiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgICdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08nLCdQJywnUScsJ1InLCdTJywnVCcsJ1UnLCdWJywnVycsJ1gnLCdZJywnWicsCiAgIFZLX09FTV8xMDIKfTsKCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3ZuY1tNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwiW3siLCJdfSIsIjs6IiwiJ1wiIiwiYH4iLCIsPCIsIi4+IiwiLz8iLCJcXHwiLAogImFBIiwiYkIiLCJjQyIsImREIiwiZUUiLCJmRiIsImdHIiwiaEgiLCJpSSIsImpKIiwia0siLCJsTCIsIm1NIiwibk4iLCJvTyIsInBQIiwicVEiLCJyUiIsInNTIiwidFQiLCJ1VSIsInZWIiwid1ciLCJ4WCIsInlZIiwieloiCn07CgovKioqIER1dGNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIG5sKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05MW01BSU5fTEVOXVs0XSA9CnsKICJApyIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3XyIsIjgoIiwiOSkiLCIwJyIsIi8/IiwisH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiqH4iLCIqfCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiK7EiLCInYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItPSIsCiAiW10iCn07CgoKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBMQ0lEIGxjaWQ7IC8qIGlucHV0IGxvY2FsZSBpZGVudGlmaWVyLCBsb29rIGZvciBMT0NBTEVfSUxBTkdVQUdFCiAgICAgICAgICAgICAgICAgaW4gdGhlIGFwcHJvcHJpYXRlIGRsbHMva2VybmVsL25scy8ubmxzIGZpbGUgKi8KICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQ7CiAgICBjb25zdCBjaGFyICgqa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjb25zdCBXT1JEICgqc2NhbilbTUFJTl9MRU5dOyAvKiBzY2FuIGNvZGVzIG1hcHBpbmcgKi8KICAgIGNvbnN0IFdPUkQgKCp2a2V5KVtNQUlOX0xFTl07IC8qIHZpcnR1YWwga2V5IGNvZGVzIG1hcHBpbmcgKi8KfSBtYWluX2tleV90YWJbXT17CiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWspIiwgJm1haW5fa2V5X1VTX2R2b3JhaywgJm1haW5fa2V5X3NjYW5fZHZvcmFrLCAmbWFpbl9rZXlfdmtleV9kdm9yYWt9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMgSW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVNfaW50bCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwOSwgIkJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9ERSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCBmb3IgbG9naXRlY2ggZGVza3RvcCBwcm8iLCAmbWFpbl9rZXlfREVfbG9naXRlY2gsICAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwODA3LCAiU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MTAwYywgIlN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWQsICJTd2VkaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfdjJ9LAogezB4MDQyNSwgIkVzdG9uaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNCwgIk5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTk8sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDYsICJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBjLCAiRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChDQV9mcikiLCAmbWFpbl9rZXlfQ0FfZnIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0EsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MGMsICJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MDgxNiwgIlBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFRfYnIsICZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgQUxUIEdSIiwgJm1haW5fa2V5X1BUX2JyX2FsdF9nciwmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQwYiwgIkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfYmRzLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMywgIkJlbGFydXNpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JZLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfUlVfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsICZtYWluX2tleV9SVV9rb2k4ciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSIsICZtYWluX2tleV9SVV9jcDEyNTEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVV9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIiwgJm1haW5fa2V5X1VBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1VBX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfUlVfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTAsICJJdGFsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZiwgIkljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGUsICJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDE1LCAiUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNCwgIlNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCBzciIsICZtYWluX2tleV9TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgdXMsc3IiLCAmbWFpbl9rZXlfVVNfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgJm1haW5fa2V5X0hSX2plbGx5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDExLCAiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZ9LAogezB4MDQxMSwgIkphcGFuZXNlIE1hYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfbWFjanAsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcCwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X21hY2pwfSwKIHsweDA0MTEsICJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgJm1haW5fa2V5X0NaLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6X3F3ZXJ0eSIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjcsICJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0ciIsICZtYWluX2tleV9UUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyZiIsICZtYWluX2tleV9UUl9GLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfc2FoYXJvbiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlZOQyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdm5jLCAmbWFpbl9rZXlfc2Nhbl92bmMsICZtYWluX2tleV92a2V5X3ZuY30sCiB7MHgwNDA4LCAiR3JlZWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFlLCAiVGhhaSAoS2VkbWFuZWUpICBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdGgsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTMsICJEdXRjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTkwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKCiB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfdmtleVsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMCwgVktfSEFOR1VMLCAwLCAwLCBWS19IQU5KQSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTAgKi8KICAgIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwwLDAsIFZLX0FQUFMsIC8qIEZGNjAgKi8KICAgIDAsIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICBWS19FTkQsIFZLX0NMRUFSLCBWS19JTlNFUlQsIFZLX0RFTEVURSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwKICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDQsIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5LCAwLCAwLCAwLCBWS19PRU1fTkVDX0VRVUFMLCAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICBWS19GMSwgVktfRjIsCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2LCBWS19GMTcsIFZLX0YxOCwgLyogRkZDOCAqLwogICAgVktfRjE5LCBWS19GMjAsIFZLX0YyMSwgVktfRjIyLCBWS19GMjMsIFZLX0YyNCwgMCwgMCwgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfTFNISUZULCBWS19SU0hJRlQsIFZLX0xDT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfUkNPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX01FTlUsCiAgICBWS19NRU5VLCBWS19MTUVOVSwgVktfUk1FTlUsIFZLX0xXSU4sIFZLX1JXSU4sIDAsIDAsIDAsICAgICAvKiBGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV9zY2FuWzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIDB4MEUsIDB4MEYsIDB4MDAsIC8qPyovIDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiwgICAgICAvKiBGRjUwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICAvKj8qLyAwLCAweDEzNywgLyo/Ki8gMCwgMHgxNTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTVELCAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIEZGNjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNDUsICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExQywgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMHgwMCwgMHgwMCwgMHgzNywgMHg0RSwgMHg1MywgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgMHgzQiwgMHgzQywKICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAweDVCLCAweDVDLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZDOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAweDAwLCAweDJBLCAweDEzNiwgMHgxRCwgMHgxMUQsIDB4M0EsIDB4MDAsIDB4MzgsICAgICAgICAgICAgLyogRkZFMCAqLwogICAgMHgxMzgsIDB4MzgsIDB4MTM4LCAweDE1YiwgMHgxNWMsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgIC8qIEZGRTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE1MyAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgeGZyZWU4Nl92ZW5kb3Jfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjAwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYwOCAqLwogICAgMCwgVktfVk9MVU1FX0RPV04sIFZLX1ZPTFVNRV9NVVRFLCBWS19WT0xVTUVfVVAsICAgICAgICAgICAgLyogMTAwOEZGMTAgKi8KICAgIFZLX01FRElBX1BMQVlfUEFVU0UsIFZLX01FRElBX1NUT1AsCiAgICBWS19NRURJQV9QUkVWX1RSQUNLLCBWS19NRURJQV9ORVhUX1RSQUNLLAogICAgMCwgVktfTEFVTkNIX01BSUwsIDAsIFZLX0JST1dTRVJfU0VBUkNILCAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMTggKi8KICAgIDAsIDAsIDAsIFZLX0JST1dTRVJfSE9NRSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0JST1dTRVJfQkFDSywgVktfQlJPV1NFUl9GT1JXQVJELCAgICAgIC8qIDEwMDhGRjIwICovCiAgICBWS19CUk9XU0VSX1NUT1AsIFZLX0JST1dTRVJfUkVGUkVTSCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAvKiAxMDA4RkYyOCAqLwogICAgVktfQlJPV1NFUl9GQVZPUklURVMsIDAsIFZLX0xBVU5DSF9NRURJQV9TRUxFQ1QsIDAsICAgICAgICAgLyogMTAwOEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjkwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY5OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkE4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZGOCAqLwp9OwoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGUtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGUtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKGtleXN5bSA9PSBYS19LUF9TZXBhcmF0b3IgfHwga2V5c3ltID09IFhLX0tQX0RlY2ltYWwgfHwKICAgICAgICAgKGtleXN5bSA+PSBYS19LUF8wICYmIGtleXN5bSA8PSBYS19LUF85KSkpCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweEZGXTsKCiAgICAvKiBQcmVzc2luZyB0aGUgUGF1c2UvQnJlYWsga2V5IGFsb25lIHByb2R1Y2VzIFZLX1BBVVNFIHZrZXksIHdoaWxlCiAgICAgKiBwcmVzc2luZyBDdHJsK1BhdXNlL0JyZWFrIHByb2R1Y2VzIFZLX0NBTkNFTC4gKi8KICAgIGlmICgoZS0+c3RhdGUgJiBDb250cm9sTWFzaykgJiYgKGtleXN5bSA9PSBYS19CcmVhaykpCiAgICAgICAgcmV0dXJuIFZLX0NBTkNFTDsKCiAgICBUUkFDRV8oa2V5KSgiZS0+a2V5Y29kZSA9ICV1XG4iLCBlLT5rZXljb2RlKTsKCiAgICByZXR1cm4ga2V5YzJ2a2V5W2UtPmtleWNvZGVdOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kdm9pZCBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggV09SRCB3VmssIFdPUkQgd1NjYW4sIERXT1JEIGV2ZW50X2ZsYWdzLCBEV09SRCB0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0V4dHJhSW5mbywgVUlOVCBpbmplY3RlZF9mbGFncyApCnsKICAgIFVJTlQgbWVzc2FnZTsKICAgIEtCRExMSE9PS1NUUlVDVCBob29rOwogICAgV09SRCBmbGFncywgd1ZrU3RyaXBwZWQsIHdWa0wsIHdWa1IsIHZrX2hvb2sgPSB3Vms7CiAgICBMUEFSQU0gbFBhcmFtID0gMDsKCiAgICB3VmsgPSBMT0JZVEUod1ZrKTsKICAgIGZsYWdzID0gTE9CWVRFKHdTY2FuKTsKCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpIGZsYWdzIHw9IEtGX0VYVEVOREVEOwogICAgLyogRklYTUU6IHNldCBLRl9ETEdNT0RFIGFuZCBLRl9NRU5VTU9ERSB3aGVuIG5lZWRlZCAqLwoKICAgIC8qIHN0cmlwIGxlZnQvcmlnaHQgZm9yIG1lbnUsIGNvbnRyb2wsIHNoaWZ0ICovCiAgICBzd2l0Y2ggKHdWaykKICAgIHsKICAgIGNhc2UgVktfTUVOVToKICAgIGNhc2UgVktfTE1FTlU6CiAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgIHdWayA9IChldmVudF9mbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgPyBWS19STUVOVSA6IFZLX0xNRU5VOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfTUVOVTsKICAgICAgICB3VmtMID0gVktfTE1FTlU7CiAgICAgICAgd1ZrUiA9IFZLX1JNRU5VOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DT05UUk9MOgogICAgY2FzZSBWS19MQ09OVFJPTDoKICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgd1ZrID0gKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSA/IFZLX1JDT05UUk9MIDogVktfTENPTlRST0w7CiAgICAgICAgd1ZrU3RyaXBwZWQgPSBWS19DT05UUk9MOwogICAgICAgIHdWa0wgPSBWS19MQ09OVFJPTDsKICAgICAgICB3VmtSID0gVktfUkNPTlRST0w7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX1NISUZUOgogICAgY2FzZSBWS19MU0hJRlQ6CiAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICB3VmsgPSAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpID8gVktfUlNISUZUIDogVktfTFNISUZUOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfU0hJRlQ7CiAgICAgICAgd1ZrTCA9IFZLX0xTSElGVDsKICAgICAgICB3VmtSID0gVktfUlNISUZUOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICB3VmtTdHJpcHBlZCA9IHdWa0wgPSB3VmtSID0gd1ZrOwogICAgfQoKICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9LRVlVUCkKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZVVA7CiAgICAgICAgaWYgKCgoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgJiYKICAgICAgICAgICAgICgod1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgfHwgKHdWa1N0cmlwcGVkID09IFZLX0NPTlRST0wpCiAgICAgICAgICAgICAgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgICAgIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19GMTApKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIFRyYWNrU3lzS2V5ID09IFZLX01FTlUgfHwgLyogPEFMVD4tZG93bi88QUxUPi11cCBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgICAgKHdWa1N0cmlwcGVkICE9IFZLX01FTlUpKSAvKiA8QUxUPi1kb3duLi4uPHNvbWV0aGluZyBlbHNlPi11cCAqLwogICAgICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWVVQOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IDA7CiAgICAgICAgfQogICAgICAgIGZsYWdzIHw9IEtGX1JFUEVBVCB8IEtGX1VQOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG1lc3NhZ2UgPSBXTV9LRVlET1dOOwogICAgICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODAgfHwgd1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgJiYKICAgICAgICAgICAgICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCB8fCB3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKSkgfHwKICAgICAgICAgICAgKHdWa1N0cmlwcGVkID09IFZLX0YxMCkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZRE9XTjsKICAgICAgICAgICAgVHJhY2tTeXNLZXkgPSB3VmtTdHJpcHBlZDsKICAgICAgICB9CiAgICAgICAgaWYgKCEoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfVU5JQ09ERSkgJiYga2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSBmbGFncyB8PSBLRl9SRVBFQVQ7CiAgICB9CgogICAgaWYgKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX1VOSUNPREUpCiAgICB7CiAgICAgICAgdmtfaG9vayA9IHdWayA9IFZLX1BBQ0tFVDsKICAgICAgICBsUGFyYW0gPSBNQUtFTFBBUkFNKDEgLyogcmVwZWF0IGNvdW50ICovLCB3U2Nhbik7CiAgICAgICAgVFJBQ0VfKGtleSkoIm1lc3NhZ2U9MHglMDR4IHdQYXJhbT0weCUwNFggbFBhcmFtPTB4JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgd1ZrLCBsUGFyYW0pOwogICAgfQoKICAgIC8qIEhvb2sgZ2V0cyB3aGF0ZXZlciBrZXkgd2FzIHNlbnQuICovCiAgICBob29rLnZrQ29kZSAgICAgID0gdmtfaG9vazsKICAgIGhvb2suc2NhbkNvZGUgICAgPSB3U2NhbjsKICAgIGhvb2suZmxhZ3MgICAgICAgPSAoZmxhZ3MgPj4gOCkgfCBpbmplY3RlZF9mbGFnczsKICAgIGhvb2sudGltZSAgICAgICAgPSB0aW1lOwogICAgaG9vay5kd0V4dHJhSW5mbyA9IGR3RXh0cmFJbmZvOwogICAgaWYgKEhPT0tfQ2FsbEhvb2tzKCBXSF9LRVlCT0FSRF9MTCwgSENfQUNUSU9OLCBtZXNzYWdlLCAoTFBBUkFNKSZob29rLCBUUlVFICkpIHJldHVybjsKCiAgICBpZiAoIShldmVudF9mbGFncyAmIEtFWUVWRU5URl9VTklDT0RFKSkKICAgIHsKICAgICAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfS0VZVVApCiAgICAgICAgewogICAgICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrXSAmPSB+MHg4MDsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEoa2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSkga2V5X3N0YXRlX3RhYmxlW3dWa10gXj0gMHgwMTsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gfD0gMHhjMDsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgICAgICB9CgogICAgICAgIGlmIChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSBmbGFncyB8PSBLRl9BTFRET1dOOwoKICAgICAgICBpZiAod1ZrU3RyaXBwZWQgPT0gVktfU0hJRlQpIGZsYWdzICY9IH5LRl9FWFRFTkRFRDsKCiAgICAgICAgbFBhcmFtID0gTUFLRUxQQVJBTSgxIC8qIHJlcGVhdCBjb3VudCAqLywgZmxhZ3MpOwoKICAgICAgICBUUkFDRV8oa2V5KSgiIG1lc3NhZ2U9MHglMDR4IHdQYXJhbT0weCUwNFgsIGxQYXJhbT0weCUwOGx4LCBJbnB1dEtleVN0YXRlPTB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgd1ZrLCBsUGFyYW0sIGtleV9zdGF0ZV90YWJsZVt3VmtdKTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZW5kX2hhcmR3YXJlX21lc3NhZ2UgKQogICAgewogICAgICAgIHJlcS0+aWQgICAgICAgPSAoaW5qZWN0ZWRfZmxhZ3MgJiBMTEtIRl9JTkpFQ1RFRCkgPyAwIDogR2V0Q3VycmVudFRocmVhZElkKCk7CiAgICAgICAgcmVxLT53aW4gICAgICA9IDA7CiAgICAgICAgcmVxLT5tc2cgICAgICA9IG1lc3NhZ2U7CiAgICAgICAgcmVxLT53cGFyYW0gICA9IHdWazsKICAgICAgICByZXEtPmxwYXJhbSAgID0gbFBhcmFtOwogICAgICAgIHJlcS0+eCAgICAgICAgPSBjdXJzb3JfcG9zLng7CiAgICAgICAgcmVxLT55ICAgICAgICA9IGN1cnNvcl9wb3MueTsKICAgICAgICByZXEtPnRpbWUgICAgID0gdGltZTsKICAgICAgICByZXEtPmluZm8gICAgID0gZHdFeHRyYUluZm87CiAgICAgICAgd2luZV9zZXJ2ZXJfY2FsbCggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8Kc3RhdGljIGlubGluZSB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggV09SRCB2a2V5LCBXT1JEIHNjYW4sIGludCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChrZXlfc3RhdGVfdGFibGVbdmtleSAmIDB4ZmZdICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gdmtleSAmIDB4MTAwID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMDsKCiAgICAgICAgaWYgKCFzdGF0ZSkgZmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwoKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJYLiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgdmtleSwga2V5X3N0YXRlX3RhYmxlW3ZrZXkgJiAweGZmXSk7CgogICAgICAgIC8qIEZha2Uga2V5IGJlaW5nIHByZXNzZWQgaW5zaWRlIHdpbmUgKi8KICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIHNjYW4gJiAweGZmLCBmbGFncywgdGltZSwgMCwgMCApOwoKICAgICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgJSMuMnhcbiIsIGtleV9zdGF0ZV90YWJsZVt2a2V5ICYgMHhmZl0pOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgajsKICAgIERXT1JEIHRpbWUgPSBHZXRDdXJyZW50VGltZSgpOwoKICAgIC8qIHRoZSBtaW5pbXVtIGtleWNvZGUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gOCwgc28gd2UgY2FuCiAgICAgKiBza2lwIHRoZSBmaXJzdCA4IHZhbHVlcywgaGVuY2Ugc3RhcnQgYXQgMQogICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgV09SRCB2a2V5ID0ga2V5YzJ2a2V5WyhpICogOCkgKyBqXTsKICAgICAgICAgICAgV09SRCBzY2FuID0ga2V5YzJzY2FuWyhpICogOCkgKyBqXTsKICAgICAgICAgICAgaW50IHN0YXRlID0gKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpICE9IDA7CgogICAgICAgICAgICBzd2l0Y2godmtleSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIHZrZXksIHNjYW4sIHN0YXRlLCB0aW1lICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgdXBkYXRlX2xvY2tfc3RhdGUoQllURSB2a2V5LCBXT1JEIHNjYW4sIERXT1JEIHRpbWUpCnsKICAgIERXT1JEIGZsYWdzID0gdmtleSA9PSBWS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMDsKCiAgICBpZiAoa2V5X3N0YXRlX3RhYmxlW3ZrZXldICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwoKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBmbGFncywgdGltZSwgMCwgMCApOwogICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lLCAwLCAwICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBidWZbMjRdOwogICAgY2hhciAqU3RyID0gYnVmOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBldmVudC0+dHlwZSA9PSBLZXlQcmVzcykKICAgIHsKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICBUUkFDRSgiWG1iTG9va3VwU3RyaW5nIG5lZWRzICVpIGJ5dGUocylcbiIsIGFzY2lpX2NoYXJzKTsKICAgICAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICB7CiAgICAgICAgICAgIFN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBhc2NpaV9jaGFycyk7CiAgICAgICAgICAgIGlmIChTdHIgPT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CiAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIFN0ciwgYXNjaWlfY2hhcnMsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzICVkXG4iLCBhc2NpaV9jaGFycywgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhMb29rdXBDaGFycykKICAgIHsKICAgICAgICBYMTFEUlZfWElNTG9va3VwQ2hhcnMoIFN0ciwgYXNjaWlfY2hhcnMgKTsKICAgICAgICBpZiAoYnVmICE9IFN0cikKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgU3RyKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgYXJlIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZSB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggZm9yIEFsdEdyIHNob3VsZCBiZSAyCiAgICAgICAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgLyogU2F2ZSBhbHNvIGFsbCBwb3NzaWJsZSBtb2RpZmllciBzdGF0ZXMuICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAoMHg2MDAwIHwgTW9kMU1hc2sgfCBNb2QyTWFzayB8IE1vZDNNYXNrIHwgTW9kNE1hc2sgfCBNb2Q1TWFzayk7CgogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbHggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgZGVidWdzdHJfYW4oU3RyLCBhc2NpaV9jaGFycykpOwogICAgfQogICAgaWYgKGJ1ZiAhPSBTdHIpCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgU3RyKTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KHhpYyxldmVudCk7CiAgICAvKiBYIHJldHVybnMga2V5Y29kZSAwIGZvciBjb21wb3NlZCBjaGFyYWN0ZXJzICovCiAgICBpZiAoIXZrZXkgJiYgYXNjaWlfY2hhcnMpIHZrZXkgPSBWS19OT05BTUU7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlICV1IGNvbnZlcnRlZCB0byB2a2V5IDB4JVhcbiIsCiAgICAgICAgICAgICAgICBldmVudC0+a2V5Y29kZSwgdmtleSk7CgogICAgaWYgKCF2a2V5KSByZXR1cm47CgogICAgZHdGbGFncyA9IDA7CiAgICBpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKICAgIGlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoKCiAgICAvKiBOb3RlOiBYIHNldHMgdGhlIGJlbG93IHN0YXRlcyBvbiBrZXkgZG93biBhbmQgY2xlYXJzIHRoZW0gb24ga2V5IHVwLgogICAgICAgV2luZG93cyB0cmlnZ2VycyB0aGVtIG9uIGtleSBkb3duLiAqLwoKICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spICYmCiAgICAgICAgdmtleSAhPSBWS19DQVBJVEFMKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgQ2Fwc0xvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX0NBUElUQUxdKTsKICAgICAgICB1cGRhdGVfbG9ja19zdGF0ZShWS19DQVBJVEFMLCAweDNBLCBldmVudF90aW1lKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKHZrZXkgJiAweGZmKSAhPSBWS19OVU1MT0NLKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlfc3RhdGVfdGFibGVbVktfTlVNTE9DS10pOwogICAgICAgIHVwZGF0ZV9sb2NrX3N0YXRlKFZLX05VTUxPQ0ssIDB4NDUsIGV2ZW50X3RpbWUpOwogICAgfQoKICAgIC8qIEFkanVzdCB0aGUgU0NST0xMTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwogICAgaWYgKCEoa2V5X3N0YXRlX3RhYmxlW1ZLX1NDUk9MTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIFNjcm9sbExvY2tNYXNrKSAmJgogICAgICAgIHZrZXkgIT0gVktfU0NST0xMKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgU2NyTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlfc3RhdGVfdGFibGVbVktfU0NST0xMXSk7CiAgICAgICAgdXBkYXRlX2xvY2tfc3RhdGUoVktfU0NST0xMLCAweDQ2LCBldmVudF90aW1lKTsKICAgIH0KCiAgICBiU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwogICAgVFJBQ0VfKGtleSkoImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUsIDAsIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0luaXRLZXlib2FyZAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKiBYMTEgbG9jayBtdXN0IGJlIGhlbGQuCiAqLwpzdGF0aWMgdm9pZApYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBEaXNwbGF5ICpkaXNwbGF5ICkKewogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBpLCBzeW1zOwogIGludCBzY29yZSwga2V5Yywga2V5LCBwa2V5LCBvazsKICBLZXlTeW0ga2V5c3ltID0gMDsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbMjU2XVs0XTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KCiAgbWVtc2V0KCBja2V5LCAwLCBzaXplb2YoY2tleSkgKTsKICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewogICAgICAgIGlmICghKGtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpKSkgY29udGludWU7CgkvKiBBbGxvdyBib3RoIG9uZS1ieXRlIGFuZCB0d28tYnl0ZSBuYXRpb25hbCBrZXlzeW1zICovCglpZiAoKGtleXN5bSA8IDB4ODAwMCkgJiYgKGtleXN5bSAhPSAnICcpKQogICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2tleWNdW2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJYS0IgY291bGQgbm90IHRyYW5zbGF0ZSBrZXlzeW0gJTA0bHhcbiIsIGtleXN5bSk7CiAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBja2V5W2tleWNdW2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgfQogICAgICAgIH0KCWVsc2UgewoJICBja2V5W2tleWNdW2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJfQogICAgICB9CiAgfQoKICBmb3IgKGN1cnJlbnQgPSAwOyBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudDsgY3VycmVudCsrKSB7CiAgICBUUkFDRSgiQXR0ZW1wdGluZyB0byBtYXRjaCBhZ2FpbnN0IFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQpOwogICAgbWF0Y2ggPSAwOwogICAgbWlzbWF0Y2ggPSAwOwogICAgc2NvcmUgPSAwOwogICAgc2VxID0gMDsKICAgIGxrZXkgPSBtYWluX2tleV90YWJbY3VycmVudF0ua2V5OwogICAgcGtleSA9IC0xOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICBpZiAoY2tleVtrZXljXVswXSkgewoJLyogc2VhcmNoIGZvciBhIG1hdGNoIGluIGxheW91dCB0YWJsZSAqLwoJLyogcmlnaHQgbm93LCB3ZSBqdXN0IGZpbmQgYW4gYWJzb2x1dGUgbWF0Y2ggZm9yIGRlZmluZWQgcG9zaXRpb25zICovCgkvKiAodW5kZWZpbmVkIHBvc2l0aW9ucyBhcmUgaWdub3JlZCwgc28gaWYgaXQncyBkZWZpbmVkIGFzICIzIyIgaW4gKi8KCS8qIHRoZSB0YWJsZSwgaXQncyBva2F5IHRoYXQgdGhlIFggc2VydmVyIGhhcyAiMyPCoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlba2V5Y11baV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKICAgICAgICAgIC8qIHByaW50IHNwYWNlcyBpbnN0ZWFkIG9mIFwwJ3MgKi8KICAgICAgICAgIGNoYXIgc3RyWzVdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgc3RyW2ldID0gY2tleVtrZXljXVtpXSA/IGNrZXlba2V5Y11baV0gOiAnICc7CiAgICAgICAgICBzdHJbNF0gPSAwOwogICAgICAgICAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXljb2RlICV1LCBnb3QgJXNcbiIsIGtleWMsIHN0cik7CiAgICAgICAgICBtaXNtYXRjaCsrOwogICAgICAgICAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKQogICAgV0FSTigiVXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuL3ZpcnR1YWwgY29kZXMgbWFwcGluZy5cbiIsCiAgICAgICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgpzdGF0aWMgSEtMIGdldF9sb2NhbGVfa2JkX2xheW91dCh2b2lkKQp7CiAgICBVTE9OR19QVFIgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICAvKiBGSVhNRToKICAgICAqCiAgICAgKiBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgICAqCiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCgogICAgbGF5b3V0ID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgogICAgLyoKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogSU1FICovCiAgICBlbHNlCiAgICAgICAgbGF5b3V0IHw9IGxheW91dCA8PCAxNjsKCiAgICByZXR1cm4gKEhLTClsYXlvdXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CgogICAgbGF5b3V0ID0gSGFuZGxlVG9VbG9uZyggZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCkgKTsKICAgIGlmIChISVdPUkQobGF5b3V0KSA9PSBMT1dPUkQobGF5b3V0KSkgbGF5b3V0ID0gTE9XT1JEKGxheW91dCk7CiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkodm9pZCkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIHByZWxvYWRbXSA9CiAgICAgICAgeydLJywnZScsJ3knLCdiJywnbycsJ2EnLCdyJywnZCcsJyAnLCdMJywnYScsJ3knLCdvJywndScsJ3QnLCdcXCcsJ1AnLCdyJywnZScsJ2wnLCdvJywnYScsJ2QnLDB9OwogICAgc3RhdGljIGNvbnN0IFdDSEFSIG9uZVtdID0geycxJywwfTsKCiAgICBIS0VZIGhrZXk7CiAgICBXQ0hBUiBsYXlvdXRbS0xfTkFNRUxFTkdUSF07CgogICAgaWYgKFJlZ0NyZWF0ZUtleUV4VyhIS0VZX0NVUlJFTlRfVVNFUiwgcHJlbG9hZCwgMCwgTlVMTCwgMCwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsICZoa2V5LCBOVUxMKSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFSZWdRdWVyeVZhbHVlRXhXKGhrZXksIG9uZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFgxMURSVl9HZXRLZXlib2FyZExheW91dE5hbWUobGF5b3V0KSkKICAgICAgICBSZWdTZXRWYWx1ZUV4Vyhoa2V5LCBvbmUsIDAsIFJFR19TWiwgKGNvbnN0IEJZVEUgKilsYXlvdXQsIHNpemVvZihsYXlvdXQpKTsKCiAgICBSZWdDbG9zZUtleShoa2V5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggRGlzcGxheSAqZGlzcGxheSApCnsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICAgIGNoYXIgdmtleV91c2VkWzI1Nl0gPSB7IDAgfTsKCiAgICAvKiBSYW5nZXMgb2YgT0VNLCBmdW5jdGlvbiBrZXksIGFuZCBjaGFyYWN0ZXIgdmlydHVhbCBrZXkgY29kZXMuCiAgICAgKiBEb24ndCBpbmNsdWRlIHRob3NlIGhhbmRsZWQgc3BlY2lhbGx5IGluIFgxMURSVl9Ub1VuaWNvZGVFeCBhbmQKICAgICAqIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgsIGxpa2UgVktfTlVNUEFEMCAtIFZLX0RJVklERS4gKi8KICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgICAgIFdPUkQgZmlyc3QsIGxhc3Q7CiAgICB9IHZrZXlfcmFuZ2VzW10gPSB7CiAgICAgICAgeyBWS19PRU1fMSwgVktfT0VNXzMgfSwKICAgICAgICB7IFZLX09FTV80LCBWS19JQ09fMDAgfSwKICAgICAgICB7IDB4ZTYsIDB4ZTYgfSwKICAgICAgICB7IDB4ZTksIDB4ZjUgfSwKICAgICAgICB7IFZLX09FTV9ORUNfRVFVQUwsIFZLX09FTV9ORUNfRVFVQUwgfSwKICAgICAgICB7IFZLX0YxLCBWS19GMjQgfSwKICAgICAgICB7IDB4MzAsIDB4MzkgfSwgLyogVktfMCAtIFZLXzkgKi8KICAgICAgICB7IDB4NDEsIDB4NWEgfSwgLyogVktfQSAtIFZLX1ogKi8KICAgICAgICB7IDAsIDAgfQogICAgfTsKICAgIGludCB2a2V5X3JhbmdlOwoKICAgIHNldF9rYmRfbGF5b3V0X3ByZWxvYWRfa2V5KCk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGtleXN5bXNfcGVyX2tleWNvZGUuCiAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCiAgICBYRnJlZShrc3ApOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19TY3JvbGxfTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxMb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIlNjcm9sbExvY2tNYXNrIGlzICV4XG4iLCBTY3JvbGxMb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBkaXNwbGF5ICk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwogICAgZTIudHlwZSA9IEtleVByZXNzOwoKICAgIG1lbXNldChrZXljMnZrZXksIDAsIHNpemVvZihrZXljMnZrZXkpKTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgY2hhciBidWZbMzBdOwogICAgICAgIGludCBoYXZlX2NoYXJzOwoKICAgICAgICBrZXlzeW0gPSAwOwogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGhhdmVfY2hhcnMgPSBYTG9va3VwU3RyaW5nKCZlMiwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7IC8qIFhGcmVlODYgdmVuZG9yIGtleXMgKi8KICAgICAgICAgICAgICAgIHZrZXkgPSB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIC8qIEFsbCB2ZW5kb3Iga2V5cyBhcmUgZXh0ZW5kZWQgd2l0aCBhIHNjYW4gY29kZSBvZiAwIHBlciB0ZXN0aW5nIG9uIFdpblhQICovCiAgICAgICAgICAgICAgICBzY2FuID0gMHgxMDA7CgkJdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSBpZiAoaGF2ZV9jaGFycykgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIGkpOwoJCWlmICgoa2V5c3ltPDB4ODAwMCkgJiYgKGtleXN5bSE9JyAnKSkKICAgICAgICAgICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlbaV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgfQoJCX0gZWxzZSB7CgkJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJCX0KCSAgICAgIH0KCSAgICAgIC8qIGZpbmQga2V5IHdpdGggbG9uZ2VzdCBtYXRjaCBzdHJlYWsgKi8KCSAgICAgIGZvciAoa2V5bj0wOyBrZXluPE1BSU5fTEVOOyBrZXluKyspIHsKCQlmb3IgKG9rPSgqbGtleSlba2V5bl1baT0wXTsgb2smJihpPDQpOyBpKyspCgkJICBpZiAoKCpsa2V5KVtrZXluXVtpXSAmJiAoKmxrZXkpW2tleW5dW2ldIT1ja2V5W2ldKSBvaz0wOwoJCWlmICghb2spIGktLTsgLyogd2Ugb3ZlcnNob3QgKi8KCQlpZiAob2t8fChpPm1heGxlbikpIHsKCQkgIG1heGxlbj1pOyBtYXh2YWw9a2V5bjsKCQl9CgkJaWYgKG9rKSBicmVhazsKCSAgICAgIH0KCSAgICAgIGlmIChtYXh2YWw+PTApIHsKCQkvKiBnb3QgaXQgKi8KCQljb25zdCBXT1JEICgqbHNjYW4pW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5zY2FuOwoJCWNvbnN0IFdPUkQgKCpsdmtleSlbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnZrZXk7CgkJc2NhbiA9ICgqbHNjYW4pW21heHZhbF07CgkJdmtleSA9ICgqbHZrZXkpW21heHZhbF07CgkgICAgICB9CgkgICAgfQogICAgICAgIH0KICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgICAgICBpZiAoKHZrZXkgJiAweGZmKSAmJiB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0pCiAgICAgICAgICAgIFdBUk4oInZrZXkgJTA0WCBpcyBiZWluZyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUga2V5Y29kZVxuIiwgdmtleSk7CiAgICAgICAgdmtleV91c2VkWyh2a2V5ICYgMHhmZildID0gMTsKICAgIH0gLyogZm9yICovCgojZGVmaW5lIFZLRVlfSUZfTk9UX1VTRUQodmtleSkgKHZrZXlfdXNlZFsodmtleSldID8gMCA6ICh2a2V5X3VzZWRbKHZrZXkpXSA9IDEsICh2a2V5KSkpCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweGZmOwogICAgICAgIGlmICh2a2V5KQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIDApOwogICAgICAgIGlmICgha2V5c3ltKQogICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCiAgICAgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBYS18wICYmIGtleXN5bSA8PSBYS185KQogICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBYS19BICYmIGtleXN5bSA8PSBYS19aKSkgewogICAgICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoa2V5c3ltKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIHN3aXRjaCAoa2V5c3ltKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJzsnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcvJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8zKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1snOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcXCc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzUpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV82KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1wnJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX0NPTU1BKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUEVSSU9EKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy0nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fTUlOVVMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnKyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QTFVTKTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoImtleWNvZGUgJXUgPT4gdmtleSAlMDRYXG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICB9CiAgICB9IC8qIGZvciAqLwoKICAgIC8qIEZvciBhbnkga2V5Y29kZXMgd2hpY2ggc3RpbGwgZG9uJ3QgaGF2ZSBhIHZrZXksIGFzc2lnbiBhbnkgc3BhcmUKICAgICAqIGNoYXJhY3RlciwgZnVuY3Rpb24ga2V5LCBvciBPRU0gdmlydHVhbCBrZXkgY29kZS4gKi8KICAgIHZrZXlfcmFuZ2UgPSAwOwogICAgdmtleSA9IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmZpcnN0OwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdICYgMHhmZikKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgd2hpbGUgKHZrZXkgJiYgdmtleV91c2VkW3ZrZXldKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZrZXkgPT0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0ubGFzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleV9yYW5nZSsrOwogICAgICAgICAgICAgICAgdmtleSA9IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmZpcnN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZrZXkrKzsKICAgICAgICB9CgogICAgICAgIGlmICghdmtleSkKICAgICAgICB7CiAgICAgICAgICAgIFdBUk4oIk5vIG1vcmUgdmtleXMgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRSQUNFX09OKGtleWJvYXJkKSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJzcGFyZSB2aXJ0dWFsIGtleSAlMDRYIGFzc2lnbmVkIHRvIGtleWNvZGUgJXU6XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICBUUkFDRSgiKCIpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwogICAgICAgICAgICAgICAgVFJBQ0UoICIlbHggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0UoIilcbiIpOwogICAgICAgIH0KCiAgICAgICAgVFJBQ0UoImtleWNvZGUgJXUgPT4gdmtleSAlMDRYXG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIHZrZXlfdXNlZFt2a2V5XSA9IDE7CiAgICB9IC8qIGZvciAqLwojdW5kZWYgVktFWV9JRl9OT1RfVVNFRAoKICAgIC8qIElmIHNvbWUga2V5cyBzdGlsbCBsYWNrIHNjYW5jb2RlcywgYXNzaWduIHNvbWUgYXJiaXRyYXJ5IG9uZXMgdG8gdGhlbSBub3cgKi8KICAgIGZvciAoc2NhbiA9IDB4NjAsIGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdJiYha2V5YzJzY2FuW2tleWNdKSB7Cgljb25zdCBjaGFyICprc25hbWU7CglrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAldSAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCnN0YXRpYyBCT09MIG1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoSEtMIGhrbCkKewogICAgY29uc3QgRFdPUkQgaXNJTUUgPSAweEUwMDAwMDAwOwogICAgSEtMIHhIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICAvKiBpZiB0aGUgbGF5b3V0IGlzIGFuIElNRSwgb25seSBtYXRjaCB0aGUgbG93IHdvcmQgKExDSUQpICovCiAgICBpZiAoKChVTE9OR19QVFIpaGtsICYgaXNJTUUpID09IGlzSU1FKQogICAgICAgIHJldHVybiAoTE9XT1JEKGhrbCkgPT0gTE9XT1JEKHhIa2wpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKGhrbCA9PSB4SGtsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgU0hPUlQgcmV0dmFsOwoKICAgIC8qIFBob3Rvc2hvcCBsaXZlbG9ja3MgdW5sZXNzIG1vdXNlIGV2ZW50cyBhcmUgaW5jbHVkZWQgaGVyZSAqLwogICAgWDExRFJWX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMCwgTlVMTCwgMCwgUVNfS0VZIHwgUVNfTU9VU0UsIDAgKTsKCiAgICByZXR2YWwgPSAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg0MCkgPyAweDAwMDEgOiAwKSB8CiAgICAgICAgICAgICAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg4MCkgPyAweDgwMDAgOiAwKTsKICAgIGtleV9zdGF0ZV90YWJsZVtrZXldICY9IH4weDQwOwogICAgVFJBQ0VfKGtleSkoIiglWCkgLT4gJXhcbiIsIGtleSwgcmV0dmFsKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgaWYgKCFkd1RocmVhZGlkIHx8IGR3VGhyZWFkaWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCiAgICB7CiAgICAgICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKTsKICAgICAgICBpZiAodGhyZWFkX2RhdGEgJiYgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQpIHJldHVybiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIH0KICAgIGVsc2UKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIENERUNMIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgSEtMIG9sZEhrbCA9IDA7CiAgICBzdHJ1Y3QgeDExZHJ2X3RocmVhZF9kYXRhICp0aHJlYWRfZGF0YSA9IHgxMWRydl9pbml0X3RocmVhZF9kYXRhKCk7CgogICAgRklYTUUoIiVwLCAlMDR4OiBzZW1pLXN0dWIhXG4iLCBoa2wsIGZsYWdzKTsKICAgIGlmIChmbGFncyAmIEtMRl9TRVRGT1JQUk9DRVNTKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIktMRl9TRVRGT1JQUk9DRVNTIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChmbGFncykKICAgICAgICBGSVhNRSgiZmxhZ3MgJXggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CgogICAgaWYgKGhrbCA9PSAoSEtMKUhLTF9ORVhUIHx8IGhrbCA9PSAoSEtMKUhLTF9QUkVWKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIkhLTF9ORVhUIGFuZCBIS0xfUFJFViBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJzZXR0aW5nIGtleWJvYXJkIG9mIGRpZmZlcmVudCBsb2NhbGVzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG9sZEhrbCA9IHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0OwogICAgaWYgKCFvbGRIa2wpIG9sZEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0ID0gaGtsOwoKICAgIHJldHVybiBvbGRIa2w7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBIV05EIGR1bW15LCBYRXZlbnQgKmV2ZW50ICkKewogICAgSFdORCBod25kOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJmV2ZW50LT54bWFwcGluZyk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggZXZlbnQtPnhtYXBwaW5nLmRpc3BsYXkgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpLCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KICAgIGlmICgha2V5Y29kZSkKICAgIHsKICAgICAgICBpZiAoa2V5c3ltID49IDB4RkYwMCkgLyogV2luZG93cyByZXR1cm5zIDB4MDI0MCArIGNDaGFyIGluIHRoaXMgY2FzZSAqLwogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gMHgwMjQwICsgY0NoYXI7IC8qIDB4MDIwMCBpbmRpY2F0ZXMgYSBjb250cm9sIGNoYXJhY3RlciAqLwogICAgICAgICAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgY3RybCBjaGFyICUjLjJ4XG4iLCByZXQpOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KICAgICAgICAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KICAgICAgICBUUkFDRSgicmV0cnlpbmcgd2l0aCB8IDB4RkUwMFxuIik7CiAgICAgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0UoIiclYycoJWx4KTogZ290IGtleWNvZGUgJXVcbiIsIGNDaGFyLCBrZXlzeW0sIGtleWNvZGUpOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwoKICAgIGlmICgha2V5Y29kZSB8fCAhcmV0KQogICAgewogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGluZGV4ID0gLTE7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgIHsKICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljb2RlLCBpKSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgc3dpdGNoIChpbmRleCkKICAgIHsKICAgICAgICBkZWZhdWx0OgogICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgIFdBUk4oIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsIGtleXN5bSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHJldCArPSAweDAxMDA7IGJyZWFrOwogICAgICAgIGNhc2UgMjogcmV0ICs9IDB4MDYwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiByZXQgKz0gMHgwNzAwOyBicmVhazsKICAgIH0KICAgIC8qCiAgICAgIGluZGV4IDogMCAgICAgYWRkcyAweDAwMDAKICAgICAgaW5kZXggOiAxICAgICBhZGRzIDB4MDEwMCAoc2hpZnQpCiAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCiAgICAgIGluZGV4IDogMiAgICAgYWRkcyAweDA2MDAgKGN0cmwrYWx0KQogICAgICBpbmRleCA6IDMgICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCkKICAgICAqLwoKICAgIFRSQUNFKCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwgcmV0KTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTWFwVmlydHVhbEtleUV4IChYMTFEUlYuQCkKICovClVJTlQgQ0RFQ0wgWDExRFJWX01hcFZpcnR1YWxLZXlFeChVSU5UIHdDb2RlLCBVSU5UIHdNYXBUeXBlLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIGRvIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfSB3aGlsZSgwKQoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgc3dpdGNoKHdNYXBUeXBlKQogICAgewogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDOiAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCiAgICAgICAgY2FzZSBNQVBWS19WS19UT19WU0NfRVg6CiAgICAgICAgewogICAgICAgICAgICBpbnQga2V5YzsKCiAgICAgICAgICAgIHN3aXRjaCAod0NvZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6IHdDb2RlID0gVktfTFNISUZUOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVktfQ09OVFJPTDogd0NvZGUgPSBWS19MQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX01FTlU6IHdDb2RlID0gVktfTE1FTlU7IGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwogICAgICAgICAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgICAgICAgICAgaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkgYnJlYWs7CgogICAgICAgICAgICBpZiAoa2V5YyA+IG1heF9rZXljb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVks6IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WS19FWDoKICAgICAgICB7CiAgICAgICAgICAgIGludCBrZXljOwogICAgICAgICAgICBVSU5UIHZrZXkgPSAwOwoKICAgICAgICAgICAgLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgLyogT25seSBzdG9wIGlmIGl0J3Mgbm90IGEgbnVtcGFkIHZrZXk7IG90aGVyd2lzZSBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgbG9va2luZyBmb3IgYSBwb3RlbnRpYWwgYmV0dGVyIHZrZXkuICovCiAgICAgICAgICAgICAgICAgICAgaWYgKHZrZXkgJiYgKHZrZXkgPCBWS19OVU1QQUQwIHx8IFZLX0RJVklERSA8IHZrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh2a2V5ID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbm8gdmtleS1jb2RlLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdNYXBUeXBlID09IE1BUFZLX1ZTQ19UT19WSykKICAgICAgICAgICAgICAgIHN3aXRjaCAodmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOyBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybk1WSyAodmtleSk7CiAgICAgICAgfQoJCWNhc2UgTUFQVktfVktfVE9fQ0hBUjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWMsIGxlbjsKCQkJY2hhciBzWzEwXTsKCgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOwoJCQllLmtleWNvZGUgPSAwOwoJCQllLnR5cGUgPSBLZXlQcmVzczsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoKCQkJLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQoJCQl7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwoJCQkgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCSAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCgkJCSAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KCQkJCWlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHdDb2RlLVZLX05VTVBBRDArWEtfS1BfMCk7CgoJCQlpZiAod0NvZGU9PVZLX0RFQ0lNQUwpCgkJCSAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKCQkJaWYgKCFlLmtleWNvZGUpCgkJCXsKCQkJICBXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgd0NvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkJCSAgcmV0dXJuIDA7IC8qIHdoYXRldmVyICovCgkJCX0KCQkJVFJBQ0UoIkZvdW5kIGtleWNvZGUgJXVcbiIsZS5rZXljb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFhMb29rdXBTdHJpbmcoJmUsIHMsIHNpemVvZihzKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQ0hBUiB3Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIHMsIGxlbiwgJndjaCwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTVZLKHRvdXBwZXJXKHdjaCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwoJCQlyZXR1cm4gMDsKCQl9CgkJZGVmYXVsdDogLyogcmVzZXJ2ZWQgKi8KCQkJRklYTUUoIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwoJCQlyZXR1cm4gMDsKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleU5hbWVUZXh0IChYMTFEUlYuQCkKICovCklOVCBDREVDTCBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQV1NUUiBscEJ1ZmZlciwgSU5UIG5TaXplKQp7CiAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIGludCBrZXlpOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgogIHNjYW5Db2RlID0gbFBhcmFtID4+IDE2OwogIHNjYW5Db2RlICY9IDB4MWZmOyAgLyoga2VlcCAiZXh0ZW5kZWQta2V5IiBmbGFnIHdpdGggY29kZSAqLwoKICB2a2V5ID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeChzY2FuQ29kZSwgTUFQVktfVlNDX1RPX1ZLX0VYLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSLVNoaWZ0IGlzICJzcGVjaWFsIiAtIGl0IGlzIGFuIGV4dGVuZGVkIGtleSB3aXRoIHNlcGFyYXRlIHNjYW4gY29kZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5Db2RlIHw9IDB4MTAwOwogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgodmtleSwgTUFQVktfVktfVE9fQ0hBUiwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKICBUUkFDRSgic2NhbiAweCUwNHgsIHZrZXkgMHglMDRYLCBBTlNJIDB4JTA0eFxuIiwgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmICgoblNpemUgPj0gMikgJiYgbHBCdWZmZXIpCgl7CiAgICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyVygoV0NIQVIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIGZvciAoa2V5aT1taW5fa2V5Y29kZTsga2V5aTw9bWF4X2tleWNvZGU7IGtleWkrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5aV0pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5aSA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICBrZXljID0gKEtleUNvZGUpIGtleWk7CiAgICAgIGtleXMgPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwogICAgICBuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXMpOwogICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JXUga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgICAgICByZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIG5hbWUsIC0xLCBscEJ1ZmZlciwgblNpemUpOwogIH0KCiAgLyogRmluYWxseSBpc3N1ZSBXQVJOIGZvciB1bmtub3duIGtleXMgICAqLwoKICBXQVJOKCIoJTA4eCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDRYLCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgaWYgKGxwQnVmZmVyICYmIG5TaXplKQogICAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlRXggKFgxMURSVi5AKQogKgogKiBUaGUgVG9Vbmljb2RlIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsLWtleSBjb2RlIGFuZCBrZXlib2FyZAogKiBzdGF0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBXaW5kb3dzIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzLgogKgogKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBhIGRlYWQga2V5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiBPdGhlcndpc2UsCiAqIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogVmFsdWUJTWVhbmluZwogKiAwCVRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgaGFzIG5vIHRyYW5zbGF0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQuCiAqIDEJT25lIFdpbmRvd3MgY2hhcmFjdGVyIHdhcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KICogMglUd28gY2hhcmFjdGVycyB3ZXJlIGNvcGllZCB0byB0aGUgYnVmZmVyLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEKICogICAgICBkZWFkLWtleSBjaGFyYWN0ZXIgKGFjY2VudCBvciBkaWFjcml0aWMpIHN0b3JlZCBpbiB0aGUga2V5Ym9hcmQgbGF5b3V0IGNhbm5vdAogKiAgICAgIGJlIGNvbXBvc2VkIHdpdGggdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSB0byBmb3JtIGEgc2luZ2xlIGNoYXJhY3Rlci4KICoKICogRklYTUUgOiBzaG91bGQgZG8gdGhlIGFib3ZlIChyZXR1cm4gMiBmb3Igbm9uIG1hdGNoaW5nIGRlYWRjaGFyK2NoYXIgY29tYmluYXRpb25zKQogKgogKi8KSU5UIENERUNMIFgxMURSVl9Ub1VuaWNvZGVFeChVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIGNvbnN0IEJZVEUgKmxwS2V5U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBidWZbMTBdOwogICAgY2hhciAqbHBDaGFyID0gYnVmOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICghbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChoa2wpKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICh2aXJ0S2V5ID49IFZLX0xFRlQgJiYgdmlydEtleSA8PSBWS19ET1dOKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5IC0gVktfTEVGVCArIFhLX0xlZnQpOwoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICh2aXJ0S2V5PT1WS19TRVBBUkFUT1IpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB2aXJ0S2V5KTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0UoIkZvdW5kIGtleWNvZGUgJXVcbiIsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlICV1XG4iLAoJCWUudHlwZSwgZS53aW5kb3csIGUuc3RhdGUsIGUua2V5Y29kZSk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcsCiAgICAgKiBlLnR5cGUgd2FzIHNldCB0byBLZXlQcmVzcyBhYm92ZS4KICAgICAqLwogICAgaWYgKHhpYykKICAgIHsKICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0UoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlZCBieXRlKHMpXG4iLCByZXQpOwogICAgICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHJldCk7CiAgICAgICAgICAgIGlmIChscENoYXIgPT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CiAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGxwQ2hhciwgcmV0LCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgcmV0ID0gWExvb2t1cFN0cmluZygmZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgMHgleFxuIiwgcmV0LCBzdGF0dXMpOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICBpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vIE5hbWUiOwogICAgICAgIFRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbHggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgcmV0LCBkZWJ1Z3N0cl9hbihscENoYXIsIHJldCkpOwogICAgfQoKICAgIGlmIChyZXQgPT0gMCkKICAgIHsKCWNoYXIgZGVhZF9jaGFyOwoKI2lmZGVmIFhLX0V1cm9TaWduCiAgICAgICAgLyogQW4gdWdseSBoYWNrIGZvciBFdXJvU2lnbjogWCBjYW4ndCB0cmFuc2xhdGUgaXQgdG8gYSBjaGFyYWN0ZXIKICAgICAgICAgICBmb3Igc29tZSBsb2NhbGVzLiAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRXVyb1NpZ24pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgyMEFDOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBYIHR1cm5zIHNoaWZ0LXRhYiBpbnRvIElTT19MZWZ0X1RhYi4gKi8KICAgICAgICAvKiBIZXJlIHdlIGNoYW5nZSBpdCBiYWNrLiAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfSVNPX0xlZnRfVGFiICYmICEoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKSkKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDA5OwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQogICAgICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgJmRlYWRfY2hhciwgMSwgYnVmVywgYnVmV19zaXplKTsKCSAgICByZXQgPSAtMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgogICAgICAgIGlmIChrZXlzeW0gPj0gMHgwMTAwMDEwMCAmJiBrZXlzeW0gPD0gMHgwMTAwZmZmZikKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVuaWNvZGUgZGlyZWN0IG1hcHBpbmcgKi8KICAgICAgICAgICAgYnVmV1swXSA9IGtleXN5bSAmIDB4ZmZmZjsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGtleXN5bSA+PiA4KSA9PSAweDEwMDhGRikgewogICAgICAgICAgICBidWZXWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgllbHNlCgkgICAgewoJICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoJICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlXQVJOKCJubyBjaGFyIGZvciBrZXlzeW0gJTA0bHggKCVzKSA6XG4iLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lKTsKCQlXQVJOKCJ2aXJ0S2V5PSVYLCBzY2FuQ29kZT0lWCwga2V5Y29kZT0ldSwgc3RhdGU9JVhcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBtb3JlIGFyZWFzIHdoZXJlIFggcmV0dXJucyBjaGFyYWN0ZXJzIGJ1dCBXaW5kb3dzIGRvZXMgbm90CiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sICovCiAgICAgICAgaWYgKGUuc3RhdGUgJiBDb250cm9sTWFzaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGtleXN5bT49MzMpICYmIChrZXlzeW0gPCAnQScpKSB8fAogICAgICAgICAgICAgICAgKChrZXlzeW0gPiAnWicpICYmIChrZXlzeW0gPCAnYScpKSB8fAogICAgICAgICAgICAgICAgKGtleXN5bSA9PSBYS19UYWIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApIC8qIENvbnRyb2wgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfUmV0dXJuIHx8IGtleXN5bSA9PSBYS19LUF9FbnRlcikpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAnXG4nOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgIH0KCiAgICAgICAgLyogSGFjayB0byBkZXRlY3QgYW4gWExvb2t1cFN0cmluZyBoYXJkLWNvZGVkIHRvIExhdGluMSAqLwogICAgICAgIGlmIChyZXQgPT0gMSAmJiBrZXlzeW0gPj0gMHgwMGEwICYmIGtleXN5bSA8PSAweDAwZmYgJiYgKEJZVEUpbHBDaGFyWzBdID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAoQllURSlscENoYXJbMF07CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCB0byB1bmljb2RlXG4iLCAqKEJZVEUgKilscENoYXIpOwoJICAgIHJldCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBscENoYXIsIHJldCwgYnVmVywgYnVmV19zaXplKTsKCX0KICAgIH0KCmZvdW5kOgogICAgaWYgKGJ1ZiAhPSBscENoYXIpCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBDaGFyKTsKICAgIFRSQUNFXyhrZXkpKCJyZXR1cm5pbmcgJWQgd2l0aCAlc1xuIiwgcmV0LCBkZWJ1Z3N0cl93bihidWZXLCByZXQpKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQmVlcCAoWDExRFJWLkApCiAqLwp2b2lkIENERUNMIFgxMURSVl9CZWVwKHZvaWQpCnsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWEJlbGwoZ2RpX2Rpc3BsYXksIDApOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQo=