LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7CgovKiBrZXkgc3RhdGUgdGFibGUgYml0czoKICAweDgwIC0+IGtleSBpcyBwcmVzc2VkCiAgMHg0MCAtPiBrZXkgZ290IHByZXNzZWQgc2luY2UgbGFzdCB0aW1lCiAgMHgwMSAtPiBrZXkgaXMgdG9nZ2xlZAoqLwpCWVRFIGtleV9zdGF0ZV90YWJsZVsyNTZdOwoKc3RhdGljIEJZVEUgVHJhY2tTeXNLZXkgPSAwOyAvKiBkZXRlcm1pbmUgd2hldGhlciBBTFQga2V5IHVwIHdpbGwgY2F1c2UgYSBXTV9TWVNLRVlVUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgV01fS0VZVVAgbWVzc2FnZSAqLwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIFNjcm9sbExvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewogLyogMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgIF4gICAgXCAqLwogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDdkLAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBAICAgIFsgKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgIDogICAgXSAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg3MyAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fMywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV83LFZLX09FTV81LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzMsVktfT0VNXzQsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV9QTFVTLFZLX09FTV8xLFZLX09FTV82LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LCdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fUExVUywKICAgJ0EnLCdaJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnUScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJywnTScsVktfT0VNXzMsVktfT0VNXzUsCiAgICdXJywnWCcsJ0MnLCdWJywnQicsJ04nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX09FTV83LFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELCdQJywnWScsJ0YnLCdHJywnQycsJ1InLCdMJyxWS19PRU1fMixWS19PRU1fUExVUywKICAgJ0EnLCdPJywnRScsJ1UnLCdJJywnRCcsJ0gnLCdUJywnTicsJ1MnLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsJ1EnLCdKJywnSycsJ1gnLCdCJywnTScsJ1cnLCdWJywnWicsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSBXSU5FREVCVUc9K2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMiIsIlwiMyIsIic0IiwiKDUiLCItNiIsIug3IiwiXzgiLCLnOSIsIuAwIiwiKbAiLCI9KyIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjIiwKICJxUSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKiBBbGwgZ2VybWFuIGtleWIgbGF5b3V0IHRhYmxlcyBoYXZlIHRoZSBhY3V0ZS9hcG9zdHJvcGhlIHN5bWJvbCBuZXh0IHRvCiAqIHRoZSBCQUNLU1BBQ0Uga2V5IHJlbW92ZWQgKHJlcGxhY2VkIHdpdGggTlVMTCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZQogKiBkZXRlY3Rpb24gY29kZSkuCiAqIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgbWFwcGluZyBvZiB0aGUgYWN1dGUgKGFuZCBhcG9zdHJvcGhlKSBpcyBkb25lCiAqIGRpZmZlcmVudGx5IGluIHZhcmlvdXMgeGtiLWRhdGEveGtleWJvYXJkLWNvbmZpZyB2ZXJzaW9ucy4gU29tZSByZXBsYWNlCiAqIHRoZSBhY3V0ZSB3aXRoIGEgbm9ybWFsIGFwb3N0cm9waGUsIHNvIHRoYXQgdGhlIGFwb3N0cm9waGUgaXMgZm91bmQgdHdpY2UKICogb24gdGhlIGtleWJvYXJkIChvbmUgbmV4dCB0byBCQUNLU1BBQ0UgYW5kIG9uZSBuZXh0IHRvIEVOVEVSKS4KICogT3RoZXJzIHB1dCB0aGUgYWN1dGUgYW5kIGdyYXZlIGFjY2VudHMgb24gdGhlIGtleSBsZWZ0IG9mIEJBQ0tTUEFDRS4KICogTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmQubyBidWd0cmFja2VyOgogKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUxNAogKi8KCi8qKiogR2VybWFuIExvZ2l0ZWNoIERlc2t0b3AgUHJvIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9sb2dpdGVjaFtNQUlOX0xFTl1bNF0gPQp7CiAiXlx4YjAiLCIxISIsIjJcIiIsIjNceGE3IiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiXHhkZj9cXCIsIlwwYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiXHhmY1x4ZGMiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4ZjZceGQ2IiwiXHhlNFx4YzQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCLfPyIsIlwwYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSciLCIyXCIiLCIzKyIsIjQhIiwiNSUiLCI2LyIsIjc9IiwiOCgiLCI5KSIsIvbWIiwi/NwiLCLz0yIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL11SIsIvraIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLpySIsIuHBIiwi+9siLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICLtzSIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogIqm5IiwiqroiLCLF5SIsItLyIiwi1PQiLCLa+iIsItX1IiwiyekiLCLP7yIsItDwIiwi2/siLCJbXSIsCiAiweEiLCLT8yIsIsTkIiwixuYiLCLH5yIsIsjoIiwiqLgiLCLL6yIsIszsIiwi3v4iLCKruyIsIi1fIiwKICKhsSIsIq+/Iiwiw+MiLCLX9yIsIsLiIiwizu4iLCLN7SIsIiw7IiwiLjoiLCLW9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAyXCIiLCIzIyIsIjQkIiwiNSUiLCI2XjYmIiwiNyY3LyIsIjgqOCgiLCI5KDkpIiwiMCkwPSIsIi1fJz8iLCI9KysqIiwKICJxUam5Iiwid1equiIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2voiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl19W10iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKqLgiLCJrS8vrIiwibEzM7CIsIjs63v4iLCInXCKruyIsIlxcfC1fIiwKICJ6WqGxIiwieFivvyIsImNDw+MiLCJ2Vtf3IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwsOyIsIi4+LjoiLCIvP9b2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHIpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9tYWNqcFtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIl9fIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+IiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBSYXVsIEdvbWVzIEZlcm5hbmRlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2qCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0YCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIn5eIiwiXX0iLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCB3aXRoIDxBTFQgR1I+IChjb250cmlidXRlZCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyX2FsdF9ncltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSE5IiwiMkAyIiwiMyMzIiwiNCQjIiwiNSVcIiIsIjYoLCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiNGAiLCJbeyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsImdHIiwifl4iLCJdfToiLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8wIgp9OwoKLyoqKiBVUyBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR3VzdGF2byBOb3JvbmhhIChrb3ZAZGViaWFuLm9yZykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2ludGxbTUFJTl9MRU5dWzRdID0KewogICJgfiIsICIxISIsICIyQCIsICIzIyIsICI0JCIsICI1JSIsICI2XiIsICI3JiIsICI4KiIsICI5KCIsICIwKSIsICItXyIsICI9KyIsICJcXHwiLAogICJxUSIsICJ3VyIsICJlRSIsICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICJbeyIsICJdfSIsCiAgImFBIiwgInNTIiwgImREIiwgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIjs6IiwgIidcIiIsCiAgInpaIiwgInhYIiwgImNDIiwgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw8IiwgIi4+IiwgIi8/Igp9OwoKLyoqKiBTbG92YWsga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oc2tfcXdlcnR5KSBpbiB4a2JzZWwpCiAgLSBkZWFkX2Fib3ZlcmluZyByZXBsYWNlZCB3aXRoIGRlZ3JlZSAtIG5vIHN5bWJvbCBpbiBpc284ODU5LTIKICAtIGJyb2tlbmJhciByZXBsYWNlZCB3aXRoIGJhcgkJCQkJKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tbTUFJTl9MRU5dWzRdID0KewogIjswIiwiKzEiLCK1MiIsIrkzIiwi6DQiLCK7NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIid2IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwi5CgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvRcIiIsIqchIiwi8ikiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3opICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3pfcXdlcnR5KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWl9xd2VydHlbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIr+hIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIExpdGh1YW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiqqwiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSW01BSU5fTEVOXVs0XSA9CnsKIlwiXFwiLCIxISIsIjInIiwiM14iLCI0KyIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIio/IiwiLV8iLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJceGI5SSIsIm9PIiwicFAiLCJceGJiXHhhYiIsIvzcIiwKImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4YmFceGFhIiwiaVwwIiwiLDsiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiLAoiPD4iCn07CgovKioqIFR1cmtpc2ggRiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cmYpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSX0ZbTUFJTl9MRU5dWzRdID0KewoiKyoiLCIxISIsIjJcIiIsIjNeIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjA9IiwiLz8iLCItXyIsCiJmRiIsImdHIiwiXHhiYlx4YWIiLCJceGI5SSIsIm9PIiwiZEQiLCJyUiIsIm5OIiwiaEgiLCJwUCIsInFRIiwid1ciLAoidVUiLCJpXDAiLCJlRSIsImFBIiwi/NwiLCJ0VCIsImtLIiwibU0iLCJsTCIsInlZIiwiXHhiYVx4YWEiLCJ4WCIsCiJqSiIsIvbWIiwidlYiLCJjQyIsIufHIiwieloiLCJzUyIsImJCIiwiLjoiLCIsOyIsCiI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH47IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUS8iLCJ3VyciLCJlRfciLCJyUvgiLCJ0VOAiLCJ5WegiLCJ1VeUiLCJpSe8iLCJvT+0iLCJwUPQiLCJbeyIsIl19IiwKICJhQfkiLCJzU+MiLCJkROIiLCJmRusiLCJnR/IiLCJoSOkiLCJqSuciLCJrS+wiLCJsTOoiLCI7OvMiLCJcJ1wiLCIsIlxcfCIsCiAielrmIiwieFjxIiwiY0PhIiwidlbkIiwiYkLwIiwibk7uIiwibU32IiwiLDz6IiwiLj71IiwiLz8uIiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsX3Bob25ldGljKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX5SIsImVF4CIsInJS+CIsInRU+iIsInlZ8iIsInVV5SIsImlJ6SIsIm9P8SIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT+SIsImRE4yIsImZG9CIsImdH4iIsImhI5CIsImpK6SIsImtL6yIsImxM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VuUiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCAtc3ltYm9scyAidXMocGMxMDUpK2lsX3NhaGFyb24iKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9zYWhhcm9uW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1fxIiwiZUUiLCJyUvgiLCJ0VOgiLCJ5WeMiLCJ1VSIsImlJIiwib08iLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU+UiLCJkROwiLCJmRvoiLCJnR+IiLCJoSOQiLCJqSvkiLCJrS+siLCJsTOkiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlbyIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogR3JlZWsga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBLcml0b24gS3lyaW1pcyA8a3lyaW1pc0BjdGkuZ3I+KQogIEdyZWVrIGNoYXJhY3RlcnMgZm9yICJ3VyIgYW5kICJzUyIgYXJlIG9taXR0ZWQgdG8gbm90IHByb2R1Y2UgYSBtaXNtYXRjaAogIG1lc3NhZ2Ugc2luY2UgdGhleSBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIGluIGdyIGFuZCBlbCBYRnJlZTg2IGxheW91dHMuICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVE7OiIsIndXIiwiZUXlxSIsInJS8dEiLCJ0VPTUIiwieVn11SIsInVV6MgiLCJpSenJIiwib0/vzyIsInBQ8NAiLCJbeyIsIl19IiwKICJhQeHBIiwic1MiLCJkROTEIiwiZkb21iIsImdH48MiLCJoSOfHIiwiakruziIsImtL6soiLCJsTOvLIiwiOzq0qCIsIidcIiIsIlxcfCIsCiAielrmxiIsInhY99ciLCJjQ/jYIiwidlb52SIsImJC4sIiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIFRoYWkgKEtlZG1hbmVlKSBrZXlib2FyZCBsYXlvdXQgYnkgU3VwcGhhY2hva2UgU3VudGl3aWNoYXlhIDxtcmNob2tlQG9wZW50bGUub3JnPiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV90aFtNQUlOX0xFTl1bNF0gPQp7CiAiYH5fJSIsIjEh5SsiLCIyQC/xIiwiMyMt8iIsIjQkwPMiLCI1Jbb0IiwiNl7Y2SIsIjcm1t8iLCI4KqT1IiwiOSi19iIsIjApqPciLCItX6L4IiwiPSuq+SIsCiAicVHm8CIsIndX5FwiIiwiZUXTriIsInJSvrEiLCJ0VNC4IiwieVnR7SIsInVV1eoiLCJpScOzIiwib0+5zyIsInBQwq0iLCJbe7qwIiwiXX3FLCIsCiAiYUG/xCIsInNTy6YiLCJkRKGvIiwiZka04iIsImdH4KwiLCJoSOnnIiwiakro6yIsImtL0skiLCJsTMrIIiwiOzrHqyIsIlwnXCKnLiIsIlxcfKOlIiwKICJ6WrwoIiwieFi7KSIsImND4akiLCJ2Vs3OIiwiYkLaIiwibk7X7CIsIm1Ntz8iLCIsPMGyIiwiLj7jzCIsIi8/vcYiCn07IAoKLyoqKiBWTkMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fdm5jW01BSU5fTEVOXSA9CnsKICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgxQSwweDFCLDB4MjcsMHgyOCwweDI5LDB4MzMsMHgzNCwweDM1LDB4MkIsCiAgIDB4MUUsMHgzMCwweDJFLDB4MjAsMHgxMiwweDIxLDB4MjIsMHgyMywweDE3LDB4MjQsMHgyNSwweDI2LDB4MzIsMHgzMSwweDE4LDB4MTksMHgxMCwweDEzLDB4MUYsMHgxNCwweDE2LDB4MkYsMHgxMSwweDJELDB4MTUsMHgyQywKICAgMHg1Ngp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV92bmNbTUFJTl9MRU5dID0KewogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV80LFZLX09FTV82LFZLX09FTV8xLFZLX09FTV83LFZLX09FTV8zLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV81LAogICAnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnLCdJJywnSicsJ0snLCdMJywnTScsJ04nLCdPJywnUCcsJ1EnLCdSJywnUycsJ1QnLCdVJywnVicsJ1cnLCdYJywnWScsJ1onLAogICBWS19PRU1fMTAyCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV92bmNbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsIlt7IiwiXX0iLCI7OiIsIidcIiIsImB+IiwiLDwiLCIuPiIsIi8/IiwiXFx8IiwKICJhQSIsImJCIiwiY0MiLCJkRCIsImVFIiwiZkYiLCJnRyIsImhIIiwiaUkiLCJqSiIsImtLIiwibEwiLCJtTSIsIm5OIiwib08iLCJwUCIsInFRIiwiclIiLCJzUyIsInRUIiwidVUiLCJ2ViIsIndXIiwieFgiLCJ5WSIsInpaIgp9OwoKLyoqKiBEdXRjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBubCkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OTFtNQUlOX0xFTl1bNF0gPQp7CiAiQKciLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiN18iLCI4KCIsIjkpIiwiMCciLCIvPyIsIrB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIqh+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X0RFX25vZGVhZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgZm9yIGxvZ2l0ZWNoIGRlc2t0b3AgcHJvIiwgJm1haW5fa2V5X0RFX2xvZ2l0ZWNoLCAgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDgwNywgIlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDEwMGMsICJTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFkLCAiU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0UsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyfSwKIHsweDA0MjUsICJFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTQsICJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05PLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA2LCAiRGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYywgIkZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRlIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoQ0FfZnIpIiwgJm1haW5fa2V5X0NBX2ZyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODBjLCAiQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDA4MTYsICJQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BUX2JyLCAmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IEFMVCBHUiIsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MGIsICJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX2JkcywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjMsICJCZWxhcnVzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CWSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1JVX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEiLCAmbWFpbl9rZXlfUlVfY3AxMjUxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlVfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9VQV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1JVX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEwLCAiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGYsICJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBlLCAiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxNSwgIlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjQsICJTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgc3IiLCAmbWFpbl9rZXlfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHVzLHNyIiwgJm1haW5fa2V5X1VTX1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNwZWNpZmljKSIsICZtYWluX2tleV9IUl9qZWxseSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMSwgIkphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfanAxMDYsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNiwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2fSwKIHsweDA0MTEsICJKYXBhbmVzZSBNYWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX21hY2pwLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanAsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcH0sCiB7MHgwNDExLCAiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjeiIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjel9xd2VydHkiLCAmbWFpbl9rZXlfQ1pfcXdlcnR5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI3LCAiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIiLCAmbWFpbl9rZXlfVFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0cmYiLCAmbWFpbl9rZXlfVFJfRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3NhaGFyb24sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJWTkMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3ZuYywgJm1haW5fa2V5X3NjYW5fdm5jLCAmbWFpbl9rZXlfdmtleV92bmN9LAogezB4MDQwOCwgIkdyZWVrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZSwgIlRoYWkgKEtlZG1hbmVlKSAga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3RoLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEzLCAiRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05MLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgogezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAwLCAwLCBWS19FU0NBUEUsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDAsIFZLX0hBTkdVTCwgMCwgMCwgVktfSEFOSkEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjUwICovCiAgICBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsMCwwLCBWS19BUFBTLCAvKiBGRjYwICovCiAgICAwLCBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgVktfRU5ELCBWS19DTEVBUiwgVktfSU5TRVJULCBWS19ERUxFVEUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgVktfT0VNX05FQ19FUVVBTCwgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgVktfRjE3LCBWS19GMTgsIC8qIEZGQzggKi8KICAgIFZLX0YxOSwgVktfRjIwLCBWS19GMjEsIFZLX0YyMiwgVktfRjIzLCBWS19GMjQsIDAsIDAsICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX0xTSElGVCwgVktfUlNISUZULCBWS19MQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX1JDT05UUk9MLCBWS19DQVBJVEFMLCAwLCBWS19NRU5VLAogICAgVktfTUVOVSwgVktfTE1FTlUsIFZLX1JNRU5VLCBWS19MV0lOLCBWS19SV0lOLCAwLCAwLCAwLCAgICAgLyogRkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfc2NhblsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICAweDBFLCAweDBGLCAweDAwLCAvKj8qLyAwLCAweDAwLCAweDFDLCAweDAwLCAweDAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICAweDE0NywgMHgxNEIsIDB4MTQ4LCAweDE0RCwgMHgxNTAsIDB4MTQ5LCAweDE1MSwgMHgxNEYsICAgICAgLyogRkY1MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgLyo/Ki8gMCwgMHgxMzcsIC8qPyovIDAsIDB4MTUyLCAweDAwLCAweDAwLCAweDAwLCAweDE1RCwgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzgsIDB4MTQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiBGRjY4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQ1LCAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDcsIDB4NEIsIDB4NDgsICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICAweDRELCAweDUwLCAweDQ5LCAweDUxLCAweDRGLCAweDRDLCAweDUyLCAweDUzLCAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MzcsIDB4NEUsIDB4NTMsIDB4NEEsIDB4NTMsIDB4MTM1LCAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICAweDUyLCAweDRGLCAweDUwLCAweDUxLCAweDRCLCAweDRDLCAweDRELCAweDQ3LCAgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgMHg0OCwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIDB4M0IsIDB4M0MsCiAgICAweDNELCAweDNFLCAweDNGLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAgICAgICAgICAgICAgLyogRkZDMCAqLwogICAgMHg1NywgMHg1OCwgMHg1QiwgMHg1QywgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGQzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMHgwMCwgMHgyQSwgMHgxMzYsIDB4MUQsIDB4MTFELCAweDNBLCAweDAwLCAweDM4LCAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIDB4MTM4LCAweDM4LCAweDEzOCwgMHgxNWIsIDB4MTVjLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAvKiBGRkU4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNTMgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIHhmcmVlODZfdmVuZG9yX2tleV92a2V5WzI1Nl0gPQp7CiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYwMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDggKi8KICAgIDAsIFZLX1ZPTFVNRV9ET1dOLCBWS19WT0xVTUVfTVVURSwgVktfVk9MVU1FX1VQLCAgICAgICAgICAgIC8qIDEwMDhGRjEwICovCiAgICBWS19NRURJQV9QTEFZX1BBVVNFLCBWS19NRURJQV9TVE9QLAogICAgVktfTUVESUFfUFJFVl9UUkFDSywgVktfTUVESUFfTkVYVF9UUkFDSywKICAgIDAsIFZLX0xBVU5DSF9NQUlMLCAwLCBWS19CUk9XU0VSX1NFQVJDSCwgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjE4ICovCiAgICAwLCAwLCAwLCBWS19CUk9XU0VSX0hPTUUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCBWS19CUk9XU0VSX0JBQ0ssIFZLX0JST1dTRVJfRk9SV0FSRCwgICAgICAvKiAxMDA4RkYyMCAqLwogICAgVktfQlJPV1NFUl9TVE9QLCBWS19CUk9XU0VSX1JFRlJFU0gsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgLyogMTAwOEZGMjggKi8KICAgIFZLX0JST1dTRVJfRkFWT1JJVEVTLCAwLCBWS19MQVVOQ0hfTUVESUFfU0VMRUNULCAwLCAgICAgICAgIC8qIDEwMDhGRjMwICovCiAgICAwLCAwLCAwLCAwLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY2MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjcwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY5MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkEwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkI4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZDMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjggKi8KfTsKCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCi8qIHgxMSBsb2NrIG11c3QgYmUgaGVsZCAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYSUMgeGljLCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgU3RhdHVzIHN0YXR1czsKICAgIGNoYXIgYnVmWzI0XTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBlLT50eXBlID09IEtleVByZXNzKQogICAgICAgIFhtYkxvb2t1cFN0cmluZyh4aWMsIGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIFhMb29rdXBTdHJpbmcoZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgIChrZXlzeW0gPT0gWEtfS1BfU2VwYXJhdG9yIHx8IGtleXN5bSA9PSBYS19LUF9EZWNpbWFsIHx8CiAgICAgICAgIChrZXlzeW0gPj0gWEtfS1BfMCAmJiBrZXlzeW0gPD0gWEtfS1BfOSkpKQogICAgICAgIC8qIE9ubHkgdGhlIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBzZW5kIGRpZmZlcmVudCBrZXlzeW1zCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCiAgICAgICAgcmV0dXJuIG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhGRl07CgogICAgLyogUHJlc3NpbmcgdGhlIFBhdXNlL0JyZWFrIGtleSBhbG9uZSBwcm9kdWNlcyBWS19QQVVTRSB2a2V5LCB3aGlsZQogICAgICogcHJlc3NpbmcgQ3RybCtQYXVzZS9CcmVhayBwcm9kdWNlcyBWS19DQU5DRUwuICovCiAgICBpZiAoKGUtPnN0YXRlICYgQ29udHJvbE1hc2spICYmIChrZXlzeW0gPT0gWEtfQnJlYWspKQogICAgICAgIHJldHVybiBWS19DQU5DRUw7CgogICAgVFJBQ0VfKGtleSkoImUtPmtleWNvZGUgPSAleFxuIiwgZS0+a2V5Y29kZSk7CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnZvaWQgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIFdPUkQgd1ZrLCBXT1JEIHdTY2FuLCBEV09SRCBldmVudF9mbGFncywgRFdPUkQgdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdFeHRyYUluZm8sIFVJTlQgaW5qZWN0ZWRfZmxhZ3MgKQp7CiAgICBVSU5UIG1lc3NhZ2U7CiAgICBLQkRMTEhPT0tTVFJVQ1QgaG9vazsKICAgIFdPUkQgZmxhZ3MsIHdWa1N0cmlwcGVkLCB3VmtMLCB3VmtSLCB2a19ob29rID0gd1ZrOwogICAgTFBBUkFNIGxQYXJhbSA9IDA7CgogICAgd1ZrID0gTE9CWVRFKHdWayk7CiAgICBmbGFncyA9IExPQllURSh3U2Nhbik7CgogICAgaWYgKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSBmbGFncyB8PSBLRl9FWFRFTkRFRDsKICAgIC8qIEZJWE1FOiBzZXQgS0ZfRExHTU9ERSBhbmQgS0ZfTUVOVU1PREUgd2hlbiBuZWVkZWQgKi8KCiAgICAvKiBzdHJpcCBsZWZ0L3JpZ2h0IGZvciBtZW51LCBjb250cm9sLCBzaGlmdCAqLwogICAgc3dpdGNoICh3VmspCiAgICB7CiAgICBjYXNlIFZLX01FTlU6CiAgICBjYXNlIFZLX0xNRU5VOgogICAgY2FzZSBWS19STUVOVToKICAgICAgICB3VmsgPSAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpID8gVktfUk1FTlUgOiBWS19MTUVOVTsKICAgICAgICB3VmtTdHJpcHBlZCA9IFZLX01FTlU7CiAgICAgICAgd1ZrTCA9IFZLX0xNRU5VOwogICAgICAgIHdWa1IgPSBWS19STUVOVTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVktfQ09OVFJPTDoKICAgIGNhc2UgVktfTENPTlRST0w6CiAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgIHdWayA9IChldmVudF9mbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgPyBWS19SQ09OVFJPTCA6IFZLX0xDT05UUk9MOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfQ09OVFJPTDsKICAgICAgICB3VmtMID0gVktfTENPTlRST0w7CiAgICAgICAgd1ZrUiA9IFZLX1JDT05UUk9MOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWS19TSElGVDoKICAgIGNhc2UgVktfTFNISUZUOgogICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgd1ZrID0gKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSA/IFZLX1JTSElGVCA6IFZLX0xTSElGVDsKICAgICAgICB3VmtTdHJpcHBlZCA9IFZLX1NISUZUOwogICAgICAgIHdWa0wgPSBWS19MU0hJRlQ7CiAgICAgICAgd1ZrUiA9IFZLX1JTSElGVDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgd1ZrU3RyaXBwZWQgPSB3VmtMID0gd1ZrUiA9IHdWazsKICAgIH0KCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfS0VZVVApCiAgICB7CiAgICAgICAgbWVzc2FnZSA9IFdNX0tFWVVQOwogICAgICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODApICYmCiAgICAgICAgICAgICAoKHdWa1N0cmlwcGVkID09IFZLX01FTlUpIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKQogICAgICAgICAgICAgIHx8ICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkpKQogICAgICAgICAgICB8fCAod1ZrU3RyaXBwZWQgPT0gVktfRjEwKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCBUcmFja1N5c0tleSA9PSBWS19NRU5VIHx8IC8qIDxBTFQ+LWRvd24vPEFMVD4tdXAgc2VxdWVuY2UgKi8KICAgICAgICAgICAgICAgICh3VmtTdHJpcHBlZCAhPSBWS19NRU5VKSkgLyogPEFMVD4tZG93bi4uLjxzb21ldGhpbmcgZWxzZT4tdXAgKi8KICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBXTV9TWVNLRVlVUDsKICAgICAgICAgICAgVHJhY2tTeXNLZXkgPSAwOwogICAgICAgIH0KICAgICAgICBmbGFncyB8PSBLRl9SRVBFQVQgfCBLRl9VUDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZRE9XTjsKICAgICAgICBpZiAoKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwIHx8IHdWa1N0cmlwcGVkID09IFZLX01FTlUpICYmCiAgICAgICAgICAgICAhKGtleV9zdGF0ZV90YWJsZVtWS19DT05UUk9MXSAmIDB4ODAgfHwgd1ZrU3RyaXBwZWQgPT0gVktfQ09OVFJPTCkpIHx8CiAgICAgICAgICAgICh3VmtTdHJpcHBlZCA9PSBWS19GMTApKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWURPV047CiAgICAgICAgICAgIFRyYWNrU3lzS2V5ID0gd1ZrU3RyaXBwZWQ7CiAgICAgICAgfQogICAgICAgIGlmICghKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX1VOSUNPREUpICYmIGtleV9zdGF0ZV90YWJsZVt3VmtdICYgMHg4MCkgZmxhZ3MgfD0gS0ZfUkVQRUFUOwogICAgfQoKICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9VTklDT0RFKQogICAgewogICAgICAgIHZrX2hvb2sgPSB3VmsgPSBWS19QQUNLRVQ7CiAgICAgICAgbFBhcmFtID0gTUFLRUxQQVJBTSgxIC8qIHJlcGVhdCBjb3VudCAqLywgd1NjYW4pOwogICAgICAgIFRSQUNFXyhrZXkpKCIgbWVzc2FnZT0weCUwNHggd1BhcmFtPTB4JTA0eCBsUGFyYW09MHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB3VmssIGxQYXJhbSk7CiAgICB9CgogICAgLyogSG9vayBnZXRzIHdoYXRldmVyIGtleSB3YXMgc2VudC4gKi8KICAgIGhvb2sudmtDb2RlICAgICAgPSB2a19ob29rOwogICAgaG9vay5zY2FuQ29kZSAgICA9IHdTY2FuOwogICAgaG9vay5mbGFncyAgICAgICA9IChmbGFncyA+PiA4KSB8IGluamVjdGVkX2ZsYWdzOwogICAgaG9vay50aW1lICAgICAgICA9IHRpbWU7CiAgICBob29rLmR3RXh0cmFJbmZvID0gZHdFeHRyYUluZm87CiAgICBpZiAoSE9PS19DYWxsSG9va3MoIFdIX0tFWUJPQVJEX0xMLCBIQ19BQ1RJT04sIG1lc3NhZ2UsIChMUEFSQU0pJmhvb2ssIFRSVUUgKSkgcmV0dXJuOwoKICAgIGlmICghKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX1VOSUNPREUpKQogICAgewogICAgICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9LRVlVUCkKICAgICAgICB7CiAgICAgICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdICY9IH4weDgwOwogICAgICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrU3RyaXBwZWRdID0ga2V5X3N0YXRlX3RhYmxlW3dWa0xdIHwga2V5X3N0YXRlX3RhYmxlW3dWa1JdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbd1ZrXSAmIDB4ODApKSBrZXlfc3RhdGVfdGFibGVbd1ZrXSBePSAweDAxOwogICAgICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrXSB8PSAweGMwOwogICAgICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrU3RyaXBwZWRdID0ga2V5X3N0YXRlX3RhYmxlW3dWa0xdIHwga2V5X3N0YXRlX3RhYmxlW3dWa1JdOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODApIGZsYWdzIHw9IEtGX0FMVERPV047CgogICAgICAgIGlmICh3VmtTdHJpcHBlZCA9PSBWS19TSElGVCkgZmxhZ3MgJj0gfktGX0VYVEVOREVEOwoKICAgICAgICBsUGFyYW0gPSBNQUtFTFBBUkFNKDEgLyogcmVwZWF0IGNvdW50ICovLCBmbGFncyk7CgogICAgICAgIFRSQUNFXyhrZXkpKCIgbWVzc2FnZT0weCUwNHggd1BhcmFtPTB4JTA0eCwgbFBhcmFtPTB4JTA4bHgsIElucHV0S2V5U3RhdGU9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCB3VmssIGxQYXJhbSwga2V5X3N0YXRlX3RhYmxlW3dWa10pOwogICAgfQoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHNlbmRfaGFyZHdhcmVfbWVzc2FnZSApCiAgICB7CiAgICAgICAgcmVxLT5pZCAgICAgICA9IChpbmplY3RlZF9mbGFncyAmIExMS0hGX0lOSkVDVEVEKSA/IDAgOiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKICAgICAgICByZXEtPndpbiAgICAgID0gMDsKICAgICAgICByZXEtPm1zZyAgICAgID0gbWVzc2FnZTsKICAgICAgICByZXEtPndwYXJhbSAgID0gd1ZrOwogICAgICAgIHJlcS0+bHBhcmFtICAgPSBsUGFyYW07CiAgICAgICAgcmVxLT54ICAgICAgICA9IGN1cnNvcl9wb3MueDsKICAgICAgICByZXEtPnkgICAgICAgID0gY3Vyc29yX3Bvcy55OwogICAgICAgIHJlcS0+dGltZSAgICAgPSB0aW1lOwogICAgICAgIHJlcS0+aW5mbyAgICAgPSBkd0V4dHJhSW5mbzsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZQogKgogKiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGZvciA8dmtleT4sIGRlcGVuZGluZyBvbiBrZXkgPHN0YXRlPiB1bmRlciBYCiAqCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IHN0YXRlLCBEV09SRCB0aW1lICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVt2a2V5ICYgMHhmZl0gJiAweDgwKSE9MCkgIT0gc3RhdGUpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSB2a2V5ICYgMHgxMDAgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwOwoKICAgICAgICBpZiAoIXN0YXRlKSBmbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CgogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwKICAgICAgICAgICAgICB2a2V5LCBrZXlfc3RhdGVfdGFibGVbdmtleSAmIDB4ZmZdKTsKCiAgICAgICAgLyogRmFrZSBrZXkgYmVpbmcgcHJlc3NlZCBpbnNpZGUgd2luZSAqLwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgc2NhbiAmIDB4ZmYsIGZsYWdzLCB0aW1lLCAwLCAwICk7CgogICAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciAlIy4yeFxuIiwga2V5X3N0YXRlX3RhYmxlW3ZrZXkgJiAweGZmXSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleW1hcE5vdGlmeQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KSB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuCiAqLwp2b2lkIFgxMURSVl9LZXltYXBOb3RpZnkoIEhXTkQgaHduZCwgWEV2ZW50ICpldmVudCApCnsKICAgIGludCBpLCBqOwogICAgRFdPUkQgdGltZSA9IEdldEN1cnJlbnRUaW1lKCk7CgogICAgLyogdGhlIG1pbmltdW0ga2V5Y29kZSBpcyBhbHdheXMgZ3JlYXRlciBvciBlcXVhbCB0byA4LCBzbyB3ZSBjYW4KICAgICAqIHNraXAgdGhlIGZpcnN0IDggdmFsdWVzLCBoZW5jZSBzdGFydCBhdCAxCiAgICAgKi8KICAgIGZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKQogICAgewogICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBXT1JEIHZrZXkgPSBrZXljMnZrZXlbKGkgKiA4KSArIGpdOwogICAgICAgICAgICBXT1JEIHNjYW4gPSBrZXljMnNjYW5bKGkgKiA4KSArIGpdOwogICAgICAgICAgICBpbnQgc3RhdGUgPSAoZXZlbnQtPnhrZXltYXAua2V5X3ZlY3RvcltpXSAmICgxPDxqKSkgIT0gMDsKCiAgICAgICAgICAgIHN3aXRjaCh2a2V5ICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggdmtleSwgc2Nhbiwgc3RhdGUsIHRpbWUgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfbG9ja19zdGF0ZShCWVRFIHZrZXksIFdPUkQgc2NhbiwgRFdPUkQgdGltZSkKewogICAgRFdPUkQgZmxhZ3MgPSB2a2V5ID09IFZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwOwoKICAgIGlmIChrZXlfc3RhdGVfdGFibGVbdmtleV0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CgogICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGZsYWdzLCB0aW1lLCAwLCAwICk7CiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUsIDAsIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhFdmVudCAqeGV2ICkKewogICAgWEtleUV2ZW50ICpldmVudCA9ICZ4ZXYtPnhrZXk7CiAgICBjaGFyIGJ1ZlsyNF07CiAgICBjaGFyICpTdHIgPSBidWY7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBldmVudC0+dHlwZSA9PSBLZXlQcmVzcykKICAgIHsKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICBUUkFDRSgiWG1iTG9va3VwU3RyaW5nIG5lZWRzICVpIGJ5dGUocylcbiIsIGFzY2lpX2NoYXJzKTsKICAgICAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICB7CiAgICAgICAgICAgIFN0ciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBhc2NpaV9jaGFycyk7CiAgICAgICAgICAgIGlmIChTdHIgPT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CiAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIFN0ciwgYXNjaWlfY2hhcnMsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWExvb2t1cENoYXJzKQogICAgewogICAgICAgIFgxMURSVl9YSU1Mb29rdXBDaGFycyggU3RyLCBhc2NpaV9jaGFycyApOwogICAgICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBTdHIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBJZiBYS0IgZXh0ZW5zaW9ucyBhcmUgdXNlZCwgdGhlIHN0YXRlIG1hc2sgZm9yIEFsdEdyIHdpbGwgdXNlIHRoZSBncm91cAogICAgICAgaW5kZXggaW5zdGVhZCBvZiB0aGUgbW9kaWZpZXIgbWFzay4gVGhlIGdyb3VwIGluZGV4IGlzIHNldCBpbiBiaXRzCiAgICAgICAxMy0xNCBvZiB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIFhLZXlFdmVudCBzdHJ1Y3R1cmUuIFNvIGlmIEFsdEdyIGlzCiAgICAgICBwcmVzc2VkLCBsb29rIGlmIHRoZSBncm91cCBpbmRleCBpcyBkaWZmZXJlbnQgdGhhbiAwLiBGcm9tIFhLQgogICAgICAgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb24sIHRoZSBncm91cCBpbmRleCBmb3IgQWx0R3Igc2hvdWxkIGJlIDIKICAgICAgIChldmVudC0+c3RhdGUgPSAweDIwMDApLiBJdCdzIHByb2JhYmx5IGJldHRlciB0byBub3QgYXNzdW1lIGEKICAgICAgIHByZWRlZmluZWQgZ3JvdXAgaW5kZXggYW5kIGZpbmQgaXQgZHluYW1pY2FsbHkKCiAgICAgICBSZWY6IFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBMaWJyYXJ5IHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTQuMS4xIGFuZCAxNy4xLjEpICovCiAgICAvKiBTYXZlIGFsc28gYWxsIHBvc3NpYmxlIG1vZGlmaWVyIHN0YXRlcy4gKi8KICAgIEFsdEdyTWFzayA9IGV2ZW50LT5zdGF0ZSAmICgweDYwMDAgfCBNb2QxTWFzayB8IE1vZDJNYXNrIHwgTW9kM01hc2sgfCBNb2Q0TWFzayB8IE1vZDVNYXNrKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSl7Cgljb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CglpZiAoIWtzbmFtZSkKCSAga3NuYW1lID0gIk5vIE5hbWUiOwoJVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVsWCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIGFzY2lpX2NoYXJzLCBkZWJ1Z3N0cl9hbihTdHIsIGFzY2lpX2NoYXJzKSk7CiAgICB9CiAgICBpZiAoYnVmICE9IFN0cikKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBTdHIpOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLGV2ZW50KTsKICAgIC8qIFggcmV0dXJucyBrZXljb2RlIDAgZm9yIGNvbXBvc2VkIGNoYXJhY3RlcnMgKi8KICAgIGlmICghdmtleSAmJiBhc2NpaV9jaGFycykgdmtleSA9IFZLX05PTkFNRTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgIGlmICghdmtleSkgcmV0dXJuOwoKICAgIGR3RmxhZ3MgPSAwOwogICAgaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CiAgICBpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCgogICAgLyogTm90ZTogWCBzZXRzIHRoZSBiZWxvdyBzdGF0ZXMgb24ga2V5IGRvd24gYW5kIGNsZWFycyB0aGVtIG9uIGtleSB1cC4KICAgICAgIFdpbmRvd3MgdHJpZ2dlcnMgdGhlbSBvbiBrZXkgZG93bi4gKi8KCiAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSAmJgogICAgICAgIHZrZXkgIT0gVktfQ0FQSVRBTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHNMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSk7CiAgICAgICAgdXBkYXRlX2xvY2tfc3RhdGUoVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgICh2a2V5ICYgMHhmZikgIT0gVktfTlVNTE9DSykKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX05VTUxPQ0tdKTsKICAgICAgICB1cGRhdGVfbG9ja19zdGF0ZShWS19OVU1MT0NLLCAweDQ1LCBldmVudF90aW1lKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIFNDUk9MTExPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19TQ1JPTExdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBTY3JvbGxMb2NrTWFzaykgJiYKICAgICAgICB2a2V5ICE9IFZLX1NDUk9MTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIFNjckxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX1NDUk9MTF0pOwogICAgICAgIHVwZGF0ZV9sb2NrX3N0YXRlKFZLX1NDUk9MTCwgMHg0NiwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKICAgIFRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lLCAwLCAwICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKSkpIGNvbnRpbnVlOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMDApICYmIChrZXlzeW0gIT0gJyAnKSkKICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtrZXljXVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICVsZFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI8KjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleXN5bSAweCUwNGxYLCBrZXljb2RlICVkLCBnb3QgJXNcbiIsIGtleXN5bSwga2V5Yywgc3RyICk7CiAgICAgICAgICBtaXNtYXRjaCsrOwogICAgICAgICAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKQogICAgV0FSTigiVXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuL3ZpcnR1YWwgY29kZXMgbWFwcGluZy5cbiIsCiAgICAgICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgpzdGF0aWMgSEtMIGdldF9sb2NhbGVfa2JkX2xheW91dCh2b2lkKQp7CiAgICBVTE9OR19QVFIgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICAvKiBGSVhNRToKICAgICAqCiAgICAgKiBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgICAqCiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCgogICAgbGF5b3V0ID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgogICAgLyoKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogSU1FICovCiAgICBlbHNlCiAgICAgICAgbGF5b3V0IHw9IGxheW91dCA8PCAxNjsKCiAgICByZXR1cm4gKEhLTClsYXlvdXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CgogICAgbGF5b3V0ID0gSGFuZGxlVG9VbG9uZyggZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCkgKTsKICAgIGlmIChISVdPUkQobGF5b3V0KSA9PSBMT1dPUkQobGF5b3V0KSkgbGF5b3V0ID0gTE9XT1JEKGxheW91dCk7CiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkodm9pZCkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIHByZWxvYWRbXSA9CiAgICAgICAgeydLJywnZScsJ3knLCdiJywnbycsJ2EnLCdyJywnZCcsJyAnLCdMJywnYScsJ3knLCdvJywndScsJ3QnLCdcXCcsJ1AnLCdyJywnZScsJ2wnLCdvJywnYScsJ2QnLDB9OwogICAgc3RhdGljIGNvbnN0IFdDSEFSIG9uZVtdID0geycxJywwfTsKCiAgICBIS0VZIGhrZXk7CiAgICBXQ0hBUiBsYXlvdXRbS0xfTkFNRUxFTkdUSF07CgogICAgaWYgKFJlZ0NyZWF0ZUtleUV4VyhIS0VZX0NVUlJFTlRfVVNFUiwgcHJlbG9hZCwgMCwgTlVMTCwgMCwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsICZoa2V5LCBOVUxMKSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFSZWdRdWVyeVZhbHVlRXhXKGhrZXksIG9uZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFgxMURSVl9HZXRLZXlib2FyZExheW91dE5hbWUobGF5b3V0KSkKICAgICAgICBSZWdTZXRWYWx1ZUV4Vyhoa2V5LCBvbmUsIDAsIFJFR19TWiwgKGNvbnN0IEJZVEUgKilsYXlvdXQsIHNpemVvZihsYXlvdXQpKTsKCiAgICBSZWdDbG9zZUtleShoa2V5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggRGlzcGxheSAqZGlzcGxheSApCnsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICAgIGNoYXIgdmtleV91c2VkWzI1Nl0gPSB7IDAgfTsKCiAgICAvKiBSYW5nZXMgb2YgT0VNLCBmdW5jdGlvbiBrZXksIGFuZCBjaGFyYWN0ZXIgdmlydHVhbCBrZXkgY29kZXMuCiAgICAgKiBEb24ndCBpbmNsdWRlIHRob3NlIGhhbmRsZWQgc3BlY2lhbGx5IGluIFgxMURSVl9Ub1VuaWNvZGVFeCBhbmQKICAgICAqIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgsIGxpa2UgVktfTlVNUEFEMCAtIFZLX0RJVklERS4gKi8KICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgICAgIFdPUkQgZmlyc3QsIGxhc3Q7CiAgICB9IHZrZXlfcmFuZ2VzW10gPSB7CiAgICAgICAgeyBWS19PRU1fMSwgVktfT0VNXzMgfSwKICAgICAgICB7IFZLX09FTV80LCBWS19JQ09fMDAgfSwKICAgICAgICB7IDB4ZTYsIDB4ZTYgfSwKICAgICAgICB7IDB4ZTksIDB4ZjUgfSwKICAgICAgICB7IFZLX09FTV9ORUNfRVFVQUwsIFZLX09FTV9ORUNfRVFVQUwgfSwKICAgICAgICB7IFZLX0YxLCBWS19GMjQgfSwKICAgICAgICB7IDB4MzAsIDB4MzkgfSwgLyogVktfMCAtIFZLXzkgKi8KICAgICAgICB7IDB4NDEsIDB4NWEgfSwgLyogVktfQSAtIFZLX1ogKi8KICAgICAgICB7IDAsIDAgfQogICAgfTsKICAgIGludCB2a2V5X3JhbmdlOwoKICAgIHNldF9rYmRfbGF5b3V0X3ByZWxvYWRfa2V5KCk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGtleXN5bXNfcGVyX2tleWNvZGUuCiAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCiAgICBYRnJlZShrc3ApOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19TY3JvbGxfTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxMb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIlNjcm9sbExvY2tNYXNrIGlzICV4XG4iLCBTY3JvbGxMb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBkaXNwbGF5ICk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwogICAgZTIudHlwZSA9IEtleVByZXNzOwoKICAgIG1lbXNldChrZXljMnZrZXksIDAsIHNpemVvZihrZXljMnZrZXkpKTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgY2hhciBidWZbMzBdOwogICAgICAgIGludCBoYXZlX2NoYXJzOwoKICAgICAgICBrZXlzeW0gPSAwOwogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGhhdmVfY2hhcnMgPSBYTG9va3VwU3RyaW5nKCZlMiwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7IC8qIFhGcmVlODYgdmVuZG9yIGtleXMgKi8KICAgICAgICAgICAgICAgIHZrZXkgPSB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIC8qIEFsbCB2ZW5kb3Iga2V5cyBhcmUgZXh0ZW5kZWQgd2l0aCBhIHNjYW4gY29kZSBvZiAwIHBlciB0ZXN0aW5nIG9uIFdpblhQICovCiAgICAgICAgICAgICAgICBzY2FuID0gMHgxMDA7CgkJdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSBpZiAoaGF2ZV9jaGFycykgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIGkpOwoJCWlmICgoa2V5c3ltPDB4ODAwMCkgJiYgKGtleXN5bSE9JyAnKSkKICAgICAgICAgICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlbaV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgfQoJCX0gZWxzZSB7CgkJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJCX0KCSAgICAgIH0KCSAgICAgIC8qIGZpbmQga2V5IHdpdGggbG9uZ2VzdCBtYXRjaCBzdHJlYWsgKi8KCSAgICAgIGZvciAoa2V5bj0wOyBrZXluPE1BSU5fTEVOOyBrZXluKyspIHsKCQlmb3IgKG9rPSgqbGtleSlba2V5bl1baT0wXTsgb2smJihpPDQpOyBpKyspCgkJICBpZiAoKCpsa2V5KVtrZXluXVtpXSAmJiAoKmxrZXkpW2tleW5dW2ldIT1ja2V5W2ldKSBvaz0wOwoJCWlmICghb2spIGktLTsgLyogd2Ugb3ZlcnNob3QgKi8KCQlpZiAob2t8fChpPm1heGxlbikpIHsKCQkgIG1heGxlbj1pOyBtYXh2YWw9a2V5bjsKCQl9CgkJaWYgKG9rKSBicmVhazsKCSAgICAgIH0KCSAgICAgIGlmIChtYXh2YWw+PTApIHsKCQkvKiBnb3QgaXQgKi8KCQljb25zdCBXT1JEICgqbHNjYW4pW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5zY2FuOwoJCWNvbnN0IFdPUkQgKCpsdmtleSlbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnZrZXk7CgkJc2NhbiA9ICgqbHNjYW4pW21heHZhbF07CgkJdmtleSA9ICgqbHZrZXkpW21heHZhbF07CgkgICAgICB9CgkgICAgfQogICAgICAgIH0KICAgICAgICBUUkFDRSgia2V5Y29kZSAlMDR4ID0+IHZrZXkgJTA0eFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICBrZXljMnNjYW5bZTIua2V5Y29kZV0gPSBzY2FuOwogICAgICAgIGlmICgodmtleSAmIDB4ZmYpICYmIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSkKICAgICAgICAgICAgV0FSTigidmtleSAlMDR4IGlzIGJlaW5nIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBrZXljb2RlXG4iLCB2a2V5KTsKICAgICAgICB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0gPSAxOwogICAgfSAvKiBmb3IgKi8KCiNkZWZpbmUgVktFWV9JRl9OT1RfVVNFRCh2a2V5KSAodmtleV91c2VkWyh2a2V5KV0gPyAwIDogKHZrZXlfdXNlZFsodmtleSldID0gMSwgKHZrZXkpKSkKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4ZmY7CiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KICAgICAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFhLXzAgJiYga2V5c3ltIDw9IFhLXzkpCiAgICAgICAgICAgICAgICB8fCAoa2V5c3ltID49IFhLX0EgJiYga2V5c3ltIDw9IFhLX1opKSB7CiAgICAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChrZXlzeW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgc3dpdGNoIChrZXlzeW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8xKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV80KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzYpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV83KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fQ09NTUEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QRVJJT0QpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9NSU5VUyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BMVVMpOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgia2V5Y29kZSAlMDR4ID0+IHZrZXkgJTA0eFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgfQogICAgfSAvKiBmb3IgKi8KCiAgICAvKiBGb3IgYW55IGtleWNvZGVzIHdoaWNoIHN0aWxsIGRvbid0IGhhdmUgYSB2a2V5LCBhc3NpZ24gYW55IHNwYXJlCiAgICAgKiBjaGFyYWN0ZXIsIGZ1bmN0aW9uIGtleSwgb3IgT0VNIHZpcnR1YWwga2V5IGNvZGUuICovCiAgICB2a2V5X3JhbmdlID0gMDsKICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgaWYgKGtleWMydmtleVtrZXljXSAmIDB4ZmYpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHdoaWxlICh2a2V5ICYmIHZrZXlfdXNlZFt2a2V5XSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2a2V5ID09IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmxhc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXlfcmFuZ2UrKzsKICAgICAgICAgICAgICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2a2V5Kys7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgewogICAgICAgICAgICBXQVJOKCJObyBtb3JlIHZrZXlzIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgic3BhcmUgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWDpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQogICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICBUUkFDRSggIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgfQoKICAgICAgICBUUkFDRSgia2V5Y29kZSAlMDR4ID0+IHZrZXkgJTA0eFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICB2a2V5X3VzZWRbdmtleV0gPSAxOwogICAgfSAvKiBmb3IgKi8KI3VuZGVmIFZLRVlfSUZfTk9UX1VTRUQKCiAgICAvKiBJZiBzb21lIGtleXMgc3RpbGwgbGFjayBzY2FuY29kZXMsIGFzc2lnbiBzb21lIGFyYml0cmFyeSBvbmVzIHRvIHRoZW0gbm93ICovCiAgICBmb3IgKHNjYW4gPSAweDYwLCBrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKGtleWMydmtleVtrZXljXSYmIWtleWMyc2NhbltrZXljXSkgewoJY29uc3QgY2hhciAqa3NuYW1lOwoJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJOb1N5bWJvbCI7CgoJLyogc2hvdWxkIG1ha2Ugc3VyZSB0aGUgc2NhbmNvZGUgaXMgdW5hc3NpZ25lZCBoZXJlLCBidXQgPj0weDYwIGN1cnJlbnRseSBhbHdheXMgaXMgKi8KCglUUkFDRV8oa2V5KSgiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCnN0YXRpYyBCT09MIG1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoSEtMIGhrbCkKewogICAgY29uc3QgRFdPUkQgaXNJTUUgPSAweEUwMDAwMDAwOwogICAgSEtMIHhIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICAvKiBpZiB0aGUgbGF5b3V0IGlzIGFuIElNRSwgb25seSBtYXRjaCB0aGUgbG93IHdvcmQgKExDSUQpICovCiAgICBpZiAoKChVTE9OR19QVFIpaGtsICYgaXNJTUUpID09IGlzSU1FKQogICAgICAgIHJldHVybiAoTE9XT1JEKGhrbCkgPT0gTE9XT1JEKHhIa2wpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKGhrbCA9PSB4SGtsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgU0hPUlQgcmV0dmFsOwoKICAgIC8qIFBob3Rvc2hvcCBsaXZlbG9ja3MgdW5sZXNzIG1vdXNlIGV2ZW50cyBhcmUgaW5jbHVkZWQgaGVyZSAqLwogICAgWDExRFJWX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMCwgTlVMTCwgMCwgUVNfS0VZIHwgUVNfTU9VU0UsIDAgKTsKCiAgICByZXR2YWwgPSAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg0MCkgPyAweDAwMDEgOiAwKSB8CiAgICAgICAgICAgICAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg4MCkgPyAweDgwMDAgOiAwKTsKICAgIGtleV9zdGF0ZV90YWJsZVtrZXldICY9IH4weDQwOwogICAgVFJBQ0VfKGtleSkoIigleCkgLT4gJXhcbiIsIGtleSwgcmV0dmFsKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgaWYgKCFkd1RocmVhZGlkIHx8IGR3VGhyZWFkaWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCiAgICB7CiAgICAgICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKTsKICAgICAgICBpZiAodGhyZWFkX2RhdGEgJiYgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQpIHJldHVybiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIH0KICAgIGVsc2UKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIENERUNMIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgSEtMIG9sZEhrbCA9IDA7CiAgICBzdHJ1Y3QgeDExZHJ2X3RocmVhZF9kYXRhICp0aHJlYWRfZGF0YSA9IHgxMWRydl9pbml0X3RocmVhZF9kYXRhKCk7CgogICAgRklYTUUoIiVwLCAlMDR4OiBzZW1pLXN0dWIhXG4iLCBoa2wsIGZsYWdzKTsKICAgIGlmIChmbGFncyAmIEtMRl9TRVRGT1JQUk9DRVNTKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIktMRl9TRVRGT1JQUk9DRVNTIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChmbGFncykKICAgICAgICBGSVhNRSgiZmxhZ3MgJXggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CgogICAgaWYgKGhrbCA9PSAoSEtMKUhLTF9ORVhUIHx8IGhrbCA9PSAoSEtMKUhLTF9QUkVWKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIkhLTF9ORVhUIGFuZCBIS0xfUFJFViBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJzZXR0aW5nIGtleWJvYXJkIG9mIGRpZmZlcmVudCBsb2NhbGVzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG9sZEhrbCA9IHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0OwogICAgaWYgKCFvbGRIa2wpIG9sZEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0ID0gaGtsOwoKICAgIHJldHVybiBvbGRIa2w7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBIV05EIGR1bW15LCBYRXZlbnQgKmV2ZW50ICkKewogICAgSFdORCBod25kOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJmV2ZW50LT54bWFwcGluZyk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggZXZlbnQtPnhtYXBwaW5nLmRpc3BsYXkgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpLCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KICAgIGlmICgha2V5Y29kZSkKICAgIHsKICAgICAgICBpZiAoa2V5c3ltID49IDB4RkYwMCkgLyogV2luZG93cyByZXR1cm5zIDB4MDI0MCArIGNDaGFyIGluIHRoaXMgY2FzZSAqLwogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gMHgwMjQwICsgY0NoYXI7IC8qIDB4MDIwMCBpbmRpY2F0ZXMgYSBjb250cm9sIGNoYXJhY3RlciAqLwogICAgICAgICAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgY3RybCBjaGFyICUjLjJ4XG4iLCByZXQpOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KICAgICAgICAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KICAgICAgICBUUkFDRSgicmV0cnlpbmcgd2l0aCB8IDB4RkUwMFxuIik7CiAgICAgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0UoIiclYycoJSNseCwgJWx1KTogZ290IGtleWNvZGUgJSMuMnggKCVkKVxuIiwKICAgICAgICAgICAgY0NoYXIsIGtleXN5bSwga2V5c3ltLCBrZXljb2RlLCBrZXljb2RlKTsKCiAgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KICAgIHJldCA9IGtleWMydmtleVtrZXljb2RlXTsKCiAgICBpZiAoIWtleWNvZGUgfHwgIXJldCkKICAgIHsKICAgICAgICBUUkFDRSgia2V5Y29kZSBmb3IgJyVjJyBub3QgZm91bmQsIHJldHVybmluZyAtMVxuIiwgY0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpbmRleCA9IC0xOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCiAgICB7CiAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaSkgPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIGNhc2UgMDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiByZXQgKz0gMHgwMTAwOyBicmVhazsKICAgICAgICBjYXNlIDI6IHJldCArPSAweDA2MDA7IGJyZWFrOwogICAgICAgIGNhc2UgMzogcmV0ICs9IDB4MDcwMDsgYnJlYWs7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIENERUNMIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKCiNkZWZpbmUgcmV0dXJuTVZLKHZhbHVlKSBkbyB7IFRSQUNFKCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0gd2hpbGUoMCkKCiAgICBUUkFDRSgid0NvZGU9MHgleCwgd01hcFR5cGU9JWQsIGhrbCAlcFxuIiwgd0NvZGUsIHdNYXBUeXBlLCBoa2wpOwogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIHN3aXRjaCh3TWFwVHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQzogLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDX0VYOgogICAgICAgIHsKICAgICAgICAgICAgaW50IGtleWM7CgogICAgICAgICAgICBzd2l0Y2ggKHdDb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFZLX1NISUZUOiB3Q29kZSA9IFZLX0xTSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IHdDb2RlID0gVktfTENPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19NRU5VOiB3Q29kZSA9IFZLX0xNRU5VOyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpIGJyZWFrOwoKICAgICAgICAgICAgaWYgKGtleWMgPiBtYXhfa2V5Y29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CiAgICAgICAgfQogICAgICAgIGNhc2UgTUFQVktfVlNDX1RPX1ZLOiAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVktfRVg6CiAgICAgICAgewogICAgICAgICAgICBpbnQga2V5YzsKICAgICAgICAgICAgVUlOVCB2a2V5ID0gMDsKCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCiAgICAgICAgICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgICAgICAgICAgICBpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgc3RvcCBpZiBpdCdzIG5vdCBhIG51bXBhZCB2a2V5OyBvdGhlcndpc2Uga2VlcAogICAgICAgICAgICAgICAgICAgICAgIGxvb2tpbmcgZm9yIGEgcG90ZW50aWFsIGJldHRlciB2a2V5LiAqLwogICAgICAgICAgICAgICAgICAgIGlmICh2a2V5ICYmICh2a2V5IDwgVktfTlVNUEFEMCB8fCBWS19ESVZJREUgPCB2a2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodmtleSA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh3TWFwVHlwZSA9PSBNQVBWS19WU0NfVE9fVkspCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm5NVksgKHZrZXkpOwogICAgICAgIH0KCQljYXNlIE1BUFZLX1ZLX1RPX0NIQVI6IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCgkJewogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgInVuc2hpZnRlZCIgbWVhbnMuIGluIHdpbmRvd3MgVktfVyAoMHg1NykKICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJucyAweDU3LCB3aGljaCBpcyB1cGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljLCBsZW47CgkJCWNoYXIgc1sxMF07CgoJCQllLmRpc3BsYXkgPSBkaXNwbGF5OwoJCQllLnN0YXRlID0gMDsKCQkJZS5rZXljb2RlID0gMDsKCQkJZS50eXBlID0gS2V5UHJlc3M7CgogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoMCwmZSkgJiAweEZGKSAhPSB3Q29kZSkgewoJCQkJICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKCQkJCQkgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoKHdDb2RlPj1WS19OVU1QQUQwKSAmJiAod0NvZGU8PVZLX05VTVBBRDkpKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKCQkJaWYgKHdDb2RlPT1WS19ERUNJTUFMKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgd2NoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBzLCBsZW4sICZ3Y2gsIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk1WSyh0b3VwcGVyVyh3Y2gpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIEFOU0kuXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCUZJWE1FKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoc2NhbkNvZGUsIE1BUFZLX1ZTQ19UT19WS19FWCwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUi1TaGlmdCBpcyAic3BlY2lhbCIgLSBpdCBpcyBhbiBleHRlbmRlZCBrZXkgd2l0aCBzZXBhcmF0ZSBzY2FuIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuQ29kZSB8PSAweDEwMDsKICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHZrZXksIE1BUFZLX1ZLX1RPX0NIQVIsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CiAgVFJBQ0UoInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0eCwgQU5TSSAweCUwNHhcbiIsIHNjYW5Db2RlLCB2a2V5LCBhbnNpKTsKCiAgLyogZmlyc3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSAicmVndWxhciIga2V5cyB3aGljaCBpcyB0aGUgVXBwZXIgY2FzZQogICAgIHZhbHVlIG9mIHRoZSBrZXljYXAgaW1wcmludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpZiAoICgoYW5zaSA+PSAweDIxKSAmJiAoYW5zaSA8PSAweDdlKSkgJiYKICAgICAgIChzY2FuQ29kZSAhPSAweDEzNykgJiYgICAvKiBQcnRTY24gICAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MTM1KSAmJiAgIC8qIG51bXBhZCAvICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgzNyApICYmICAgLyogbnVtcGFkICogKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRhICkgJiYgICAvKiBudW1wYWQgLSAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGUgKSApICAgIC8qIG51bXBhZCArICovCiAgICAgIHsKICAgICAgICBpZiAoKG5TaXplID49IDIpICYmIGxwQnVmZmVyKQoJewogICAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlclcoKFdDSEFSKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBmb3IgKGtleWk9bWluX2tleWNvZGU7IGtleWk8PW1heF9rZXljb2RlOyBrZXlpKyspCiAgICAgIGlmICgoa2V5YzJzY2FuW2tleWldKSA9PSBzY2FuQ29kZSkKICAgICAgICAgYnJlYWs7CiAgaWYgKGtleWkgPD0gbWF4X2tleWNvZGUpCiAgewogICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAga2V5YyA9IChLZXlDb2RlKSBrZXlpOwogICAgICBrZXlzID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKICAgICAgbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSUwNHgga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgICAgICByZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIG5hbWUsIC0xLCBscEJ1ZmZlciwgblNpemUpOwogIH0KCiAgLyogRmluYWxseSBpc3N1ZSBXQVJOIGZvciB1bmtub3duIGtleXMgICAqLwoKICBXQVJOKCIoJTA4eCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDR4LCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgaWYgKGxwQnVmZmVyICYmIG5TaXplKQogICAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlRXggKFgxMURSVi5AKQogKgogKiBUaGUgVG9Vbmljb2RlIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsLWtleSBjb2RlIGFuZCBrZXlib2FyZAogKiBzdGF0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBXaW5kb3dzIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzLgogKgogKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBhIGRlYWQga2V5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiBPdGhlcndpc2UsCiAqIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogVmFsdWUJTWVhbmluZwogKiAwCVRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgaGFzIG5vIHRyYW5zbGF0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQuCiAqIDEJT25lIFdpbmRvd3MgY2hhcmFjdGVyIHdhcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KICogMglUd28gY2hhcmFjdGVycyB3ZXJlIGNvcGllZCB0byB0aGUgYnVmZmVyLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEKICogICAgICBkZWFkLWtleSBjaGFyYWN0ZXIgKGFjY2VudCBvciBkaWFjcml0aWMpIHN0b3JlZCBpbiB0aGUga2V5Ym9hcmQgbGF5b3V0IGNhbm5vdAogKiAgICAgIGJlIGNvbXBvc2VkIHdpdGggdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSB0byBmb3JtIGEgc2luZ2xlIGNoYXJhY3Rlci4KICoKICogRklYTUUgOiBzaG91bGQgZG8gdGhlIGFib3ZlIChyZXR1cm4gMiBmb3Igbm9uIG1hdGNoaW5nIGRlYWRjaGFyK2NoYXIgY29tYmluYXRpb25zKQogKgogKi8KSU5UIENERUNMIFgxMURSVl9Ub1VuaWNvZGVFeChVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIGNvbnN0IEJZVEUgKmxwS2V5U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBidWZbMTBdOwogICAgY2hhciAqbHBDaGFyID0gYnVmOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICghbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChoa2wpKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICh2aXJ0S2V5ID49IFZLX0xFRlQgJiYgdmlydEtleSA8PSBWS19ET1dOKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5IC0gVktfTEVGVCArIFhLX0xlZnQpOwoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICh2aXJ0S2V5PT1WS19TRVBBUkFUT1IpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB2aXJ0S2V5KTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0UoIkZvdW5kIGtleWNvZGUgJWQgKDB4JTJYKVxuIixlLmtleWNvZGUsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nLAogICAgICogZS50eXBlIHdhcyBzZXQgdG8gS2V5UHJlc3MgYWJvdmUuCiAgICAgKi8KICAgIGlmICh4aWMpCiAgICB7CiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIFRSQUNFKCJYbWJMb29rdXBTdHJpbmcgbmVlZHMgJWQgYnl0ZShzKVxuIiwgcmV0KTsKICAgICAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCByZXQpOwogICAgICAgICAgICBpZiAobHBDaGFyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHJldCwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYiAmJiAhKGUuc3RhdGUgJiBDb250cm9sTWFzaykpCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgwOTsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKICAgICAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5c3ltID49IDB4MDEwMDAxMDAgJiYga2V5c3ltIDw9IDB4MDEwMGZmZmYpCiAgICAgICAgewogICAgICAgICAgICAvKiBVbmljb2RlIGRpcmVjdCBtYXBwaW5nICovCiAgICAgICAgICAgIGJ1ZldbMF0gPSBrZXlzeW0gJiAweGZmZmY7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsKICAgICAgICAgICAgYnVmV1swXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJV0FSTigibm8gY2hhciBmb3Iga2V5c3ltICUwNGxYICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJV0FSTigidmlydEtleT0lWCwgc2NhbkNvZGU9JVgsIGtleWNvZGU9JVgsIHN0YXRlPSVYXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0EnKSkgfHwKICAgICAgICAgICAgICAgICgoa2V5c3ltID4gJ1onKSAmJiAoa2V5c3ltIDwgJ2EnKSkgfHwKICAgICAgICAgICAgICAgIChrZXlzeW0gPT0gWEtfVGFiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSAvKiBDb250cm9sIGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gJ1xuJzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8qIEhhY2sgdG8gZGV0ZWN0IGFuIFhMb29rdXBTdHJpbmcgaGFyZC1jb2RlZCB0byBMYXRpbjEgKi8KICAgICAgICBpZiAocmV0ID09IDEgJiYga2V5c3ltID49IDB4MDBhMCAmJiBrZXlzeW0gPD0gMHgwMGZmICYmIChCWVRFKWxwQ2hhclswXSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gKEJZVEUpbHBDaGFyWzBdOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCgkvKiBwZXJmb3JtIHRyYW5zbGF0aW9uIHRvIHVuaWNvZGUgKi8KCWlmKHJldCkKCXsKCSAgICBUUkFDRV8oa2V5KSgiVHJhbnNsYXRpbmcgY2hhciAweCUwMnggdG8gdW5pY29kZVxuIiwgKihCWVRFICopbHBDaGFyKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9Cgpmb3VuZDoKICAgIGlmIChidWYgIT0gbHBDaGFyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQ2hhcik7CiAgICBUUkFDRV8oa2V5KSgicmV0dXJuaW5nICVkIHdpdGggJXNcbiIsIHJldCwgZGVidWdzdHJfd24oYnVmVywgcmV0KSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBDREVDTCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhCZWxsKGdkaV9kaXNwbGF5LCAwKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0K