LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCiAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CgojaW5jbHVkZSAidHNfeGxpYi5oIgojaW5jbHVkZSAidHNfeHJlc291cmNlLmgiCiNpbmNsdWRlICJ0c194dXRpbC5oIgojaWZkZWYgSEFWRV9YS0IKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAiZGlucHV0LmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJ1c2VyLmgiCiNpbmNsdWRlICJrZXlib2FyZC5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIngxMWRydi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChkaW5wdXQpOwoKZXh0ZXJuIEJZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CgpleHRlcm4gTFBCWVRFIHBLZXlTdGF0ZVRhYmxlOwoKaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwpzdGF0aWMgaW50IGtjQ29udHJvbCwga2NBbHQsIGtjU2hpZnQsIGtjTnVtTG9jaywga2NDYXBzTG9jazsgLyoga2V5Y29kZXMgKi8KI2lmZGVmIEhBVkVfWEtCCnN0YXRpYyBpbnQgaXNfeGtiLCB4a2Jfb3Bjb2RlLCB4a2JfZXZlbnQsIHhrYl9lcnJvcjsKI2VuZGlmCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDgKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgVktfUSxWS19XLFZLX0UsVktfUixWS19ULFZLX1ksVktfVSxWS19JLFZLX08sVktfUCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfQSxWS19TLFZLX0QsVktfRixWS19HLFZLX0gsVktfSixWS19LLFZLX0wsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgIFZLX1osVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgIFZLX0EsVktfWixWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzYsVktfT0VNXzEsCiAgIFZLX1EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX00sVktfT0VNXzMsVktfT0VNXzUsCiAgIFZLX1csVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyogRklYTUU6IGFkZCBvdGhlciBsYXlvdXRzLCBzdWNoIGFzIERWT1JBSyBhbmQgR2VybWFuIFFXRVJUWiAqLwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgLWRlYnVnbXNnICtrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAobW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV3ZSBCb25uZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwovKiAoWEZyZWU4NiByZXBvcnRzIHRoZSA8PiBrZXkgZXZlbiBpZiBpdCdzIG5vdCBwaHlzaWNhbGx5IHRoZXJlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUtbTUFJTl9MRU5dWzRdID0KewogImAiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ0AiLCIjfiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgRXJpYyBQb3VlY2gpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMn4iLCJcIjMjIiwiJzR7IiwiKDVbIiwiLTZ8Iiwi6DciLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjpCIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBS7WtoYXLwdXIgRWdpbHNzb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIvbWXFwiLCItXyIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInP34iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwitF4iLCIrKmAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBXZWlnYW5kKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUWAIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiO0IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTbUiLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCK0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gTmF5bG9yKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxK3wiLCIyXCJAIiwiMyojIiwiNOciLCI1JSIsIjYmrCIsIjcvpiIsIjgooiIsIjkpIiwiMD0iLCInP7QiLCJeYH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/OhbIiwiqCFdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgeyIsIiSjfSIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIFN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBoaWxpcHBlIEZyb2lkZXZhdXgpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErfCIsIjJcIkAiLCIzKiMiLCI05yIsIjUlIiwiNiasIiwiNy+mIiwiOCiiIiwiOSkiLCIwPSIsIic/tCIsIl5gfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo/FsiLCKoIV0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIun2Iiwi4OR7IiwiJKN9IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgT3ZlIEvldmVuKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OT1tNQUlOX0xFTl1bNF0gPQp7CiAifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXGC0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRGFuaXNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgQmVydGhvIFN0dWx0aWVucykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwitGB8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBTd2VkaXNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGV0ZXIgQm9ydGFzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXKYiLCIxISIsIjJcIkAiLCIzI6MiLCI0JKciLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiJz8iLCKruyIsCiAicVEiLCAgIndXIiwiZUUiLCAgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIisqXFyoIiwiXFwnXFxgIiwKICJhQSIsICAic1MiLCJkRCIsICAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAi58ciLCAiuqoiLCAiXFx+XFxeIiwKICJ6WiIsICAieFgiLCJjQyIsICAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDsiLCAiLjoiLCAiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSG5IiwiMlwisiIsIjOjsyIsIjQkvCIsIjUlvSIsIjYmviIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIic/YCIsIuxefiIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/giLCJwUP4iLCLo6VsiLCIrKl0iLAogImFBIiwic1PfIiwiZETwIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8udAIiwi4LAjIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NtSIsIiw7IiwiLjq3IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIiIsIjEhIiwiMlwiQCIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIlwnYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIiLCJcIl5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIiLCIiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9rb2k4cltNQUlOX0xFTl1bNF0gPQp7CiAiKCkiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1OiIsIjYsIiwiNy4iLCI4OyIsIjk/IiwiMCUiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXHwiLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBW01BSU5fTEVOXVs0XSA9CnsKICJgfq29IiwiMSExISIsIjJAMlwiIiwiMyMzJyIsIjQkNCoiLCI1JTU6IiwiNl42LCIsIjcmNy4iLCI4Kjg7IiwiOSg5KCIsIjApMCkiLCItXy1fIiwiPSs9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfae3IiwKICJhQcbmIiwic1OmtiIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wipLQiLCJcXHxcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Lz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvc+kgTWFyY29zIEzzcGV6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqpcXCIsIjEhfCIsIjJcIkAiLCIztyMiLCI0JCIsIjUlIiwiNiasIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeWyIsIisqXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCInqHsiLCLnx30iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgWm9sdOFuIEtvduFjcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlsCIsIjYvsiIsIjc9YCIsIjgo/yIsIjkptCIsIvbWvSIsIvzcqCIsIvPTuCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSc0iLCJvT/giLCJwUCIsIvXV9yIsIvra1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpK7SIsImtLsyIsImxMoyIsIunJJCIsIuHB3yIsIvvbpCIsCiAieVk+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzsiLCIuOrciLCItXyoiLAogIu3NPCIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCK3IiwiMyNeIiwiNCSiIiwiNSWwIiwiNiayIiwiNy9gIiwiOCj/IiwiOSm0IiwiMD29IiwiJz+oIiwiKyq4IiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmp9yIsIvDQ1yIsCiAiYUEiLCJzUyIsImREIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIujIIiwi5sbfIiwivq6kIiwKICJ5WSIsInhYIiwiY0MiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTaciLCIsOyIsIi46IiwiLV8vIiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNlwiIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIidgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiO7BgJyIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwKSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvov9yIsIuQo1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi9FwiJCIsIqch3yIsIvIppCIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLCsIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz9cXCIsIqG/IiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XWAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE5lcmlqdXMgQmFsaftuYXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIigoIiwiKSkiLCItXyIsIv7eIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgVUlOVCBsYXlvdXRfY3A7IC8qIENvZGUgcGFnZSBmb3IgdGhpcyBsYXlvdXQgKi8KICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsIDI4NTkxLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogeyJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsIDIwODY2LCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgMjA4NjYsICZtYWluX2tleV9SVV9rb2k4ciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsIDIwODY2LCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7Ikl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgMjg1OTIsICZtYWluX2tleV9IUl9qZWxseSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgOTMyLCAmbWFpbl9rZXlfSkFfanAxMDYsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsIDkzMiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsIDI4NTkyLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAyODYwMywgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAyODU5OSwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgoge05VTEwsIDAsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIHNwZWNpYWxfa2V5X3ZrZXlbXSA9CnsKICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQgc3BlY2lhbF9rZXlfc2NhbltdID0KewogICAgMHgwRSwgMHgwRiwgMCwgLyo/Ki8gMCwgMCwgMHgxQywgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgICAgMCwgICAgMCwgMHg0NSwgMHg0NiwgMCAgICwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgICAgMCwgICAgMCwgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgY3Vyc29yX2tleV92a2V5W10gPQp7CiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTkVYVCwgVktfRU5EICAgICAgICAgIC8qIEZGNTAgKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQgY3Vyc29yX2tleV9zY2FuW10gPQp7CiAgICAweDE0NywgMHgxNEIsIDB4MTQ4LCAweDE0RCwgMHgxNTAsIDB4MTQ5LCAweDE1MSwgMHgxNEYgICAgICAvKiBGRjUwICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtaXNjX2tleV92a2V5W10gPQp7CiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsIDAsIDAsIDAsICAvKiBGRjYwICovCiAgICBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgVktfQ0FOQ0VMICAgICAgICAgICAgICAgICAgICAvKiBGRjY4ICovCn07CnN0YXRpYyBjb25zdCBXT1JEIG1pc2Nfa2V5X3NjYW5bXSA9CnsKICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzgsIDB4MTQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIGtleXBhZF9rZXlfdmtleVtdID0KewogICAgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIEZGN0UgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELCAwLAoJCQkJIFZLX0lOU0VSVCwgVktfREVMRVRFLCAgICAgICAgICAvKiBGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwgICAgICAgICAgIC8qIEZGQTggKi8KICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsIFZLX05VTVBBRDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LCAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCn07CnN0YXRpYyBjb25zdCBXT1JEIGtleXBhZF9rZXlfc2NhbltdID0KewogICAgMHgxMzgsIDB4MTQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3RSAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMHgxMUMsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgMHgzNywgMHg0RSwgLyo/Ki8gMCwgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgMHg0OCwgMHg0OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwp9OwogICAgCnN0YXRpYyBjb25zdCBXT1JEIGZ1bmN0aW9uX2tleV92a2V5W10gPQp7CiAgICBWS19GMSwgVktfRjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkJFICovCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2ICAgICAgICAgICAgICAvKiBGRkM4ICovCn07CnN0YXRpYyBjb25zdCBXT1JEIGZ1bmN0aW9uX2tleV9zY2FuW10gPQp7CiAgICAweDNCLCAweDNDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkJFICovCiAgICAweDNELCAweDNFLCAweDNGLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkM4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtb2RpZmllcl9rZXlfdmtleVtdID0KewogICAgVktfU0hJRlQsIFZLX1NISUZULCBWS19DT05UUk9MLCBWS19DT05UUk9MLCBWS19DQVBJVEFMLCAwLCAvKiBGRkUxICovCiAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTcgKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQgbW9kaWZpZXJfa2V5X3NjYW5bXSA9CnsKICAgIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMSAqLwogICAgMHgzOCwgMHgxMzgsIDB4MzgsIDB4MTM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCn07CgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW07CgogICAgVFNYTG9va3VwU3RyaW5nKGUsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoa2V5c3ltID49IDB4RkZBRSkgJiYgKGtleXN5bSA8PSAweEZGQjkpICYmIChrZXlzeW0gIT0gMHhGRkFGKSAKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkgCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4ga2V5cGFkX2tleV92a2V5WyhrZXlzeW0gJiAweEZGKSAtIDB4N0VdOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0UsIEFsdEdyU3RhdGU9RkFMU0U7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgSU5UIGV2ZW50X3gsIElOVCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBldmVudF90aW1lICkKewogIEJPT0wgKiBTdGF0ZSA9ICh2a2V5PT1WS19OVU1MT0NLPyAmTnVtU3RhdGUgOiAmQ2Fwc1N0YXRlKTsKICBEV09SRCB1cCwgZG93bjsKCiAgaWYgKCpTdGF0ZSkgewogICAgLyogVGhlIElOVEVSTUVESUFSWSBzdGF0ZSBtZWFucyA6IGp1c3QgYWZ0ZXIgYSAncHJlc3MnIGV2ZW50LCBpZiBhICdyZWxlYXNlJyBldmVudCBjb21lcywKICAgICAgIGRvbid0IHRyZWF0IGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgogICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KICAgICpTdGF0ZT1GQUxTRTsKICAgIFRSQUNFKCJJTlRFUk0gOiBkb25cJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeFxuIix2a2V5LHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICB9IGVsc2UKICAgIHsKICAgICAgICBkb3duID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKTsKICAgICAgICB1cCA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCkgfCBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHBLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgxICkgLyogaXQgd2FzIE9OICovCgkgIHsKCSAgICBpZiAoRXZ0eXBlIT1LZXlQcmVzcykKCSAgICAgIHsKCQlUUkFDRSgiT04gKyBLZXlSZWxlYXNlID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKCSAgICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCBkb3duLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkgICAgICAgIEtFWUJPQVJEX1NlbmRFdmVudCggdmtleSwgc2NhbiwgdXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkJKlN0YXRlPUZBTFNFOwoJCXBLZXlTdGF0ZVRhYmxlW3ZrZXldICY9IH4weDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb2ZmLiAqLyAKCSAgICAgIH0gCgkgIH0KCWVsc2UgLyogaXQgd2FzIE9GRiAqLwoJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKCSAgICB7CgkgICAgICBUUkFDRSgiT0ZGICsgS2V5cHJlc3MgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCBkb3duLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSApOwoJICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCB1cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkgICAgICAqU3RhdGU9VFJVRTsgLyogR29lcyB0byBpbnRlcm1lZGlhcnkgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIE9OICovCgkgICAgICBwS2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb24uICovCgkgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlCiAqCiAqIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgZm9yIDx2a2V5PiwgZGVwZW5kaW5nIG9uIGtleSA8c3RhdGU+IHVuZGVyIFgKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggaW50IHZrZXksIGludCBzdGF0ZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnggXG4iLAogICAgICAgICAgICAgIHZrZXksIHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKCiAgICAgICAgLyogRmFrZSBrZXkgYmVpbmcgcHJlc3NlZCBpbnNpZGUgd2luZSAqLwoJS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCAwLCBzdGF0ZT8gMCA6IEtFWUVWRU5URl9LRVlVUCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBHZXRUaWNrQ291bnQoKSApOwoKICAgICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgJSMuMnggXG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS0VZQk9BUkRfVXBkYXRlU3RhdGUKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkKICogd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkIChjYWxsZWQgYnkgRVZFTlRfRm9jdXNJbiBpbiBldmVudC5jKQogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LiAoYmVjYXVzZSBYUXVlcnlLZXltYXAgc2F5cyBub3RoaW5nCiAqICBhYm91dCB0aGVtKQogKi8Kdm9pZCBYMTFEUlZfS0VZQk9BUkRfVXBkYXRlU3RhdGUgKCB2b2lkICkKewovKiBleHRyYWN0IGEgYml0IGZyb20gdGhlIGNoYXJbMzJdIGJpdCBzdWl0ZSAqLwojZGVmaW5lIEtleVN0YXRlKGtleWNvZGUpICgoa2V5c19yZXR1cm5ba2V5Y29kZS84XSAmICgxPDwoa2V5Y29kZSU4KSkpIT0wKQoKICAgIGNoYXIga2V5c19yZXR1cm5bMzJdOwoKICAgIFRSQUNFKCJjYWxsZWRcbiIpOwogICAgaWYgKCFUU1hRdWVyeUtleW1hcCh0aHJlYWRfZGlzcGxheSgpLCBrZXlzX3JldHVybikpIHsKICAgICAgICBFUlIoIkVycm9yIGdldHRpbmcga2V5bWFwICFcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIEFMVCBhbmQgQ09OVFJPTCBzdGF0ZSBpZiBhbnkgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX01FTlUsIEtleVN0YXRlKGtjQWx0KSk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZShWS19DT05UUk9MLCBLZXlTdGF0ZShrY0NvbnRyb2wpKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX1NISUZULCBLZXlTdGF0ZShrY1NoaWZ0KSk7CiN1bmRlZiBLZXlTdGF0ZQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LRVlCT0FSRF9IYW5kbGVFdmVudAogKgogKiBIYW5kbGUgYSBYIGtleSBldmVudAogKi8Kdm9pZCBYMTFEUlZfS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFhLZXlFdmVudCAqZXZlbnQsIGludCB4LCBpbnQgeSApCnsKICAgIGNoYXIgU3RyWzI0XTsgCiAgICBLZXlTeW0ga2V5c3ltOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgc3RhdGljIEJPT0wgZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsgLyogaGFjayBmb3IgQWx0R3IgdHJhbnNsYXRpb24gKi8KICAgIGludCBhc2NpaV9jaGFyczsKCiAgICBEV09SRCBldmVudF90aW1lID0gZXZlbnQtPnRpbWUgLSBYMTFEUlZfc2VydmVyX3N0YXJ0dGlja3M7CgogICAgLyogdGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgZGVhZCBrZXlzICovCiAgICBpZiAoKGV2ZW50LT5rZXljb2RlID4+IDgpID09IDB4MTApCglldmVudC0+a2V5Y29kZT0oZXZlbnQtPmtleWNvZGUgJiAweGZmKTsKCiAgICBhc2NpaV9jaGFycyA9IFRTWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCBzaXplb2YoU3RyKSwgJmtleXN5bSwgTlVMTCk7CgogICAgVFJBQ0VfKGtleSkoInN0YXRlID0gJVhcbiIsIGV2ZW50LT5zdGF0ZSk7CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgaXMgdXNlZCwgdGhlIHN0YXRlIG1hc2sgZm9yIEFsdEdyIHdpbGwgdXNlZCB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZXJlbnQgdGhhbiAwLiBGcm9tIFhLQgogICAgICAgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb24sIHRoZSBncm91cCBpbmRleCBzaG91bGQgZm9yIEFsdEdyIHNob3VsZCAKICAgICAgIGJlIDIgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIGlmICggQWx0R3JTdGF0ZSAmJiAoZXZlbnQtPnN0YXRlICYgMHg2MDAwKSApCiAgICAgICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgMHg2MDAwOwoKICAgIGlmIChrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCgl7CglUUkFDRV8oa2V5KSgiQWx0IEdyIGtleSBldmVudCByZWNlaXZlZFxuIik7CglldmVudC0+a2V5Y29kZSA9IGtjQ29udHJvbDsgLyogU2ltdWxhdGUgQ29udHJvbCAqLwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBldmVudCwgeCwgeSApOwoKCWV2ZW50LT5rZXljb2RlID0ga2NBbHQ7IC8qIFNpbXVsYXRlIEFsdCAqLwoJZm9yY2VfZXh0ZW5kZWQgPSBUUlVFOwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBldmVudCwgeCwgeSApOwoJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKICAgIAogICAgLyogSGVyZSB3ZSBzYXZlIHRoZSBwcmVzc2VkL3JlbGVhc2VkIHN0YXRlIG9mIHRoZSBBbHRHciBrZXksIHRvIGJlIGFibGUgdG8gCiAgICAgICBpZGVudGlmeSB0aGUgZ3JvdXAgaW5kZXggYXNzb2NpYXRlZCB3aXRoIEFsdEdyIG9uIHRoZSBuZXh0IGtleSBwcmVzc2VkICoKICAgICAgIHNlZSBjb21tZW50IGFib3ZlLiAqLwogICAgQWx0R3JTdGF0ZSA9IChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyBUUlVFIDogRkFMU0U7CiAgICAKCXJldHVybjsKCX0KCiAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNoYXIJKmtzbmFtZTsKCglrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKICAgIH0KCiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleShldmVudCk7CiAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgaWYgKHZrZXkpCiAgIHsKICAgIHN3aXRjaCAodmtleSAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIFZLX05VTUxPQ0s6ICAgIAogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgZXZlbnQtPnR5cGUsIHgsIHksIGV2ZW50X3RpbWUgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX0NBUElUQUw6CiAgICAgIFRSQUNFKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnQtPnR5cGUsIHgsIHksIGV2ZW50X3RpbWUgKTsKICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyIDogJSMuMnhcbiIscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCglpZiAoIShwS2V5U3RhdGVUYWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQoJICB7IAoJICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS4gXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UHJlc3MsIHgsIHksIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UmVsZWFzZSwgeCwgeSwgZXZlbnRfdGltZSApOwoJICB9CiAgICAgICAgLyogQWRqdXN0IHRoZSBDQVBTTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSkKCSAgewogICAgICAgICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgQ2FwcyBMb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIEtleVByZXNzLCB4LCB5LCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIEtleVJlbGVhc2UsIHgsIHksIGV2ZW50X3RpbWUgKTsKCSAgfQoJLyogTm90IE51bSBub3IgQ2FwcyA6IGVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzIGZvciBib3RoLiAqLwoJTnVtU3RhdGUgPSBGQUxTRTsKCUNhcHNTdGF0ZSA9IEZBTFNFOwoKCWJTY2FuID0ga2V5YzJzY2FuW2V2ZW50LT5rZXljb2RlXSAmIDB4RkY7CglUUkFDRV8oa2V5KSgiYlNjYW4gPSAweCUwMnguXG4iLCBiU2Nhbik7CgoJZHdGbGFncyA9IDA7CglpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKCWlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoJaWYgKCBmb3JjZV9leHRlbmRlZCApICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfV0lORV9GT1JDRUVYVEVOREVEOwoKICAgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXkgJiAweGZmLCBiU2NhbiwgZHdGbGFncywgeCwgeSwgZXZlbnRfdGltZSApOwogICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICovCnN0YXRpYyB2b2lkClgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQgKHZvaWQpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcTsKICBpbnQgc2NvcmUsIGtleWMsIGksIGtleSwgcGtleSwgb2ssIHN5bXM7CiAgS2V5U3ltIGtleXN5bTsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbNF0gPQogIHswLCAwLCAwLCAwfTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KICBmb3IgKGN1cnJlbnQgPSAwOyBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudDsgY3VycmVudCsrKSB7CiAgICBUUkFDRSgiQXR0ZW1wdGluZyB0byBtYXRjaCBhZ2FpbnN0IFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQpOwogICAgbWF0Y2ggPSAwOwogICAgbWlzbWF0Y2ggPSAwOwogICAgc2NvcmUgPSAwOwogICAgc2VxID0gMDsKICAgIGxrZXkgPSBtYWluX2tleV90YWJbY3VycmVudF0ua2V5OwogICAgcGtleSA9IC0xOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bSAoZGlzcGxheSwga2V5YywgaSk7CgkvKiBBbGxvdyBib3RoIG9uZS1ieXRlIGFuZCB0d28tYnl0ZSBuYXRpb25hbCBrZXlzeW1zICovCglpZiAoKGtleXN5bSA8IDB4ODAwKSAmJiAoa2V5c3ltICE9ICcgJykpCgkgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwoJZWxzZSB7CgkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNrZXlbMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlbaV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKCSAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXljb2RlICVkLCBjaGFyYWN0ZXIgJWNcbiIsIGtleWMsCgkJIGNrZXlbMF0pOwoJICBtaXNtYXRjaCsrOwoJICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkgewogICAgRklYTUUoCgkgICAiWW91ciBrZXlib2FyZCBsYXlvdXQgd2FzIG5vdCBmb3VuZCFcbiIKCSAgICJVc2luZyBjbG9zZXN0IG1hdGNoIGluc3RlYWQgKCVzKSBmb3Igc2NhbmNvZGUgbWFwcGluZy5cbiIKCSAgICJQbGVhc2UgZGVmaW5lIHlvdXIgbGF5b3V0IGluIHdpbmRvd3MveDExZHJ2L2tleWJvYXJkLmMgYW5kIHN1Ym1pdCB0aGVtXG4iCgkgICAidG8gdXMgZm9yIGluY2x1c2lvbiBpbnRvIGZ1dHVyZSBXaW5lIHJlbGVhc2VzLlxuIgoJICAgIlNlZSBkb2N1bWVudGF0aW9uL2tleWJvYXJkIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwKCSAgIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKICB9CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJbml0S2V5Ym9hcmQgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKHZvaWQpCnsKI2lmZGVmIEhBVkVfWEtCCiAgICBpbnQgeGtiX21ham9yID0gWGtiTWFqb3JWZXJzaW9uLCB4a2JfbWlub3IgPSBYa2JNaW5vclZlcnNpb247CiNlbmRpZgogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBLZXlTeW0gKmtzcDsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleSwgT0VNdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CgojaWZkZWYgSEFWRV9YS0IKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgaXNfeGtiID0gWGtiUXVlcnlFeHRlbnNpb24oZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ4a2Jfb3Bjb2RlLCAmeGtiX2V2ZW50LCAmeGtiX2Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhrYl9tYWpvciwgJnhrYl9taW5vcik7CiAgICBpZiAoaXNfeGtiKSB7CiAgICAgICAgLyogd2UgaGF2ZSBYS0IsIGFwcHJveGltYXRlIFdpbmRvd3MgYmVoYXZpb3VyICovCiAgICAgICAgWGtiU2V0RGV0ZWN0YWJsZUF1dG9SZXBlYXQoZGlzcGxheSwgVHJ1ZSwgTlVMTCk7CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwojZW5kaWYKICAgIFRTWERpc3BsYXlLZXljb2RlcyhkaXNwbGF5LCAmbWluX2tleWNvZGUsICZtYXhfa2V5Y29kZSk7CiAgICBrc3AgPSBUU1hHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGtleXN5bXNfcGVyX2tleWNvZGUuCiAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCiAgICBUU1hGcmVlKGtzcCk7CiAgICBtbXAgPSBUU1hHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwogICAgICAgIAogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKICAgICAgICAgICAgICAgIAoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19Nb2RlX3N3aXRjaCkKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBbHRHck1hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJBbHRHck1hc2sgaXMgJXhcbiIsIEFsdEdyTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgIH0KICAgIH0KICAgIFRTWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwoKICAgIE9FTXZrZXkgPSBWS19PRU1fNzsgLyogbmV4dCBpcyBhdmFpbGFibGUuICAqLwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBUU1hMb29rdXBTdHJpbmcoJmUyLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQga2V5ID0ga2V5c3ltICYgMHhmZjsKCQkKICAgICAgICAgICAgICAgIGlmIChrZXkgPj0gMHgwOCAmJiBrZXkgPD0gMHgxQikgeyAgICAgICAgLyogc3BlY2lhbCBrZXkgKi8KCQkgICAgdmtleSA9IHNwZWNpYWxfa2V5X3ZrZXlba2V5IC0gMHgwOF07CgkJICAgIHNjYW4gPSBzcGVjaWFsX2tleV9zY2FuW2tleSAtIDB4MDhdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHg1MCAmJiBrZXkgPD0gMHg1NykgeyAvKiBjdXJzb3Iga2V5ICovCgkJICAgIHZrZXkgPSBjdXJzb3Jfa2V5X3ZrZXlba2V5IC0gMHg1MF07CgkJICAgIHNjYW4gPSBjdXJzb3Jfa2V5X3NjYW5ba2V5IC0gMHg1MF07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweDYwICYmIGtleSA8PSAweDZCKSB7IC8qIG1pc2NlbGxhbmVvdXMga2V5ICovCgkJICAgIHZrZXkgPSBtaXNjX2tleV92a2V5W2tleSAtIDB4NjBdOwoJCSAgICBzY2FuID0gbWlzY19rZXlfc2NhbltrZXkgLSAweDYwXTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID49IDB4N0UgJiYga2V5IDw9IDB4QjkpIHsgLyoga2V5cGFkIGtleSAqLwoJCSAgICB2a2V5ID0ga2V5cGFkX2tleV92a2V5W2tleSAtIDB4N0VdOwoJCSAgICBzY2FuID0ga2V5cGFkX2tleV9zY2FuW2tleSAtIDB4N0VdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHhCRSAmJiBrZXkgPD0gMHhDRCkgeyAvKiBmdW5jdGlvbiBrZXkgKi8KICAgICAgICAgICAgICAgICAgICB2a2V5ID0gZnVuY3Rpb25fa2V5X3ZrZXlba2V5IC0gMHhCRV0gfCAweDEwMDsgLyogc2V0IGV4dGVuZGVkIGJpdCAqLwogICAgICAgICAgICAgICAgICAgIHNjYW4gPSBmdW5jdGlvbl9rZXlfc2NhbltrZXkgLSAweEJFXTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID49IDB4RTEgJiYga2V5IDw9IDB4RUEpIHsgLyogbW9kaWZpZXIga2V5ICovCgkJICAgIHZrZXkgPSBtb2RpZmllcl9rZXlfdmtleVtrZXkgLSAweEUxXTsKCQkgICAgc2NhbiA9IG1vZGlmaWVyX2tleV9zY2FuW2tleSAtIDB4RTFdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gMHhGRikgeyAgICAgICAgICAgICAgICAvKiBERUwga2V5ICovCgkJICAgIHZrZXkgPSBWS19ERUxFVEU7CgkJICAgIHNjYW4gPSAweDE1MzsKCQl9CgkJLyogc2V0IGV4dGVuZGVkIGJpdCB3aGVuIG5lY2Vzc2FyeSAqLwoJCWlmIChzY2FuICYgMHgxMDApIHZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5c3ltID09IDB4MjApIHsgICAgICAgICAgICAgICAgIC8qIFNwYWNlYmFyICovCgkgICAgICAgIHZrZXkgPSBWS19TUEFDRTsKCQlzY2FuID0gMHgzOTsKCSAgICB9IGVsc2UgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDApICYmIChrZXlzeW0hPScgJykpIHsKCQkgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwoJCX0gZWxzZSB7CgkJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJCX0KCSAgICAgIH0KCSAgICAgIC8qIGZpbmQga2V5IHdpdGggbG9uZ2VzdCBtYXRjaCBzdHJlYWsgKi8KCSAgICAgIGZvciAoa2V5bj0wOyBrZXluPE1BSU5fTEVOOyBrZXluKyspIHsKCQlmb3IgKG9rPSgqbGtleSlba2V5bl1baT0wXTsgb2smJihpPDQpOyBpKyspCgkJICBpZiAoKCpsa2V5KVtrZXluXVtpXSAmJiAoKmxrZXkpW2tleW5dW2ldIT1ja2V5W2ldKSBvaz0wOwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CgogICAgICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCgkgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5c3ltID0gVFNYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBWS18wICYmIGtleXN5bSA8PSBWS185KQogICAgICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gVktfQSAmJiBrZXlzeW0gPD0gVktfWikpIHsKCQkgICAgdmtleSA9IGtleXN5bTsKCQl9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKCQlzd2l0Y2ggKGtleXN5bSkKCQl7CgkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CgkJY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMjsgYnJlYWs7CgkJY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMzsgYnJlYWs7CgkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CgkJY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNTsgYnJlYWs7CgkJY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNjsgYnJlYWs7CgkJY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CgkJY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fQ09NTUE7IGJyZWFrOwoJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CgkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOwoJCWNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BMVVM7IGJyZWFrOwoJCX0KCSAgICB9CgogICAgICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCsrT0VNdmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBXQVJOKCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OwoJCSAgCiAgICAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFRSQUNFKCJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWDpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRU12a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiKCIpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyCSprc25hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCgkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwogICAgICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCAiJWxYICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCIpXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICB9IC8qIGZvciAqLwoKICAgIC8qIElmIHNvbWUga2V5cyBzdGlsbCBsYWNrIHNjYW5jb2RlcywgYXNzaWduIHNvbWUgYXJiaXRyYXJ5IG9uZXMgdG8gdGhlbSBub3cgKi8KICAgIGZvciAoc2NhbiA9IDB4NjAsIGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdJiYha2V5YzJzY2FuW2tleWNdKSB7CgljaGFyICprc25hbWU7CglrZXlzeW0gPSBUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJOb1N5bWJvbCI7CgoJLyogc2hvdWxkIG1ha2Ugc3VyZSB0aGUgc2NhbmNvZGUgaXMgdW5hc3NpZ25lZCBoZXJlLCBidXQgPj0weDYwIGN1cnJlbnRseSBhbHdheXMgaXMgKi8KCglUUkFDRV8oa2V5KSgiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIC8qIE5vdyBzdG9yZSBvbmUga2V5Y29kZSBmb3IgZWFjaCBtb2RpZmllci4gVXNlZCB0byBzaW11bGF0ZSBrZXlwcmVzc2VzLiAqLwogICAga2NDb250cm9sID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CiAgICBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19BbHRfTCk7CiAgICBpZiAoIWtjQWx0KSBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19NZXRhX0wpOwogICAga2NTaGlmdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19TaGlmdF9MKTsKICAgIGtjTnVtTG9jayA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19OdW1fTG9jayk7CiAgICBrY0NhcHNMb2NrID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NhcHNfTG9jayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuIChYMTFEUlYuQCkKICovCldPUkQgWDExRFJWX1ZrS2V5U2NhbihDSEFSIGNDaGFyKQp7CiAgICAgICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CglLZXlDb2RlIGtleWNvZGU7CglLZXlTeW0ga2V5c3ltOyAgICAJCglpbnQgaSxpbmRleDsKCWludCBoaWdoYnl0ZT0wOwoKCS8qIGNoYXItPmtleXN5bSAoc2FtZSBmb3IgQU5TSSBjaGFycykgKi8KCWtleXN5bT0odW5zaWduZWQgY2hhcikgY0NoYXI7LyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwoJaWYgKGtleXN5bTw9MjcpIGtleXN5bSs9MHhGRjAwOy8qc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uKi8KCQoJa2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KCWlmICgha2V5Y29kZSkKCXsgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCgkgIGtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKCX0KCglUUkFDRSgiVmtLZXlTY2FuICclYycoJSNseCwgJWx1KTogZ290IGtleWNvZGUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgY0NoYXIsa2V5c3ltLGtleXN5bSxrZXljb2RlKTsKCQoJaWYgKGtleWNvZGUpCgkgIHsKCSAgICBmb3IgKGluZGV4PS0xLCBpPTA7IChpPDgpICYmIChpbmRleDwwKTsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCgkgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksa2V5Y29kZSxpKT09a2V5c3ltKSBpbmRleD1pOwoJICAgIHN3aXRjaCAoaW5kZXgpIHsKCSAgICBjYXNlIC0xIDoKCSAgICAgIFdBUk4oIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsa2V5c3ltKTsgYnJlYWs7CgkgICAgY2FzZSAwIDogYnJlYWs7CgkgICAgY2FzZSAxIDogaGlnaGJ5dGUgPSAweDAxMDA7IGJyZWFrOwoJICAgIGNhc2UgMiA6IGhpZ2hieXRlID0gMHgwNjAwOyBicmVhazsKCSAgICBjYXNlIDMgOiBoaWdoYnl0ZSA9IDB4MDcwMDsgYnJlYWs7CgkgICAgZGVmYXVsdCA6IEVSUigiaW5kZXggJWQgZm91bmQgYnkgWEtleWNvZGVUb0tleXN5bS4gcGxlYXNlIHJlcG9ydCEgXG4iLGluZGV4KTsKCSAgICB9CgkgICAgLyoKCSAgICAgIGluZGV4IDogMCAgICAgYWRkcyAweDAwMDAKCSAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQoJICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKCSAgICAgIGluZGV4IDogMiAgICAgYWRkcyAweDA2MDAgKGN0cmwrYWx0KQoJICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCgkgICAgICovCgkgIH0KCVRSQUNFKCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlKTsKCXJldHVybiBrZXljMnZrZXlba2V5Y29kZV0raGlnaGJ5dGU7ICAgLyoga2V5Y29kZSAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTWFwVmlydHVhbEtleSAoWDExRFJWLkApCiAqLwpVSU5UMTYgWDExRFJWX01hcFZpcnR1YWxLZXkoVUlOVDE2IHdDb2RlLCBVSU5UMTYgd01hcFR5cGUpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKCVRSQUNFKCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uIFxuIiwgd0NvZGUsd01hcFR5cGUpOwoJc3dpdGNoKHdNYXBUeXBlKSB7CgkJY2FzZSAwOgl7IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCQkJcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMTogeyAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCgkJCS8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQoJCQkJCXJldHVybk1WSyAoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gdmtleS1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDI6IHsgLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KCQkJLyogKHdhcyBGSVhNRSkgOiB3aGF0IGRvZXMgdW5zaGlmdGVkIG1lYW4gPyAnYScgb3IgJ0EnID8gKi8KCQkgICAgICAgIC8qIE15IFdpbmRvd3MgcmV0dXJucyAnQScuICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiAoWExvb2t1cFN0cmluZykgYW5zaSBjaGFyICovCgkJCVhLZXlFdmVudCBlOwoJCQlLZXlTeW0ga2V5c3ltOwoJCQlpbnQga2V5YzsKCQkJY2hhciBzWzJdOwoJCQllLmRpc3BsYXkgPSBkaXNwbGF5OwoJCQllLnN0YXRlID0gMDsgLyogdW5zaGlmdGVkICovCgoJCQllLmtleWNvZGUgPSAwOwoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKICAgICAgICAgIAoJCQlpZiAod0NvZGU9PVZLX0RFQ0lNQUwpCgkJCSAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIiwgd0NvZGUpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgoJCQlpZiAoVFNYTG9va3VwU3RyaW5nKCZlLCBzLCAyLCAma2V5c3ltLCBOVUxMKSkKCQkJICByZXR1cm5NVksgKCpzKTsKCQkJCgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwoJCQlyZXR1cm4gMDsKCQkJfQoKCQljYXNlIDM6ICAgLyogKipOVCBvbmx5Kiogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSBidXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAgKi8KICAgICAgICAgICAgICAJCSAgLyogICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgICovCgkJICAgICAgICAgIEZJWE1FKCIgc3R1YiBmb3IgTlRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwoKCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlXQVJOKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7CQoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5TmFtZVRleHQgKFgxMURSVi5AKQogKi8KSU5UMTYgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMTYgblNpemUpCnsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgkKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgLyogRklYTUU6IHNob3VsZCB1c2UgTVZLIHR5cGUgMyAoTlQgdmVyc2lvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgcmlnaHQgYW5kIGxlZnQgKi8KICB2a2V5ID0gWDExRFJWX01hcFZpcnR1YWxLZXkoc2NhbkNvZGUsIDEpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfTWFwVmlydHVhbEtleSh2a2V5LCAyKTsKICBUUkFDRSgic2NhbiAweCUwNHgsIHZrZXkgMHglMDR4LCBBTlNJIDB4JTA0eFxuIiwgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmICgoblNpemUgPj0gMikgJiYgbHBCdWZmZXIpCgl7CiAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlcigoY2hhcilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSAKICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5Y10pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5YyA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIGtleXMgPSBUU1hLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSUwNHgga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgIHsKICAgICAgICAgIGxzdHJjcHluQShscEJ1ZmZlciwgbmFtZSwgblNpemUpOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgRklYTUUgZm9yIHVua25vd24ga2V5cyAgICovCgogIEZJWE1FKCIoJTA4bHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CSAKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlIChYMTFEUlYuQCkKICoKICogVGhlIFRvVW5pY29kZSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVCBYMTFEUlZfVG9Vbmljb2RlKFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsCgkJICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncykKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBCWVRFIGxwQ2hhclsyXTsKCiAgICBpZiAoc2NhbkNvZGU9PTApIHsKICAgICAgICAvKiBUaGlzIGhhcHBlbnMgd2hlbiBkb2luZyBBbHQrbGV0dGVyIDogYSBmYWtlICdkb3duIGFycm93JyBrZXkgcHJlc3MKICAgICAgICAgICBldmVudCBpcyBnZW5lcmF0ZWQgYnkgd2luZG93cy4gSnVzdCBpZ25vcmUgaXQuICovCiAgICAgICAgVFJBQ0UoInNjYW5Db2RlPTAsIGRvaW5nIG5vdGhpbmdcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHNjYW5Db2RlICYgMHg4MDAwKQogICAgewogICAgICAgIFRSQUNFKCJLZXkgVVAsIGRvaW5nIG5vdGhpbmdcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlLmtleWNvZGUgPSAwOwogICAgZS5zdGF0ZSA9IDA7CiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQoJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCgllLnN0YXRlIHw9IExvY2tNYXNrOwogICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQogICAgewoJaWYgKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKQoJICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoJZWxzZQoJICAgIGUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gJVhcbiIsCgkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwogICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKICAgICAgeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KICAgICAgICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHZpcnRLZXkpCiAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CiAgICAgICAgICAKICAgIGlmICh2aXJ0S2V5PT1WS19ERUNJTUFMKQogICAgICAgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICghZS5rZXljb2RlKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CglyZXR1cm4gdmlydEtleTsgLyogd2hhdGV2ZXIgKi8KICAgICAgfQogICAgZWxzZSBUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKICAgIHJldCA9IFRTWExvb2t1cFN0cmluZygmZSwgKExQVk9JRClscENoYXIsIDIsICZrZXlzeW0sIE5VTEwpOwogICAgaWYgKHJldCA9PSAwKQoJewoJQllURSBkZWFkX2NoYXI7CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKCSAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwoJICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY2hhcgkqa3NuYW1lOwoKCSAgICBrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlFUlIoIlBsZWFzZSByZXBvcnQ6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUpOwoJCUVSUigiKHZpcnRLZXk9JVgsc2NhbkNvZGU9JVgsa2V5Y29kZT0lWCxzdGF0ZT0lWClcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QgCiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqKGNoYXIqKWxwQ2hhciA9IDA7CiAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBXZSBoYXZlIGFub3RoZXIgc3BlY2lhbCBjYXNlIGZvciBkZWxldGUga2V5IChYS19EZWxldGUpIG9uIGFuCiAgICAgICAgIGV4dGVuZGVkIGtleWJvYXJkLiBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndCAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRGVsZXRlKQogICAgICAgIHsKICAgICAgICAgICAgKihjaGFyKilscENoYXIgPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICAqKGNoYXIqKWxwQ2hhciA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCBmcm9tIGNvZGUgcGFnZSAlZCB0byB1bmljb2RlXG4iLAoJCSooQllURSAqKWxwQ2hhciwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmxheW91dF9jcCk7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwLCAwLCAoTFBDU1RSKWxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKICAgIFRSQUNFXyhrZXkpKCJUb1VuaWNvZGUgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleCAlc1xuIiwKCQlyZXQsIGJ1ZlcgPyBidWZXWzBdIDogMCwgYnVmVyA/ICIiIDogIihubyBidWZmZXIpIik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgVFNYQmVsbCh0aHJlYWRfZGlzcGxheSgpLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRESVN0YXRlIChYMTFEUlYuQCkKICovCkJPT0wgWDExRFJWX0dldERJU3RhdGUoRFdPUkQgbGVuLCBMUFZPSUQgcHRyKQp7CiAgaWYgKGxlbj09MjU2KSB7CiAgICBpbnQga2V5Yyx2a2V5OwogICAgCiAgICBtZW1zZXQocHRyLDAsMjU2KTsKICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTtrZXljPG1heF9rZXljb2RlO2tleWMrKykKICAgICAgewoJLyogWCBrZXljb2RlIHRvIHZpcnR1YWwga2V5ICovCgl2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhGRjsKCS8qIFRoZSB3aW5kb3dzIHNjYW5jb2RlIGlzIGtleWMtbWluX2tleWNvZGUgKi8KCWlmIChJbnB1dEtleVN0YXRlVGFibGVbdmtleV0mMHg4MCkgewoJICAoKExQQllURSlwdHIpW2tleWMtbWluX2tleWNvZGVdPTB4ODA7CgkgICgoTFBCWVRFKXB0cilbKGtleWMtbWluX2tleWNvZGUpfDB4ODBdPTB4ODA7Cgl9CiAgICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KICBXQVJOKCJ3aG9vcHMsIGdvdCBsZW4gJWxkP1xuIiwgbGVuKTsKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRESURhdGEgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfR2V0RElEYXRhKAogIEJZVEUgKmtleXN0YXRlLAogIERXT1JEIGRvZHNpemUsIExQRElERVZJQ0VPQkpFQ1REQVRBIGRvZCwKICBMUERXT1JEIGVudHJpZXMsIERXT1JEIGZsYWdzKQp7CiAgaW50IGtleWMsbix2a2V5LHhlbnRyaWVzOwogICAgCiAgLyogRklYTUUgISEhICovCiAgCiAgaWYgKGVudHJpZXMpCiAgICB4ZW50cmllcyA9ICplbnRyaWVzOyAKICBlbHNlCiAgICB4ZW50cmllcyA9IDE7CiAgCiAgbiA9IDA7CiAgCiAgZm9yIChrZXljPW1pbl9rZXljb2RlOyhrZXljPG1heF9rZXljb2RlKSAmJiAobjwqZW50cmllcyk7a2V5YysrKQogICAgewogICAgICAvKiBYIGtleWNvZGUgdG8gdmlydHVhbCBrZXkgKi8KICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4RkY7CiAgICAgIGlmIChrZXlzdGF0ZVt2a2V5XSA9PSAoSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldJjB4ODApKQoJY29udGludWU7CiAgICAgIGlmIChkb2QpIHsKCS8qIGFkZCBhbiBlbnRyeSAqLwoJZG9kW25dLmR3T2ZzCQk9IGtleWMtbWluX2tleWNvZGU7IC8qIHNjYW5jb2RlICovCglkb2Rbbl0uZHdEYXRhCQk9IElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSYweDgwOwoJZG9kW25dLmR3VGltZVN0YW1wCT0gMDsgLyogdW1tICovCglkb2Rbbl0uZHdTZXF1ZW5jZQk9IDA7IC8qIHVtbSAqLwoJbisrOwogICAgICB9CiAgICAgIGlmICghKGZsYWdzICYgRElHRERfUEVFSykpCglrZXlzdGF0ZVt2a2V5XSA9IElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSYweDgwOwogICAgICAKICAgIH0KICAKICBpZiAobikgVFJBQ0VfKGRpbnB1dCkoIiVkIGVudHJpZXNcbiIsbik7CiAgKmVudHJpZXMgPSBuOwoKICByZXR1cm4gVFJVRTsKfQo=