LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCiAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CgojaW5jbHVkZSAidHNfeGxpYi5oIgojaW5jbHVkZSAidHNfeHJlc291cmNlLmgiCiNpbmNsdWRlICJ0c194dXRpbC5oIgoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgImRpbnB1dC5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSAia2V5Ym9hcmQuaCIKI2luY2x1ZGUgIm1lc3NhZ2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJ4MTFkcnYuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXkpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGlucHV0KTsKCmV4dGVybiBCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwoKZXh0ZXJuIExQQllURSBwS2V5U3RhdGVUYWJsZTsKCmludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CldPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgQWx0R3JNYXNrOyAvKiBtYXNrIGluIHRoZSBYS2V5RXZlbnQgc3RhdGUgKi8Kc3RhdGljIGludCBrY0NvbnRyb2wsIGtjQWx0LCBrY1NoaWZ0LCBrY051bUxvY2ssIGtjQ2Fwc0xvY2s7IC8qIGtleWNvZGVzICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDgKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMyxWS18xLFZLXzIsVktfMyxWS180LFZLXzUsVktfNixWS183LFZLXzgsVktfOSxWS18wLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgVktfUSxWS19XLFZLX0UsVktfUixWS19ULFZLX1ksVktfVSxWS19JLFZLX08sVktfUCxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfQSxWS19TLFZLX0QsVktfRixWS19HLFZLX0gsVktfSixWS19LLFZLX0wsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgIFZLX1osVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX00sVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LFZLXzEsVktfMixWS18zLFZLXzQsVktfNSxWS182LFZLXzcsVktfOCxWS185LFZLXzAsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgIFZLX0EsVktfWixWS19FLFZLX1IsVktfVCxWS19ZLFZLX1UsVktfSSxWS19PLFZLX1AsVktfT0VNXzYsVktfT0VNXzEsCiAgIFZLX1EsVktfUyxWS19ELFZLX0YsVktfRyxWS19ILFZLX0osVktfSyxWS19MLFZLX00sVktfT0VNXzMsVktfT0VNXzUsCiAgIFZLX1csVktfWCxWS19DLFZLX1YsVktfQixWS19OLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyogRklYTUU6IGFkZCBvdGhlciBsYXlvdXRzLCBzdWNoIGFzIERWT1JBSyBhbmQgR2VybWFuIFFXRVJUWiAqLwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgLWRlYnVnbXNnICtrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAobW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV3ZSBCb25uZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwovKiAoWEZyZWU4NiByZXBvcnRzIHRoZSA8PiBrZXkgZXZlbiBpZiBpdCdzIG5vdCBwaHlzaWNhbGx5IHRoZXJlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUtbTUFJTl9MRU5dWzRdID0KewogImAiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ0AiLCIjfiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgRXJpYyBQb3VlY2gpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMn4iLCJcIjMjIiwiJzR7IiwiKDVbIiwiLTZ8Iiwi6DciLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjpCIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBS7WtoYXLwdXIgRWdpbHNzb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIvbWXFwiLCItXyIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInP34iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwitF4iLCIrKmAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBXZWlnYW5kKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIiciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjtCIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX25vZGVhZFtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIrQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBKb25hdGhhbiBOYXlsb3IpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NHW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErfCIsIjJcIkAiLCIzKiMiLCI05yIsIjUlIiwiNiasIiwiNy+mIiwiOCiiIiwiOSkiLCIwPSIsIic/tCIsIl5gfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86FsiLCKoIV0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OB7IiwiJKN9IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGhpbGlwcGUgRnJvaWRldmF1eCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0ZbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSt8IiwiMlwiQCIsIjMqIyIsIjTnIiwiNSUiLCI2JqwiLCI3L6YiLCI4KKIiLCI5KSIsIjA9IiwiJz+0IiwiXmB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8WyIsIqghXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5HsiLCIko30iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBCZXJ0aG8gU3R1bHRpZW5zKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9EQVtNQUlOX0xFTl1bNF0gPQp7CiAivaciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCK0YHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwi+NgiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQZXRlciBCb3J0YXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrP1xcIiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DRltNQUlOX0xFTl1bNF0gPQp7CiAiI3xcXCIsIjEhsSIsIjJcIkAiLCIzL6MiLCI0JKIiLCI1JaQiLCI2P6wiLCI3JqYiLCI4KrIiLCI5KLMiLCIwKbwiLCItX70iLCI9K74iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT6ciLCJwULYiLCJeXlsiLCK4qF0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6fiIsImBgeyIsIjw+fSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsJy0iLCIuIiwi6ckiLAogIqu7sCIKfTsKCi8qKiogUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRbTUFJTl9MRU5dWzRdID0KewogIlxcpiIsIjEhIiwiMlwiQCIsIjMjoyIsIjQkpyIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCInPyIsIqu7IiwKICJxUSIsICAid1ciLCJlRSIsICAiclIiLCAidFQiLCAieVkiLCAidVUiLCAiaUkiLCAib08iLCAicFAiLCAiKypcXKgiLCJcXCdcXGAiLAogImFBIiwgICJzUyIsImREIiwgICJmRiIsICJnRyIsICJoSCIsICJqSiIsICJrSyIsICJsTCIsICLnxyIsICK6qiIsICJcXH5cXF4iLAogInpaIiwgICJ4WCIsImNDIiwgICJ2ViIsICJiQiIsICJuTiIsICJtTSIsICIsOyIsICIuOiIsICItXyIsCiAiPD4iCn07CgovKioqIEl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxIbkiLCIyXCKyIiwiM6OzIiwiNCS8IiwiNSW9IiwiNia+IiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiJz9gIiwi7F5+IiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+CIsInBQ/iIsIujpWyIsIisqXSIsCiAiYUEiLCJzU98iLCJkRPAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLy50AiLCLgsCMiLCL5pyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU21IiwiLDsiLCIuOrciLCItXyIsCiAiPD58Igp9OwoKLyoqKiBGaW5uaXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GSVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiMSEiLCIyXCJAIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrP1xcIiwiXCdgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIiIsIlwiXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiIsIiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvc+kgTWFyY29zIEzzcGV6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqpcXCIsIjEhfCIsIjJcIkAiLCIztyMiLCI0JCIsIjUlIiwiNiasIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeWyIsIisqXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCInqHsiLCLnx30iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgWm9sdOFuIEtvduFjcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlsCIsIjYvsiIsIjc9YCIsIjgo/yIsIjkptCIsIvbWvSIsIvzcqCIsIvPTuCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSc0iLCJvT/giLCJwUCIsIvXV9yIsIvra1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpK7SIsImtLsyIsImxMoyIsIunJJCIsIuHB3yIsIvvbpCIsCiAieVk+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzsiLCIuOrciLCItXyoiLAogIu3NPCIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCK3IiwiMyNeIiwiNCSiIiwiNSWwIiwiNiayIiwiNy9gIiwiOCj/IiwiOSm0IiwiMD29IiwiJz+oIiwiKyq4IiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmp9yIsIvDQ1yIsCiAiYUEiLCJzUyIsImREIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIujIIiwi5sbfIiwivq6kIiwKICJ5WSIsInhYIiwiY0MiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTaciLCIsOyIsIi46IiwiLV8vIiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNlwiIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIidgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiO7BgJyIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwKSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvov9yIsIuQo1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi9FwiJCIsIqch3yIsIvIppCIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLCsIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz9cXCIsIqG/IiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XWAiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE5lcmlqdXMgQmFsaftuYXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIigoIiwiKSkiLCItXyIsIv7eIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgVUlOVCBsYXlvdXRfY3A7IC8qIENvZGUgcGFnZSBmb3IgdGhpcyBsYXlvdXQgKi8KICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsIDI4NTkxLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsIDI4NTkxLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogeyJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAyMDg2NiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsIDIwODY2LCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAyODU5MSwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7Ikl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTEsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgMjg1OTIsICZtYWluX2tleV9IUl9qZWxseSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgOTMyLCAmbWFpbl9rZXlfSkFfanAxMDYsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsIDkzMiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgMjg1OTIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsIDI4NTkyLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogeyJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAyODU5MiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7IkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsIDI4NTkxLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAyODYwMywgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKCiB7TlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgc3BlY2lhbF9rZXlfdmtleVtdID0KewogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwp9OwpzdGF0aWMgY29uc3QgV09SRCBzcGVjaWFsX2tleV9zY2FuW10gPQp7CiAgICAweDBFLCAweDBGLCAwLCAvKj8qLyAwLCAwLCAweDFDLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAgICAwLCAgICAwLCAweDQ1LCAweDQ2LCAwICAgLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAgICAwLCAgICAwLCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBjdXJzb3Jfa2V5X3ZrZXlbXSA9CnsKICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ORVhULCBWS19FTkQgICAgICAgICAgLyogRkY1MCAqLwp9OwpzdGF0aWMgY29uc3QgV09SRCBjdXJzb3Jfa2V5X3NjYW5bXSA9CnsKICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiAgICAgIC8qIEZGNTAgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1pc2Nfa2V5X3ZrZXlbXSA9CnsKICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwgMCwgMCwgMCwgIC8qIEZGNjAgKi8KICAgIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCBWS19DQU5DRUwgICAgICAgICAgICAgICAgICAgIC8qIEZGNjggKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQgbWlzY19rZXlfc2NhbltdID0KewogICAgLyo/Ki8gMCwgMHgxMzcsIC8qPyovIDAsIDB4MTUyLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY2OCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQga2V5cGFkX2tleV92a2V5W10gPQp7CiAgICAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogRkY3RSAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsIDAsCgkJCQkgVktfSU5TRVJULCBWS19ERUxFVEUsICAgICAgICAgIC8qIEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVDSU1BTCwgVktfRElWSURFLCAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgVktfTlVNUEFENCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQga2V5cGFkX2tleV9zY2FuW10gPQp7CiAgICAweDEzOCwgMHgxNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjdFICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAweDExQywgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICAweDRELCAweDUwLCAweDQ5LCAweDUxLCAweDRGLCAweDRDLCAweDUyLCAweDUzLCAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCAweDM3LCAweDRFLCAvKj8qLyAwLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICAweDUyLCAweDRGLCAweDUwLCAweDUxLCAweDRCLCAweDRDLCAweDRELCAweDQ3LCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCn07CiAgICAKc3RhdGljIGNvbnN0IFdPUkQgZnVuY3Rpb25fa2V5X3ZrZXlbXSA9CnsKICAgIFZLX0YxLCBWS19GMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQkUgKi8KICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYgICAgICAgICAgICAgIC8qIEZGQzggKi8KfTsKc3RhdGljIGNvbnN0IFdPUkQgZnVuY3Rpb25fa2V5X3NjYW5bXSA9CnsKICAgIDB4M0IsIDB4M0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQkUgKi8KICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQzggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1vZGlmaWVyX2tleV92a2V5W10gPQp7CiAgICBWS19TSElGVCwgVktfU0hJRlQsIFZLX0NPTlRST0wsIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIC8qIEZGRTEgKi8KICAgIFZLX01FTlUsIFZLX01FTlUsIFZLX01FTlUsIFZLX01FTlUgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFNyAqLwp9OwpzdGF0aWMgY29uc3QgV09SRCBtb2RpZmllcl9rZXlfc2NhbltdID0KewogICAgMHgyQSwgMHgzNiwgMHgxRCwgMHgxMUQsIDB4M0EsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkUxICovCiAgICAweDM4LCAweDEzOCwgMHgzOCwgMHgxMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTcgKi8KfTsKCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bTsKCiAgICBUU1hMb29rdXBTdHJpbmcoZSwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChrZXlzeW0gPj0gMHhGRkFFKSAmJiAoa2V5c3ltIDw9IDB4RkZCOSkgJiYgKGtleXN5bSAhPSAweEZGQUYpIAoJJiYgKGUtPnN0YXRlICYgTnVtTG9ja01hc2spKSAKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBrZXlwYWRfa2V5X3ZrZXlbKGtleXN5bSAmIDB4RkYpIC0gMHg3RV07CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKc3RhdGljIEJPT0wgTnVtU3RhdGU9RkFMU0UsIENhcHNTdGF0ZT1GQUxTRSwgQWx0R3JTdGF0ZT1GQUxTRTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlLRVlCT0FSRF9HZW5lcmF0ZU1zZwogKgogKiBHZW5lcmF0ZSBEb3duK1VwIG1lc3NhZ2VzIHdoZW4gTnVtTG9jayBvciBDYXBzTG9jayBpcyBwcmVzc2VkLgogKgogKiBDb252ZW50aW9uIDogY2FsbGVkIHdpdGggdmtleSBvbmx5IFZLX05VTUxPQ0sgb3IgVktfQ0FQSVRBTAogKgogKi8Kc3RhdGljIHZvaWQgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFdPUkQgdmtleSwgV09SRCBzY2FuLCBpbnQgRXZ0eXBlLCBJTlQgZXZlbnRfeCwgSU5UIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGV2ZW50X3RpbWUgKQp7CiAgQk9PTCAqIFN0YXRlID0gKHZrZXk9PVZLX05VTUxPQ0s/ICZOdW1TdGF0ZSA6ICZDYXBzU3RhdGUpOwogIERXT1JEIHVwLCBkb3duOwoKICBpZiAoKlN0YXRlKSB7CiAgICAvKiBUaGUgSU5URVJNRURJQVJZIHN0YXRlIG1lYW5zIDoganVzdCBhZnRlciBhICdwcmVzcycgZXZlbnQsIGlmIGEgJ3JlbGVhc2UnIGV2ZW50IGNvbWVzLAogICAgICAgZG9uJ3QgdHJlYXQgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCiAgICAgICBBbmQgZnJvbSB0aGVyZSwgYSAncmVsZWFzZScgZXZlbnQgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB0b2dnbGUga2V5LiAqLwogICAgKlN0YXRlPUZBTFNFOwogICAgVFJBQ0UoIklOVEVSTSA6IGRvblwndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4XG4iLHZrZXkscEtleVN0YXRlVGFibGVbdmtleV0pOwogIH0gZWxzZQogICAgewogICAgICAgIGRvd24gPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApOwogICAgICAgIHVwID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKSB8IEtFWUVWRU5URl9LRVlVUDsKCWlmICggcEtleVN0YXRlVGFibGVbdmtleV0gJiAweDEgKSAvKiBpdCB3YXMgT04gKi8KCSAgewoJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQoJICAgICAgewoJCVRSQUNFKCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIGRvd24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCSAgICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCB1cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCQkqU3RhdGU9RkFMU0U7CgkJcEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovIAoJICAgICAgfSAKCSAgfQoJZWxzZSAvKiBpdCB3YXMgT0ZGICovCgkgIGlmIChFdnR5cGU9PUtleVByZXNzKQoJICAgIHsKCSAgICAgIFRSQUNFKCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIGRvd24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIHVwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKCSAgICAgICpTdGF0ZT1UUlVFOyAvKiBHb2VzIHRvIGludGVybWVkaWFyeSBzdGF0ZSBiZWZvcmUgZ29pbmcgdG8gT04gKi8KCSAgICAgIHBLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvbi4gKi8KCSAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8Kc3RhdGljIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBpbnQgdmtleSwgaW50IHN0YXRlICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKHBLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsCiAgICAgICAgICAgICAgdmtleSwgcEtleVN0YXRlVGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCglLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIDAsIHN0YXRlPyAwIDogS0VZRVZFTlRGX0tFWVVQLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdldFRpY2tDb3VudCgpICk7CgogICAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciAlIy4yeCBcbiIscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LRVlCT0FSRF9VcGRhdGVTdGF0ZQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KQogKiB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQgKGNhbGxlZCBieSBFVkVOVF9Gb2N1c0luIGluIGV2ZW50LmMpCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuIChiZWNhdXNlIFhRdWVyeUtleW1hcCBzYXlzIG5vdGhpbmcKICogIGFib3V0IHRoZW0pCiAqLwp2b2lkIFgxMURSVl9LRVlCT0FSRF9VcGRhdGVTdGF0ZSAoIHZvaWQgKQp7Ci8qIGV4dHJhY3QgYSBiaXQgZnJvbSB0aGUgY2hhclszMl0gYml0IHN1aXRlICovCiNkZWZpbmUgS2V5U3RhdGUoa2V5Y29kZSkgKChrZXlzX3JldHVybltrZXljb2RlLzhdICYgKDE8PChrZXljb2RlJTgpKSkhPTApCgogICAgY2hhciBrZXlzX3JldHVyblszMl07CgogICAgVFJBQ0UoImNhbGxlZFxuIik7CiAgICBpZiAoIVRTWFF1ZXJ5S2V5bWFwKGRpc3BsYXksIGtleXNfcmV0dXJuKSkgewogICAgICAgIEVSUigiRXJyb3IgZ2V0dGluZyBrZXltYXAgISIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIEFMVCBhbmQgQ09OVFJPTCBzdGF0ZSBpZiBhbnkgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX01FTlUsIEtleVN0YXRlKGtjQWx0KSk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZShWS19DT05UUk9MLCBLZXlTdGF0ZShrY0NvbnRyb2wpKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX1NISUZULCBLZXlTdGF0ZShrY1NoaWZ0KSk7CiN1bmRlZiBLZXlTdGF0ZQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LRVlCT0FSRF9IYW5kbGVFdmVudAogKgogKiBIYW5kbGUgYSBYIGtleSBldmVudAogKi8Kdm9pZCBYMTFEUlZfS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFdORCAqcFduZCwgWEtleUV2ZW50ICpldmVudCApCnsKICAgIGNoYXIgU3RyWzI0XTsgCiAgICBLZXlTeW0ga2V5c3ltOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgc3RhdGljIEJPT0wgZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsgLyogaGFjayBmb3IgQWx0R3IgdHJhbnNsYXRpb24gKi8KICAgIGludCBhc2NpaV9jaGFyczsKCiAgICBJTlQgZXZlbnRfeCA9IChwV25kPyBwV25kLT5yZWN0V2luZG93LmxlZnQgOiAwKSArIGV2ZW50LT54OwogICAgSU5UIGV2ZW50X3kgPSAocFduZD8gcFduZC0+cmVjdFdpbmRvdy50b3AgIDogMCkgKyBldmVudC0+eTsKICAgIERXT1JEIGV2ZW50X3RpbWUgPSBldmVudC0+dGltZSAtIFgxMURSVl9zZXJ2ZXJfc3RhcnR0aWNrczsKCiAgICAvKiB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciBkZWFkIGtleXMgKi8KICAgIGlmICgoZXZlbnQtPmtleWNvZGUgPj4gOCkgPT0gMHgxMCkKCWV2ZW50LT5rZXljb2RlPShldmVudC0+a2V5Y29kZSAmIDB4ZmYpOwoKICAgIGFzY2lpX2NoYXJzID0gVFNYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBUUkFDRV8oa2V5KSgic3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKCiAgICAvKiBJZiBYS0IgZXh0ZW5zaW9ucyBpcyB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2VkIHRoZSBncm91cAogICAgICAgaW5kZXggaW5zdGVhZCBvZiB0aGUgbW9kaWZpZXIgbWFzay4gVGhlIGdyb3VwIGluZGV4IGlzIHNldCBpbiBiaXRzCiAgICAgICAxMy0xNCBvZiB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIFhLZXlFdmVudCBzdHJ1Y3R1cmUuIFNvIGlmIEFsdEdyIGlzCiAgICAgICBwcmVzc2VkLCBsb29rIGlmIHRoZSBncm91cCBpbmRleCBpcyBkaWZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IHNob3VsZCBmb3IgQWx0R3Igc2hvdWxkIAogICAgICAgYmUgMiAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgaWYgKCBBbHRHclN0YXRlICYmIChldmVudC0+c3RhdGUgJiAweDYwMDApICkKICAgICAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAweDYwMDA7CgogICAgaWYgKGtleXN5bSA9PSBYS19Nb2RlX3N3aXRjaCkKCXsKCVRSQUNFXyhrZXkpKCJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKCWV2ZW50LT5rZXljb2RlID0ga2NDb250cm9sOyAvKiBTaW11bGF0ZSBDb250cm9sICovCglYMTFEUlZfS0VZQk9BUkRfSGFuZGxlRXZlbnQoIHBXbmQsIGV2ZW50ICk7CgoJZXZlbnQtPmtleWNvZGUgPSBrY0FsdDsgLyogU2ltdWxhdGUgQWx0ICovCglmb3JjZV9leHRlbmRlZCA9IFRSVUU7CglYMTFEUlZfS0VZQk9BUkRfSGFuZGxlRXZlbnQoIHBXbmQsIGV2ZW50ICk7Cglmb3JjZV9leHRlbmRlZCA9IEZBTFNFOwogICAgCiAgICAvKiBIZXJlIHdlIHNhdmUgdGhlIHByZXNzZWQvcmVsZWFzZWQgc3RhdGUgb2YgdGhlIEFsdEdyIGtleSwgdG8gYmUgYWJsZSB0byAKICAgICAgIGlkZW50aWZ5IHRoZSBncm91cCBpbmRleCBhc3NvY2lhdGVkIHdpdGggQWx0R3Igb24gdGhlIG5leHQga2V5IHByZXNzZWQgKgogICAgICAgc2VlIGNvbW1lbnQgYWJvdmUuICovCiAgICBBbHRHclN0YXRlID0gKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/IFRSVUUgOiBGQUxTRTsKICAgIAoJcmV0dXJuOwoJfQoKICAgIFN0clthc2NpaV9jaGFyc10gPSAnXDAnOwogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY2hhcgkqa3NuYW1lOwoKCWtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkKCSAga3NuYW1lID0gIk5vIE5hbWUiOwoJVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVsWCAoJXMpLCBhc2NpaSBjaGFycz0ldSAvICVYIC8gJyVzJ1xuIiwgCiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIGFzY2lpX2NoYXJzLCBTdHJbMF0gJiAweGZmLCBTdHIpOwogICAgfQoKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KGV2ZW50KTsKICAgIGlmIChmb3JjZV9leHRlbmRlZCkgdmtleSB8PSAweDEwMDsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCiAgICAgICAgICAgICAgICBldmVudC0+a2V5Y29kZSwgdmtleSk7CgogICBpZiAodmtleSkKICAgewogICAgc3dpdGNoICh2a2V5ICYgMHhmZikKICAgIHsKICAgIGNhc2UgVktfTlVNTE9DSzogICAgCiAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBldmVudC0+dHlwZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX0NBUElUQUw6CiAgICAgIFRSQUNFKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnQtPnR5cGUsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lICk7IAogICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgOiAlIy4yeFxuIixwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKHBLZXlTdGF0ZVRhYmxlW1ZLX05VTUxPQ0tdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBOdW1Mb2NrTWFzaykpCgkgIHsgCgkgICAgVFJBQ0UoIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLiBcbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBLZXlQcmVzcywgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UmVsZWFzZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgfQogICAgICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKHBLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBMb2NrTWFzaykpCgkgIHsKICAgICAgICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlQcmVzcywgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UmVsZWFzZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgfQoJLyogTm90IE51bSBub3IgQ2FwcyA6IGVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzIGZvciBib3RoLiAqLwoJTnVtU3RhdGUgPSBGQUxTRTsKCUNhcHNTdGF0ZSA9IEZBTFNFOwoKCWJTY2FuID0ga2V5YzJzY2FuW2V2ZW50LT5rZXljb2RlXSAmIDB4RkY7CglUUkFDRV8oa2V5KSgiYlNjYW4gPSAweCUwMnguXG4iLCBiU2Nhbik7CgoJZHdGbGFncyA9IDA7CglpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKCWlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoJaWYgKCBmb3JjZV9leHRlbmRlZCApICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfV0lORV9GT1JDRUVYVEVOREVEOwoKCUtFWUJPQVJEX1NlbmRFdmVudCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dAogKgogKiBDYWxsZWQgZnJvbSBYMTFEUlZfSW5pdEtleWJvYXJkCiAqICBUaGlzIHJvdXRpbmUgd2Fsa3MgdGhyb3VnaCB0aGUgZGVmaW5lZCBrZXlib2FyZCBsYXlvdXRzIGFuZCBzZWxlY3RzCiAqICB3aGljaGV2ZXIgbWF0Y2hlcyBtb3N0IGNsb3NlbHkuCiAqLwpzdGF0aWMgdm9pZApYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0ICh2b2lkKQp7CiAgdW5zaWduZWQgY3VycmVudCwgbWF0Y2gsIG1pc21hdGNoLCBzZXE7CiAgaW50IHNjb3JlLCBrZXljLCBpLCBrZXksIHBrZXksIG9rLCBzeW1zOwogIEtleVN5bSBrZXlzeW07CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzRdID0KICB7MCwgMCwgMCwgMH07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNCIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewoJa2V5c3ltID0gVFNYS2V5Y29kZVRvS2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDApICYmIChrZXlzeW0gIT0gJyAnKSkKCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgllbHNlIHsKCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogICAgICBpZiAoY2tleVswXSkgewoJLyogc2VhcmNoIGZvciBhIG1hdGNoIGluIGxheW91dCB0YWJsZSAqLwoJLyogcmlnaHQgbm93LCB3ZSBqdXN0IGZpbmQgYW4gYWJzb2x1dGUgbWF0Y2ggZm9yIGRlZmluZWQgcG9zaXRpb25zICovCgkvKiAodW5kZWZpbmVkIHBvc2l0aW9ucyBhcmUgaWdub3JlZCwgc28gaWYgaXQncyBkZWZpbmVkIGFzICIzIyIgaW4gKi8KCS8qIHRoZSB0YWJsZSwgaXQncyBva2F5IHRoYXQgdGhlIFggc2VydmVyIGhhcyAiMyOjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewoJICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJWQsIGNoYXJhY3RlciAlY1xuIiwga2V5YywKCQkgY2tleVswXSk7CgkgIG1pc21hdGNoKys7CgkgIHNjb3JlIC09IHN5bXM7Cgl9CiAgICAgIH0KICAgIH0KICAgIFRSQUNFKCJtYXRjaGVzPSVkLCBtaXNtYXRjaGVzPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKSB7CiAgICBGSVhNRSgKCSAgICJZb3VyIGtleWJvYXJkIGxheW91dCB3YXMgbm90IGZvdW5kIVxuIgoJICAgIkluc3RlYWQgb2YgdXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuY29kZSBtYXBwaW5nLlxuIgoJICAgIlBsZWFzZSBkZWZpbmUgeW91ciBsYXlvdXQgaW4gd2luZG93cy94MTFkcnYva2V5Ym9hcmQuYyBhbmQgc3VibWl0IHRoZW1cbiIKCSAgICJ0byB1cyBmb3IgaW5jbHVzaW9uIGludG8gZnV0dXJlIFdpbmUgcmVsZWFzZXMuXG4iCgkgICAiU2VlIGRvY3VtZW50YXRpb24va2V5Ym9hcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iLAoJICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwogIH0KCiAgVFJBQ0UoImRldGVjdGVkIGxheW91dCBpcyBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCh2b2lkKQp7CiAgICBLZXlTeW0gKmtzcDsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleSwgT0VNdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CgogICAgVFNYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFRTWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFRTWEZyZWUoa3NwKTsKICAgIG1tcCA9IFRTWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CiAgICAgICAgCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwogICAgICAgICAgICAgICAgCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX01vZGVfc3dpdGNoKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFsdEdyTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIkFsdEdyTWFzayBpcyAleFxuIiwgQWx0R3JNYXNrKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgVFNYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgT0VNdmtleSA9IFZLX09FTV83OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIFRTWExvb2t1cFN0cmluZygmZTIsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBrZXkgPSBrZXlzeW0gJiAweGZmOwoJCQogICAgICAgICAgICAgICAgaWYgKGtleSA+PSAweDA4ICYmIGtleSA8PSAweDFCKSB7ICAgICAgICAvKiBzcGVjaWFsIGtleSAqLwoJCSAgICB2a2V5ID0gc3BlY2lhbF9rZXlfdmtleVtrZXkgLSAweDA4XTsKCQkgICAgc2NhbiA9IHNwZWNpYWxfa2V5X3NjYW5ba2V5IC0gMHgwOF07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweDUwICYmIGtleSA8PSAweDU3KSB7IC8qIGN1cnNvciBrZXkgKi8KCQkgICAgdmtleSA9IGN1cnNvcl9rZXlfdmtleVtrZXkgLSAweDUwXTsKCQkgICAgc2NhbiA9IGN1cnNvcl9rZXlfc2NhbltrZXkgLSAweDUwXTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpIHsgLyogbWlzY2VsbGFuZW91cyBrZXkgKi8KCQkgICAgdmtleSA9IG1pc2Nfa2V5X3ZrZXlba2V5IC0gMHg2MF07CgkJICAgIHNjYW4gPSBtaXNjX2tleV9zY2FuW2tleSAtIDB4NjBdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHg3RSAmJiBrZXkgPD0gMHhCOSkgeyAvKiBrZXlwYWQga2V5ICovCgkJICAgIHZrZXkgPSBrZXlwYWRfa2V5X3ZrZXlba2V5IC0gMHg3RV07CgkJICAgIHNjYW4gPSBrZXlwYWRfa2V5X3NjYW5ba2V5IC0gMHg3RV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweEJFICYmIGtleSA8PSAweENEKSB7IC8qIGZ1bmN0aW9uIGtleSAqLwogICAgICAgICAgICAgICAgICAgIHZrZXkgPSBmdW5jdGlvbl9rZXlfdmtleVtrZXkgLSAweEJFXSB8IDB4MTAwOyAvKiBzZXQgZXh0ZW5kZWQgYml0ICovCiAgICAgICAgICAgICAgICAgICAgc2NhbiA9IGZ1bmN0aW9uX2tleV9zY2FuW2tleSAtIDB4QkVdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHhFMSAmJiBrZXkgPD0gMHhFQSkgeyAvKiBtb2RpZmllciBrZXkgKi8KCQkgICAgdmtleSA9IG1vZGlmaWVyX2tleV92a2V5W2tleSAtIDB4RTFdOwoJCSAgICBzY2FuID0gbW9kaWZpZXJfa2V5X3NjYW5ba2V5IC0gMHhFMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAweEZGKSB7ICAgICAgICAgICAgICAgIC8qIERFTCBrZXkgKi8KCQkgICAgdmtleSA9IFZLX0RFTEVURTsKCQkgICAgc2NhbiA9IDB4MTUzOwoJCX0KCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMCkgJiYgKGtleXN5bSE9JyAnKSkgewoJCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KCiAgICAgICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KCSAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFZLXzAgJiYga2V5c3ltIDw9IFZLXzkpCiAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKSkgewoJCSAgICB2a2V5ID0ga2V5c3ltOwoJCX0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleXN5bSA9IFRTWExvb2t1cEtleXN5bSgmZTIsIGkpOwoJCXN3aXRjaCAoa2V5c3ltKQoJCXsKCQljYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8xOyBicmVhazsKCQljYXNlICcvJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8yOyBicmVhazsKCQljYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKCQljYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV80OyBicmVhazsKCQljYXNlICdcXCc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV81OyBicmVhazsKCQljYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV82OyBicmVhazsKCQljYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV83OyBicmVhazsKCQljYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9DT01NQTsgYnJlYWs7CgkJY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUEVSSU9EOyBicmVhazsKCQljYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9NSU5VUzsgYnJlYWs7CgkJY2FzZSAnKyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUExVUzsgYnJlYWs7CgkJfQoJICAgIH0KCiAgICAgICAgICAgIGlmICghdmtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogT3RoZXJzIGtleXM6IGxldCdzIGFzc2lnbiBPRU0gdmlydHVhbCBrZXkgY29kZXMgaW4gdGhlIGFsbG93ZWQgcmFuZ2UsCiAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIChbMHhiYSwweGMwXSwgWzB4ZGIsMHhlNF0sIDB4ZTYgKGdpdmVuIHVwKSBldCBbMHhlOSwweGY1XSkgKi8KICAgICAgICAgICAgICAgIHN3aXRjaCAoKytPRU12a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CgkJICAKICAgICAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIJKmtzbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFRTWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKCQkJICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgICAgIERQUklOVEYoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIERQUklOVEYoIilcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgIH0gLyogZm9yICovCgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAlMDJ4ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgLyogTm93IHN0b3JlIG9uZSBrZXljb2RlIGZvciBlYWNoIG1vZGlmaWVyLiBVc2VkIHRvIHNpbXVsYXRlIGtleXByZXNzZXMuICovCiAgICBrY0NvbnRyb2wgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKICAgIGtjQWx0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0FsdF9MKTsKICAgIGlmICgha2NBbHQpIGtjQWx0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX01ldGFfTCk7CiAgICBrY1NoaWZ0ID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX1NoaWZ0X0wpOwogICAga2NOdW1Mb2NrID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX051bV9Mb2NrKTsKICAgIGtjQ2Fwc0xvY2sgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfQ2Fwc19Mb2NrKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfVmtLZXlTY2FuCiAqLwpXT1JEIFgxMURSVl9Wa0tleVNjYW4oQ0hBUiBjQ2hhcikKewoJS2V5Q29kZSBrZXljb2RlOwoJS2V5U3ltIGtleXN5bTsgICAgCQoJaW50IGksaW5kZXg7CglpbnQgaGlnaGJ5dGU9MDsKCgkvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCglrZXlzeW09KHVuc2lnbmVkIGNoYXIpIGNDaGFyOy8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KCWlmIChrZXlzeW08PTI3KSBrZXlzeW0rPTB4RkYwMDsvKnNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiovCgkKCWtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCglpZiAoIWtleWNvZGUpCgl7IC8qIEl0IGRpZG4ndCB3b3JrIC4uLiBsZXQncyB0cnkgd2l0aCBkZWFkY2hhciBjb2RlLiAqLwoJICBrZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7Cgl9CgoJVFJBQ0UoIlZrS2V5U2NhbiAnJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4XG4iLAogICAgICAgICAgICAgIGNDaGFyLGtleXN5bSxrZXlzeW0sa2V5Y29kZSk7CgkKCWlmIChrZXljb2RlKQoJICB7CgkgICAgZm9yIChpbmRleD0tMSwgaT0wOyAoaTw4KSAmJiAoaW5kZXg8MCk7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwoJICAgICAgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LGtleWNvZGUsaSk9PWtleXN5bSkgaW5kZXg9aTsKCSAgICBzd2l0Y2ggKGluZGV4KSB7CgkgICAgY2FzZSAtMSA6CgkgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLGtleXN5bSk7IGJyZWFrOwoJICAgIGNhc2UgMCA6IGJyZWFrOwoJICAgIGNhc2UgMSA6IGhpZ2hieXRlID0gMHgwMTAwOyBicmVhazsKCSAgICBjYXNlIDIgOiBoaWdoYnl0ZSA9IDB4MDYwMDsgYnJlYWs7CgkgICAgY2FzZSAzIDogaGlnaGJ5dGUgPSAweDA3MDA7IGJyZWFrOwoJICAgIGRlZmF1bHQgOiBFUlIoImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CgkgICAgfQoJICAgIC8qCgkgICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCgkgICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCgkgICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKCSAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQoJICAgICAqLwoJICB9CglUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZSk7CglyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlOyAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9NYXBWaXJ0dWFsS2V5CiAqLwpVSU5UMTYgWDExRFJWX01hcFZpcnR1YWxLZXkoVUlOVDE2IHdDb2RlLCBVSU5UMTYgd01hcFR5cGUpCnsKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKCVRSQUNFKCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uIFxuIiwgd0NvZGUsd01hcFR5cGUpOwoJc3dpdGNoKHdNYXBUeXBlKSB7CgkJY2FzZSAwOgl7IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCgkJCQkJcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMTogeyAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCgkJCS8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQoJCQkJCXJldHVybk1WSyAoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gdmtleS1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsgfQoKCQljYXNlIDI6IHsgLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KCQkJLyogKHdhcyBGSVhNRSkgOiB3aGF0IGRvZXMgdW5zaGlmdGVkIG1lYW4gPyAnYScgb3IgJ0EnID8gKi8KCQkgICAgICAgIC8qIE15IFdpbmRvd3MgcmV0dXJucyAnQScuICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiAoWExvb2t1cFN0cmluZykgYW5zaSBjaGFyICovCgkJCVhLZXlFdmVudCBlOwoJCQlLZXlTeW0ga2V5c3ltOwoJCQlpbnQga2V5YzsKCQkJY2hhciBzWzJdOwoJCQllLmRpc3BsYXkgPSBkaXNwbGF5OwoJCQllLnN0YXRlID0gMDsgLyogdW5zaGlmdGVkICovCgoJCQllLmtleWNvZGUgPSAwOwoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CgkJCQkgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawoJCQkJCSBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCWlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCgkJCSAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKICAgICAgICAgIAoJCQlpZiAod0NvZGU9PVZLX0RFQ0lNQUwpCgkJCSAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIiwgd0NvZGUpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgoJCQlpZiAoVFNYTG9va3VwU3RyaW5nKCZlLCBzLCAyLCAma2V5c3ltLCBOVUxMKSkKCQkJICByZXR1cm5NVksgKCpzKTsKCQkJCgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwoJCQlyZXR1cm4gMDsKCQkJfQoKCQljYXNlIDM6ICAgLyogKipOVCBvbmx5Kiogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSBidXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAgKi8KICAgICAgICAgICAgICAJCSAgLyogICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgICovCgkJICAgICAgICAgIEZJWE1FKCIgc3R1YiBmb3IgTlRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwoKCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlXQVJOKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7CQoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0dldEtleU5hbWVUZXh0CiAqLwpJTlQxNiBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQxNiBuU2l6ZSkKewogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCQogIHNjYW5Db2RlID0gbFBhcmFtID4+IDE2OwogIHNjYW5Db2RlICY9IDB4MWZmOyAgLyoga2VlcCAiZXh0ZW5kZWQta2V5IiBmbGFnIHdpdGggY29kZSAqLwoKICAvKiBGSVhNRTogc2hvdWxkIHVzZSBNVksgdHlwZSAzIChOVCB2ZXJzaW9uIHRoYXQgZGlzdGluZ3Vpc2hlcyByaWdodCBhbmQgbGVmdCAqLwogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleShzY2FuQ29kZSwgMSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5KHZrZXksIDIpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyKChjaGFyKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9IAogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXljXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXljIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAga2V5cyA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKICAgICAgbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXMpOwogICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JTA0eCBrZXlzeW09JTA0eCBzdHJpbmc9JXNcbiIsCiAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCAoaW50KWtleXMsIG5hbWUpOwogICAgICBpZiAobHBCdWZmZXIgJiYgblNpemUgJiYgbmFtZSkKICAgICAgewogICAgICAgICAgbHN0cmNweW5BKGxwQnVmZmVyLCBuYW1lLCBuU2l6ZSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgfQogIH0KCiAgLyogRmluYWxseSBpc3N1ZSBGSVhNRSBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgRklYTUUoIiglMDhseCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDR4LCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgaWYgKGxwQnVmZmVyICYmIG5TaXplKQogICAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsJIAoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfVG9Vbmljb2RlCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgWDExRFJWX1RvVW5pY29kZShVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIExQQllURSBscEtleVN0YXRlLAoJCSAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MpCnsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKICAgIEJZVEUgbHBDaGFyWzJdOwoKICAgIGlmIChzY2FuQ29kZT09MCkgewogICAgICAgIC8qIFRoaXMgaGFwcGVucyB3aGVuIGRvaW5nIEFsdCtsZXR0ZXIgOiBhIGZha2UgJ2Rvd24gYXJyb3cnIGtleSBwcmVzcwogICAgICAgICAgIGV2ZW50IGlzIGdlbmVyYXRlZCBieSB3aW5kb3dzLiBKdXN0IGlnbm9yZSBpdC4gKi8KICAgICAgICBUUkFDRSgic2NhbkNvZGU9MCwgZG9pbmcgbm90aGluZ1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglpZiAobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApCgkgICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgllbHNlCgkgICAgZS5zdGF0ZSB8PSBDb250cm9sTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKCWUuc3RhdGUgfD0gTnVtTG9ja01hc2s7CiAgICBUUkFDRV8oa2V5KSgiKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKICAgICAgICAgIAogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgogICAgaWYgKCFlLmtleWNvZGUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIix2aXJ0S2V5KTsKCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgcmV0ID0gVFNYTG9va3VwU3RyaW5nKCZlLCAoTFBWT0lEKWxwQ2hhciwgMiwgJmtleXN5bSwgTlVMTCk7CiAgICBpZiAocmV0ID09IDApCgl7CglCWVRFIGRlYWRfY2hhcjsKCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQoJICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sYXlvdXRfY3AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CgkgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjaGFyCSprc25hbWU7CgoJICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCUVSUigiUGxlYXNlIHJlcG9ydDogbm8gY2hhciBmb3Iga2V5c3ltICUwNGxYICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJRVJSKCIodmlydEtleT0lWCxzY2FuQ29kZT0lWCxrZXljb2RlPSVYLHN0YXRlPSVYKVxuIiwKICAgICAgICAgICAgICAgICAgICB2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgIT0gMCAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QgCiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sKi8KICAgICAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0EnKSkgfHwKICAgICAgICAgICAgICAgICgoa2V5c3ltID4gJ1onKSAmJiAoa2V5c3ltIDwgJ2EnKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICAqKGNoYXIqKWxwQ2hhciA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgICooY2hhciopbHBDaGFyID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IGZyb20gY29kZSBwYWdlICVkIHRvIHVuaWNvZGVcbiIsCgkJKihCWVRFICopbHBDaGFyLCBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGF5b3V0X2NwKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sYXlvdXRfY3AsIDAsIChMUENTVFIpbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9CgogICAgVFJBQ0VfKGtleSkoIlRvVW5pY29kZSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4ICVzXG4iLAoJCXJldCwgYnVmVyA/IGJ1ZldbMF0gOiAwLCBidWZXID8gIiIgOiAiKG5vIGJ1ZmZlcikiKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0dldEJlZXBBY3RpdmUKICovCkJPT0wgWDExRFJWX0dldEJlZXBBY3RpdmUodm9pZCkKewogIFhLZXlib2FyZFN0YXRlICBrZXlib2FyZF9zdGF0ZTsKCiAgVFNYR2V0S2V5Ym9hcmRDb250cm9sKGRpc3BsYXksICZrZXlib2FyZF9zdGF0ZSk7CgogIHJldHVybiBrZXlib2FyZF9zdGF0ZS5iZWxsX3BlcmNlbnQgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfU2V0QmVlcEFjdGl2ZQogKi8Kdm9pZCBYMTFEUlZfU2V0QmVlcEFjdGl2ZShCT09MIGJBY3RpdmF0ZSkKewogIFhLZXlib2FyZENvbnRyb2wga2V5Ym9hcmRfdmFsdWU7CiAgCiAgaWYoYkFjdGl2YXRlKQogICAga2V5Ym9hcmRfdmFsdWUuYmVsbF9wZXJjZW50ID0gLTE7CiAgZWxzZQogICAga2V5Ym9hcmRfdmFsdWUuYmVsbF9wZXJjZW50ID0gMDsKICAKICBUU1hDaGFuZ2VLZXlib2FyZENvbnRyb2woZGlzcGxheSwgS0JCZWxsUGVyY2VudCwgJmtleWJvYXJkX3ZhbHVlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfQmVlcAogKi8Kdm9pZCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgVFNYQmVsbChkaXNwbGF5LCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfR2V0RElTdGF0ZQogKi8KQk9PTCBYMTFEUlZfR2V0RElTdGF0ZShEV09SRCBsZW4sIExQVk9JRCBwdHIpCnsKICBpZiAobGVuPT0yNTYpIHsKICAgIGludCBrZXljLHZrZXk7CiAgICAKICAgIG1lbXNldChwdHIsMCwyNTYpOwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlO2tleWM8bWF4X2tleWNvZGU7a2V5YysrKQogICAgICB7CgkvKiBYIGtleWNvZGUgdG8gdmlydHVhbCBrZXkgKi8KCXZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwoJLyogVGhlIHdpbmRvd3Mgc2NhbmNvZGUgaXMga2V5Yy1taW5fa2V5Y29kZSAqLwoJaWYgKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSYweDgwKSB7CgkgICgoTFBCWVRFKXB0cilba2V5Yy1taW5fa2V5Y29kZV09MHg4MDsKCSAgKChMUEJZVEUpcHRyKVsoa2V5Yy1taW5fa2V5Y29kZSl8MHg4MF09MHg4MDsKCX0KICAgICAgfQogICAgcmV0dXJuIFRSVUU7CiAgfQogIFdBUk4oIndob29wcywgZ290IGxlbiAlbGQ/XG4iLCBsZW4pOwogIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9HZXRESURhdGEKICovCkJPT0wgWDExRFJWX0dldERJRGF0YSgKICBCWVRFICprZXlzdGF0ZSwKICBEV09SRCBkb2RzaXplLCBMUERJREVWSUNFT0JKRUNUREFUQSBkb2QsCiAgTFBEV09SRCBlbnRyaWVzLCBEV09SRCBmbGFncykKewogIGludCBrZXljLG4sdmtleSx4ZW50cmllczsKICAgIAogIC8qIEZJWE1FICEhISAqLwogIAogIGlmIChlbnRyaWVzKQogICAgeGVudHJpZXMgPSAqZW50cmllczsgCiAgZWxzZQogICAgeGVudHJpZXMgPSAxOwogIAogIG4gPSAwOwogIAogIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsoa2V5YzxtYXhfa2V5Y29kZSkgJiYgKG48KmVudHJpZXMpO2tleWMrKykKICAgIHsKICAgICAgLyogWCBrZXljb2RlIHRvIHZpcnR1YWwga2V5ICovCiAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwogICAgICBpZiAoa2V5c3RhdGVbdmtleV0gPT0gKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSYweDgwKSkKCWNvbnRpbnVlOwogICAgICBpZiAoZG9kKSB7CgkvKiBhZGQgYW4gZW50cnkgKi8KCWRvZFtuXS5kd09mcwkJPSBrZXljLW1pbl9rZXljb2RlOyAvKiBzY2FuY29kZSAqLwoJZG9kW25dLmR3RGF0YQkJPSBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0mMHg4MDsKCWRvZFtuXS5kd1RpbWVTdGFtcAk9IDA7IC8qIHVtbSAqLwoJZG9kW25dLmR3U2VxdWVuY2UJPSAwOyAvKiB1bW0gKi8KCW4rKzsKICAgICAgfQogICAgICBpZiAoIShmbGFncyAmIERJR0REX1BFRUspKQoJa2V5c3RhdGVbdmtleV0gPSBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0mMHg4MDsKICAgICAgCiAgICB9CiAgCiAgaWYgKG4pIFRSQUNFXyhkaW5wdXQpKCIlZCBlbnRyaWVzXG4iLG4pOwogICplbnRyaWVzID0gbjsKCiAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0dldEtleWJvYXJkQ29uZmlnCiAqLwp2b2lkIFgxMURSVl9HZXRLZXlib2FyZENvbmZpZyhLRVlCT0FSRF9DT05GSUcgKmNmZykgewogIFhLZXlib2FyZFN0YXRlICAgeGtzOwoKICAvKiBGb3IgdGhlIG1vbWVudCwgb25seSBnZXQgdGhlIGF1dG8tcmVwZWF0IG1vZGUgKi8KICBUU1hHZXRLZXlib2FyZENvbnRyb2woZGlzcGxheSwgJnhrcyk7CiAgY2ZnLT5hdXRvX3JlcGVhdCA9IHhrcy5nbG9iYWxfYXV0b19yZXBlYXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX1NldEtleWJvYXJkQ29uZmlnCiAqLwpleHRlcm4gdm9pZCBYMTFEUlZfU2V0S2V5Ym9hcmRDb25maWcoS0VZQk9BUkRfQ09ORklHICpjZmcsIERXT1JEIG1hc2spIHsKICBYS2V5Ym9hcmRDb250cm9sIHhrYzsKICB1bnNpZ25lZCBsb25nIFhfbWFzayA9IDA7CiAgCiAgaWYgKG1hc2sgJiBXSU5FX0tFWUJPQVJEX0NPTkZJR19BVVRPX1JFUEVBVCkgewogICAgWF9tYXNrIHw9IEtCQXV0b1JlcGVhdE1vZGU7CiAgICB4a2MuYXV0b19yZXBlYXRfbW9kZSA9IGNmZy0+YXV0b19yZXBlYXQ7CiAgfQogIGlmIChYX21hc2spCiAgICBUU1hDaGFuZ2VLZXlib2FyZENvbnRyb2woZGlzcGxheSwgWF9tYXNrLCAmeGtjKTsKfQoK