LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCiAqIENvcHlyaWdodCAxOTk3IERhdmlkIEZhdXJlCiAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAogKiBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaWZuZGVmIFhfRElTUExBWV9NSVNTSU5HCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlICJ0c194bGliLmgiCiNpbmNsdWRlICJ0c194cmVzb3VyY2UuaCIKI2luY2x1ZGUgInRzX3h1dGlsLmgiCgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgImRpbnB1dC5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAia2V5Ym9hcmQuaCIKI2luY2x1ZGUgIm1lc3NhZ2UuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ4MTFkcnYuaCIKCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXkpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXlib2FyZCkKREVDTEFSRV9ERUJVR19DSEFOTkVMKHgxMWRydikKCmV4dGVybiBCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwoKZXh0ZXJuIExQQllURSBwS2V5U3RhdGVUYWJsZTsKCmludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CldPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgQWx0R3JNYXNrOyAvKiBtYXNrIGluIHRoZSBYS2V5RXZlbnQgc3RhdGUgKi8Kc3RhdGljIGludCBrY0NvbnRyb2wsIGtjQWx0LCBrY1NoaWZ0LCBrY051bUxvY2ssIGtjQ2Fwc0xvY2s7IC8qIGtleWNvZGVzICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDgKc3RhdGljIGNvbnN0IGludCBtYWluX2tleV9zY2FuW01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIC1kZWJ1Z21zZyAra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/Igp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBFcmljIFBvdWVjaCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyfiIsIlwiMyMiLCInNHsiLCIoNVsiLCItNnwiLCLoNyIsIl84XFwiLCLnOV6xIiwi4DBAIiwiKbBdIiwiPSt9IiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKOkIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JSIsIiq1IiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCIhpyIsCiAiPD4iCn07CgovKioqIEljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFLta2hhcvB1ciBFZ2lsc3NvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVNbTUFJTl9MRU5dWzRdID0KewogIrAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi9tZcXCIsIi1fIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/fiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0XiIsIisqYCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46Iiwi/t4iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgVWxyaWNoIFdlaWdhbmQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiO0IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIE5heWxvcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0dbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSt8IiwiMlwiQCIsIjMqIyIsIjTnIiwiNSUiLCI2JqwiLCI3L6YiLCI4KKIiLCI5KSIsIjA9IiwiJz+0IiwiXmB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoWyIsIqghXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9ukiLCLk4HsiLCIko30iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQaGlsaXBwZSBGcm9pZGV2YXV4KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRltNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxK3wiLCIyXCJAIiwiMyojIiwiNOciLCI1JSIsIjYmrCIsIjcvpiIsIjgooiIsIjkpIiwiMD0iLCInP7QiLCJeYH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PxbIiwiqCFdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLp9iIsIuDkeyIsIiSjfSIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+XFwiCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEJlcnRobyBTdHVsdGllbnMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIrRgfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBldGVyIEJvcnRhcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/XFwiLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApvCIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIrioXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzp+IiwiYGB7IiwiPD59IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnLSIsIi4iLCLpySIsCiAiq7uwIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFymIiwiMSEiLCIyXCJAIiwiMyOjIiwiNCSnIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIic/Iiwiq7siLAogInFRIiwgICJ3VyIsImVFIiwgICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICIrKlxcqCIsIlxcJ1xcYCIsCiAiYUEiLCAgInNTIiwiZEQiLCAgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIufHIiwgIrqqIiwgIlxcflxcXiIsCiAieloiLCAgInhYIiwiY0MiLCAgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw7IiwgIi46IiwgIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhMSIsIjJcIjIiLCIzPzMiLCI0JCIsIjUlvSIsIjYmviIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIic/YCIsImlefiIsCiAicVFAIiwid1ciLCJlRSIsInJSPyIsInRUIiwieVkiLCJ1VSIsImlJIiwib09vIiwicFA/IiwiZWVbIiwiKypdIiwKICJhQWFlIiwic1M/IiwiZEQ/IiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwib2NAIiwiYT8jIiwidT8iLAogInpaPCIsInhYPiIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0/IiwiLDsiLCIuOioiLCItXyIsIjw+fCIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIiIsIjEhIiwiMlwiQCIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz9cXCIsIlwnYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIiLCJcIl5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIiLCIiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBKb3PpIE1hcmNvcyBM83BleikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVNbTUFJTl9MRU5dWzRdID0KewogIrqqXFwiLCIxIXwiLCIyXCJAIiwiM7cjIiwiNCQiLCI1JSIsIjYmrCIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKhvyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJgXlsiLCIrKl0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwiJ6h7Iiwi58d9IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBzdHJ1Y3QgewogV09SRCBsYW5nLCBhbnNpX2NvZGVwYWdlLCBvZW1fY29kZXBhZ2U7CiBjb25zdCBjaGFyICgqa2V5KVtNQUlOX0xFTl1bNF07Cn0gbWFpbl9rZXlfdGFiW109ewoge01BS0VMQU5HSUQoTEFOR19FTkdMSVNILFNVQkxBTkdfRU5HTElTSF9VUyksICAgICAxMjUyLCA0MzcsICZtYWluX2tleV9VU30sCiB7TUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsU1VCTEFOR19FTkdMSVNIX1VLKSwgICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X1VLfSwKIHtNQUtFTEFOR0lEKExBTkdfR0VSTUFOLFNVQkxBTkdfREVGQVVMVCksICAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfREV9LAoge01BS0VMQU5HSUQoTEFOR19HRVJNQU4sU1VCTEFOR19HRVJNQU5fU1dJU1MpLCAgICAxMjUyLCA4NTAsICZtYWluX2tleV9TR30sCiB7TUFLRUxBTkdJRChMQU5HX1NXRURJU0gsU1VCTEFOR19TV0VESVNIKSwgICAgICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X1NFfSwKIHtNQUtFTEFOR0lEKExBTkdfTk9SV0VHSUFOLFNVQkxBTkdfREVGQVVMVCksICAgICAgMTI1MiwgODY1LCAmbWFpbl9rZXlfTk99LAoge01BS0VMQU5HSUQoTEFOR19EQU5JU0gsU1VCTEFOR19ERUZBVUxUKSwgICAgICAgICAxMjUyLCA4NjUsICZtYWluX2tleV9EQX0sCiB7TUFLRUxBTkdJRChMQU5HX0ZSRU5DSCxTVUJMQU5HX0RFRkFVTFQpLCAgICAgICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0ZSfSwKIHtNQUtFTEFOR0lEKExBTkdfRlJFTkNILFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOKSwgMTI1MiwgODYzLCAmbWFpbl9rZXlfQ0Z9LAoge01BS0VMQU5HSUQoTEFOR19GUkVOQ0gsU1VCTEFOR19GUkVOQ0hfQkVMR0lBTiksICAxMjUyLCA4NTAsICZtYWluX2tleV9CRX0sCiB7TUFLRUxBTkdJRChMQU5HX0ZSRU5DSCxTVUJMQU5HX0ZSRU5DSF9TV0lTUyksICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X1NGfSwKIHtNQUtFTEFOR0lEKExBTkdfV0FMT04sU1VCTEFOR19ERUZBVUxUKSwgICAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfQkV9LAoge01BS0VMQU5HSUQoTEFOR19QT1JUVUdVRVNFLFNVQkxBTkdfREVGQVVMVCksICAgICAxMjUyLCA4NjAsICZtYWluX2tleV9QVH0sCiB7TUFLRUxBTkdJRChMQU5HX0ZJTk5JU0gsU1VCTEFOR19ERUZBVUxUKSwgICAgICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0ZJfSwKIHtNQUtFTEFOR0lEKExBTkdfUlVTU0lBTixTVUJMQU5HX0RFRkFVTFQpLCAgICAgICAgMTI1MSwgODY2LCAmbWFpbl9rZXlfUlV9LAoge01BS0VMQU5HSUQoTEFOR19TUEFOSVNILFNVQkxBTkdfREVGQVVMVCksICAgICAgICAxMjUyLCA4NTAsICZtYWluX2tleV9FU30sCiB7TUFLRUxBTkdJRChMQU5HX0RVVENILFNVQkxBTkdfRFVUQ0hfQkVMR0lBTiksICAgIDEyNTIsIDg1MCwgJm1haW5fa2V5X0JFfSwKIHtNQUtFTEFOR0lEKExBTkdfSVRBTElBTixTVUJMQU5HX0RFRkFVTFQpLCAgICAgICAgMTI1MiwgODUwLCAmbWFpbl9rZXlfSVR9LAoge01BS0VMQU5HSUQoTEFOR19JQ0VMQU5ESUMsU1VCTEFOR19ERUZBVUxUKSwgICAgICAxMjUyLCA4NTAsICZtYWluX2tleV9JU30sCgogezB9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBpbnQgc3BlY2lhbF9rZXlfdmtleVtdID0KewogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwp9OwpzdGF0aWMgY29uc3QgaW50IHNwZWNpYWxfa2V5X3NjYW5bXSA9CnsKICAgIDB4MEUsIDB4MEYsIDAsIC8qPyovIDAsIDAsIDB4MUMsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsICAgIDAsICAgIDAsIDB4NDUsIDB4NDYsIDAgICAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsICAgIDAsICAgIDAsIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgY3Vyc29yX2tleV92a2V5W10gPQp7CiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTkVYVCwgVktfRU5EICAgICAgICAgIC8qIEZGNTAgKi8KfTsKc3RhdGljIGNvbnN0IGludCBjdXJzb3Jfa2V5X3NjYW5bXSA9CnsKICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiAgICAgIC8qIEZGNTAgKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgbWlzY19rZXlfdmtleVtdID0KewogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLCAwLCAwLCAwLCAgLyogRkY2MCAqLwogICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX01FTlUgICAgICAgICAgICAgICAgICAgICAgLyogRkY2OCAqLwp9OwpzdGF0aWMgY29uc3QgaW50IG1pc2Nfa2V5X3NjYW5bXSA9CnsKICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIEZGNjAgKi8KICAgIC8qPyovIDAsIC8qPyovIDAsIDB4MzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNjggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQga2V5cGFkX2tleV92a2V5W10gPQp7CiAgICAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogRkY3RSAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsIDAsCgkJCQkgVktfSU5TRVJULCBWS19ERUxFVEUsICAgICAgICAgIC8qIEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVDSU1BTCwgVktfRElWSURFLCAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgVktfTlVNUEFENCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KfTsKc3RhdGljIGNvbnN0IGludCBrZXlwYWRfa2V5X3NjYW5bXSA9CnsKICAgIDB4MTM4LCAweDE0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGN0UgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDB4MTFDLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDB4NDcsIDB4NEIsIDB4NDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIDB4MzcsIDB4NEUsIC8qPyovIDAsIDB4NEEsIDB4NTMsIDB4MTM1LCAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KfTsKICAgIApzdGF0aWMgY29uc3QgaW50IGZ1bmN0aW9uX2tleV92a2V5W10gPQp7CiAgICBWS19GMSwgVktfRjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkJFICovCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2ICAgICAgICAgICAgICAvKiBGRkM4ICovCn07CnN0YXRpYyBjb25zdCBpbnQgZnVuY3Rpb25fa2V5X3NjYW5bXSA9CnsKICAgIDB4M0IsIDB4M0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQkUgKi8KICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQzggKi8KfTsKCnN0YXRpYyBjb25zdCBpbnQgbW9kaWZpZXJfa2V5X3ZrZXlbXSA9CnsKICAgIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgLyogRkZFMSAqLwogICAgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCn07CnN0YXRpYyBjb25zdCBpbnQgbW9kaWZpZXJfa2V5X3NjYW5bXSA9CnsKICAgIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMSAqLwogICAgMHgzOCwgMHgxMzgsIDB4MzgsIDB4MTM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCn07CgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW07CgogICAgVFNYTG9va3VwU3RyaW5nKGUsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoa2V5c3ltID49IDB4RkZBRSkgJiYgKGtleXN5bSA8PSAweEZGQjkpICYmIChrZXlzeW0gIT0gMHhGRkFGKSAKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkgCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4ga2V5cGFkX2tleV92a2V5WyhrZXlzeW0gJiAweEZGKSAtIDB4N0VdOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgSU5UIGV2ZW50X3gsIElOVCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBldmVudF90aW1lICkKewogIEJPT0wgKiBTdGF0ZSA9ICh2a2V5PT1WS19OVU1MT0NLPyAmTnVtU3RhdGUgOiAmQ2Fwc1N0YXRlKTsKICBEV09SRCB1cCwgZG93bjsKCiAgaWYgKCpTdGF0ZSkgewogICAgLyogVGhlIElOVEVSTUVESUFSWSBzdGF0ZSBtZWFucyA6IGp1c3QgYWZ0ZXIgYSAncHJlc3MnIGV2ZW50LCBpZiBhICdyZWxlYXNlJyBldmVudCBjb21lcywKICAgICAgIGRvbid0IHRyZWF0IGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgogICAgICAgQW5kIGZyb20gdGhlcmUsIGEgJ3JlbGVhc2UnIGV2ZW50IHdpbGwgc3dpdGNoIG9mZiB0aGUgdG9nZ2xlIGtleS4gKi8KICAgICpTdGF0ZT1GQUxTRTsKICAgIFRSQUNFXyhrZXlib2FyZCkoIklOVEVSTSA6IGRvblwndCB0cmVhdCByZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4XG4iLHZrZXkscEtleVN0YXRlVGFibGVbdmtleV0pOwogIH0gZWxzZQogICAgewogICAgICAgIGRvd24gPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApOwogICAgICAgIHVwID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKSB8IEtFWUVWRU5URl9LRVlVUDsKCWlmICggcEtleVN0YXRlVGFibGVbdmtleV0gJiAweDEgKSAvKiBpdCB3YXMgT04gKi8KCSAgewoJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQoJICAgICAgewoJCVRSQUNFXyhrZXlib2FyZCkoIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICAgIEtFWUJPQVJEX1NlbmRFdmVudCggdmtleSwgc2NhbiwgZG93biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSApOwoJICAgICAgICBLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIHNjYW4sIHVwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSApOwoJCSpTdGF0ZT1GQUxTRTsKCQlwS2V5U3RhdGVUYWJsZVt2a2V5XSAmPSB+MHgwMTsgLyogVG9nZ2xlIHN0YXRlIHRvIG9mZi4gKi8gCgkgICAgICB9IAoJICB9CgllbHNlIC8qIGl0IHdhcyBPRkYgKi8KCSAgaWYgKEV2dHlwZT09S2V5UHJlc3MpCgkgICAgewoJICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiT0ZGICsgS2V5cHJlc3MgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCBkb3duLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSApOwoJICAgICAgS0VZQk9BUkRfU2VuZEV2ZW50KCB2a2V5LCBzY2FuLCB1cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF94LCBldmVudF95LCBldmVudF90aW1lICk7CgkgICAgICAqU3RhdGU9VFJVRTsgLyogR29lcyB0byBpbnRlcm1lZGlhcnkgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIE9OICovCgkgICAgICBwS2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb24uICovCgkgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlCiAqCiAqIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgZm9yIDx2a2V5PiwgZGVwZW5kaW5nIG9uIGtleSA8c3RhdGU+IHVuZGVyIFgKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggaW50IHZrZXksIGludCBzdGF0ZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBUUkFDRV8oa2V5Ym9hcmQpKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsCiAgICAgICAgICAgICAgdmtleSwgcEtleVN0YXRlVGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCglLRVlCT0FSRF9TZW5kRXZlbnQoIHZrZXksIDAsIHN0YXRlPyAwIDogS0VZRVZFTlRGX0tFWVVQLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdldFRpY2tDb3VudCgpICk7CgogICAgICAgIFRSQUNFXyhrZXlib2FyZCkoIlN0YXRlIGFmdGVyICUjLjJ4IFxuIixwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tFWUJPQVJEX1VwZGF0ZVN0YXRlCiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpCiAqIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZCAoY2FsbGVkIGJ5IEVWRU5UX0ZvY3VzSW4gaW4gZXZlbnQuYykKICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4gKGJlY2F1c2UgWFF1ZXJ5S2V5bWFwIHNheXMgbm90aGluZwogKiAgYWJvdXQgdGhlbSkKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX1VwZGF0ZVN0YXRlICggdm9pZCApCnsKLyogZXh0cmFjdCBhIGJpdCBmcm9tIHRoZSBjaGFyWzMyXSBiaXQgc3VpdGUgKi8KI2RlZmluZSBLZXlTdGF0ZShrZXljb2RlKSAoKGtleXNfcmV0dXJuW2tleWNvZGUvOF0gJiAoMTw8KGtleWNvZGUlOCkpKSE9MCkKCiAgICBjaGFyIGtleXNfcmV0dXJuWzMyXTsKCiAgICBUUkFDRV8oa2V5Ym9hcmQpKCJjYWxsZWRcbiIpOwogICAgaWYgKCFUU1hRdWVyeUtleW1hcChkaXNwbGF5LCBrZXlzX3JldHVybikpIHsKICAgICAgICBFUlJfKGtleWJvYXJkKSgiRXJyb3IgZ2V0dGluZyBrZXltYXAgISIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIEFMVCBhbmQgQ09OVFJPTCBzdGF0ZSBpZiBhbnkgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX01FTlUsIEtleVN0YXRlKGtjQWx0KSk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZShWS19DT05UUk9MLCBLZXlTdGF0ZShrY0NvbnRyb2wpKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKFZLX1NISUZULCBLZXlTdGF0ZShrY1NoaWZ0KSk7CiN1bmRlZiBLZXlTdGF0ZQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LRVlCT0FSRF9IYW5kbGVFdmVudAogKgogKiBIYW5kbGUgYSBYIGtleSBldmVudAogKi8Kdm9pZCBYMTFEUlZfS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFdORCAqcFduZCwgWEtleUV2ZW50ICpldmVudCApCnsKICAgIGNoYXIgU3RyWzI0XTsgCiAgICBYQ29tcG9zZVN0YXR1cyBjczsgCiAgICBLZXlTeW0ga2V5c3ltOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgc3RhdGljIEJPT0wgZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsgLyogaGFjayBmb3IgQWx0R3IgdHJhbnNsYXRpb24gKi8KICAgIAogICAgaW50IGFzY2lpX2NoYXJzOwoKICAgIElOVCBldmVudF94ID0gKHBXbmQ/IHBXbmQtPnJlY3RXaW5kb3cubGVmdCA6IDApICsgZXZlbnQtPng7CiAgICBJTlQgZXZlbnRfeSA9IChwV25kPyBwV25kLT5yZWN0V2luZG93LnRvcCAgOiAwKSArIGV2ZW50LT55OwogICAgRFdPUkQgZXZlbnRfdGltZSA9IGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzOwoKICAgIC8qIHRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIGRlYWQga2V5cyAqLwogICAgaWYgKChldmVudC0+a2V5Y29kZSA+PiA4KSA9PSAweDEwKQoJZXZlbnQtPmtleWNvZGU9KGV2ZW50LT5rZXljb2RlICYgMHhmZik7CgogICAgYXNjaWlfY2hhcnMgPSBUU1hMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKCiAgICBUUkFDRV8oa2V5KSgiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKICAgIGlmIChrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCgl7CglUUkFDRV8oa2V5KSgiQWx0IEdyIGtleSBldmVudCByZWNlaXZlZFxuIik7CglldmVudC0+a2V5Y29kZSA9IGtjQ29udHJvbDsgLyogU2ltdWxhdGUgQ29udHJvbCAqLwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwoKCWV2ZW50LT5rZXljb2RlID0ga2NBbHQ7IC8qIFNpbXVsYXRlIEFsdCAqLwoJZm9yY2VfZXh0ZW5kZWQgPSBUUlVFOwoJWDExRFJWX0tFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwoJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKCXJldHVybjsKCX0KCiAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNoYXIJKmtzbmFtZTsKCglrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAoJCSAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCgkJICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIFN0clswXSAmIDB4ZmYsIFN0cik7CiAgICB9CgogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoZXZlbnQpOwogICAgaWYgKGZvcmNlX2V4dGVuZGVkKSB2a2V5IHw9IDB4MTAwOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKCQkgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgaWYgKHZrZXkpCiAgIHsKICAgIHN3aXRjaCAodmtleSAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIFZLX05VTUxPQ0s6ICAgIAogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgZXZlbnQtPnR5cGUsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DQVBJVEFMOgogICAgICBUUkFDRV8oa2V5Ym9hcmQpKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUscEtleVN0YXRlVGFibGVbdmtleV0pOwogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnQtPnR5cGUsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lICk7IAogICAgICBUUkFDRV8oa2V5Ym9hcmQpKCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIEFkanVzdCB0aGUgTlVNTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKCSAgeyAKCSAgICBUUkFDRV8oa2V5Ym9hcmQpKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS4gXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UHJlc3MsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVJlbGVhc2UsIGV2ZW50X3gsIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lICk7CgkgIH0KICAgICAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCglpZiAoIShwS2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spKQoJICB7CiAgICAgICAgICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlQcmVzcywgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UmVsZWFzZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUgKTsKCSAgfQoJLyogTm90IE51bSBub3IgQ2FwcyA6IGVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzIGZvciBib3RoLiAqLwoJTnVtU3RhdGUgPSBGQUxTRTsKCUNhcHNTdGF0ZSA9IEZBTFNFOwoKCWJTY2FuID0ga2V5YzJzY2FuW2V2ZW50LT5rZXljb2RlXSAmIDB4RkY7CglUUkFDRV8oa2V5KSgiYlNjYW4gPSAweCUwMnguXG4iLCBiU2Nhbik7CgoJZHdGbGFncyA9IDA7CglpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKCWlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoJaWYgKCBmb3JjZV9leHRlbmRlZCApICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfV0lORV9GT1JDRUVYVEVOREVEOwoKCUtFWUJPQVJEX1NlbmRFdmVudCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3gsIGV2ZW50X3ksIGV2ZW50X3RpbWUgKTsKICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dAogKgogKiBDYWxsZWQgZnJvbSBYMTFEUlZfS0VZQk9BUkRfSW5pdAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCAodm9pZCkKewogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxOwogIGludCBzY29yZSwga2V5YywgaSwga2V5LCBwa2V5LCBvaywgc3ltczsKICBLZXlTeW0ga2V5c3ltOwogIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgdW5zaWduZWQgbWF4X3NlcSA9IDA7CiAgaW50IG1heF9zY29yZSA9IDAsIGlzbWF0Y2ggPSAwOwogIGNoYXIgY2tleVs0XSA9CiAgezAsIDAsIDAsIDB9OwoKICBzeW1zID0ga2V5c3ltc19wZXJfa2V5Y29kZTsKICBpZiAoc3ltcyA+IDQpIHsKICAgIFdBUk5fKGtleWJvYXJkKSgiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNCIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5sYW5nOyBjdXJyZW50KyspIHsKICAgIFRSQUNFXyhrZXlib2FyZCkoIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBsYXlvdXQgJTA0eFxuIiwKCSAgIG1haW5fa2V5X3RhYltjdXJyZW50XS5sYW5nKTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgLyogZ2V0IGRhdGEgZm9yIGtleWNvZGUgZnJvbSBYIHNlcnZlciAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltczsgaSsrKSB7CglrZXlzeW0gPSBUU1hLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMCkgJiYgKGtleXN5bSAhPSAnICcpKQoJICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKCWVsc2UgewoJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJfQogICAgICB9CiAgICAgIGlmIChja2V5WzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI6MiLCBmb3IgZXhhbXBsZSkgKi8KCS8qIGhvd2V2ZXIsIHRoZSBzY29yZSB3aWxsIGJlIGhpZ2hlciBmb3IgbG9uZ2VyIG1hdGNoZXMgKi8KCWZvciAoa2V5ID0gMDsga2V5IDwgTUFJTl9MRU47IGtleSsrKSB7CgkgIGZvciAob2sgPSAwLCBpID0gMDsgKG9rID49IDApICYmIChpIDwgc3ltcyk7IGkrKykgewoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSA9PSBja2V5W2ldKSkKCSAgICAgIG9rKys7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldICE9IGNrZXlbaV0pKQoJICAgICAgb2sgPSAtMTsKCSAgfQoJICBpZiAob2sgPiAwKSB7CgkgICAgc2NvcmUgKz0gb2s7CgkgICAgYnJlYWs7CgkgIH0KCX0KCS8qIGNvdW50IHRoZSBtYXRjaGVzIGFuZCBtaXNtYXRjaGVzICovCglpZiAob2sgPiAwKSB7CgkgIG1hdGNoKys7CgkgIC8qIGFuZCBob3cgbXVjaCB0aGUga2V5Y29kZSBvcmRlciBtYXRjaGVzICovCgkgIGlmIChrZXkgPiBwa2V5KSBzZXErKzsKCSAgcGtleSA9IGtleTsKCX0gZWxzZSB7CgkgIFRSQUNFXyhrZXkpKCJtaXNtYXRjaCBmb3Iga2V5Y29kZSAlZCwgY2hhcmFjdGVyICVjXG4iLCBrZXljLAoJCSBja2V5WzBdKTsKCSAgbWlzbWF0Y2grKzsKCSAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0VfKGtleWJvYXJkKSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkgewogICAgRklYTUVfKGtleWJvYXJkKSgKCSAgICJZb3VyIGtleWJvYXJkIGxheW91dCB3YXMgbm90IGZvdW5kIVxuIgoJICAgIkluc3RlYWQgdXNpbmcgY2xvc2VzdCBtYXRjaCAoJTA0eCkgZm9yIHNjYW5jb2RlIG1hcHBpbmcuXG4iCgkgICAiUGxlYXNlIGRlZmluZSB5b3VyIGxheW91dCBpbiB3aW5kb3dzL3gxMWRydi9rZXlib2FyZC5jIGFuZCBzdWJtaXQgdGhlbVxuIgoJICAgInRvIHVzIGZvciBpbmNsdXNpb24gaW50byBmdXR1cmUgV2luZSByZWxlYXNlcy5cbiIKCSAgICJTZWUgZG9jdW1lbnRhdGlvbi9rZXlib2FyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsCgkgICBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGFuZyk7CiAgfQogIFRSQUNFXyhrZXlib2FyZCkoImRldGVjdGVkIGxheW91dCBpcyAlMDR4XG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGFuZyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfSW5pdAogKi8Kdm9pZCBYMTFEUlZfS0VZQk9BUkRfSW5pdCh2b2lkKQp7CiAgICBLZXlTeW0gKmtzcDsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleSwgT0VNdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CgogICAgVFNYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFRTWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFRTWEZyZWUoa3NwKTsKICAgIG1tcCA9IFRTWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CiAgICAgICAgCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwogICAgICAgICAgICAgICAgCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX01vZGVfc3dpdGNoKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFsdEdyTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIkFsdEdyTWFzayBpcyAleFxuIiwgQWx0R3JNYXNrKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgVFNYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgT0VNdmtleSA9IFZLX09FTV83OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIFRTWExvb2t1cFN0cmluZygmZTIsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBrZXkgPSBrZXlzeW0gJiAweGZmOwoJCQogICAgICAgICAgICAgICAgaWYgKGtleSA+PSAweDA4ICYmIGtleSA8PSAweDFCKSB7ICAgICAgICAvKiBzcGVjaWFsIGtleSAqLwoJCSAgICB2a2V5ID0gc3BlY2lhbF9rZXlfdmtleVtrZXkgLSAweDA4XTsKCQkgICAgc2NhbiA9IHNwZWNpYWxfa2V5X3NjYW5ba2V5IC0gMHgwOF07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweDUwICYmIGtleSA8PSAweDU3KSB7IC8qIGN1cnNvciBrZXkgKi8KCQkgICAgdmtleSA9IGN1cnNvcl9rZXlfdmtleVtrZXkgLSAweDUwXTsKCQkgICAgc2NhbiA9IGN1cnNvcl9rZXlfc2NhbltrZXkgLSAweDUwXTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpIHsgLyogbWlzY2VsbGFuZW91cyBrZXkgKi8KCQkgICAgdmtleSA9IG1pc2Nfa2V5X3ZrZXlba2V5IC0gMHg2MF07CgkJICAgIHNjYW4gPSBtaXNjX2tleV9zY2FuW2tleSAtIDB4NjBdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHg3RSAmJiBrZXkgPD0gMHhCOSkgeyAvKiBrZXlwYWQga2V5ICovCgkJICAgIHZrZXkgPSBrZXlwYWRfa2V5X3ZrZXlba2V5IC0gMHg3RV07CgkJICAgIHNjYW4gPSBrZXlwYWRfa2V5X3NjYW5ba2V5IC0gMHg3RV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA+PSAweEJFICYmIGtleSA8PSAweENEKSB7IC8qIGZ1bmN0aW9uIGtleSAqLwogICAgICAgICAgICAgICAgICAgIHZrZXkgPSBmdW5jdGlvbl9rZXlfdmtleVtrZXkgLSAweEJFXSB8IDB4MTAwOyAvKiBzZXQgZXh0ZW5kZWQgYml0ICovCiAgICAgICAgICAgICAgICAgICAgc2NhbiA9IGZ1bmN0aW9uX2tleV9zY2FuW2tleSAtIDB4QkVdOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPj0gMHhFMSAmJiBrZXkgPD0gMHhFQSkgeyAvKiBtb2RpZmllciBrZXkgKi8KCQkgICAgdmtleSA9IG1vZGlmaWVyX2tleV92a2V5W2tleSAtIDB4RTFdOwoJCSAgICBzY2FuID0gbW9kaWZpZXJfa2V5X3NjYW5ba2V5IC0gMHhFMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAweEZGKSB7ICAgICAgICAgICAgICAgIC8qIERFTCBrZXkgKi8KCQkgICAgdmtleSA9IFZLX0RFTEVURTsKCQkgICAgc2NhbiA9IDB4MTUzOwoJCX0KCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFRTWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMCkgJiYgKGtleXN5bSE9JyAnKSkgewoJCSAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJc2NhbiA9IG1haW5fa2V5X3NjYW5bbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CgogICAgICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCgkgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5c3ltID0gVFNYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBWS18wICYmIGtleXN5bSA8PSBWS185KQogICAgICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gVktfQSAmJiBrZXlzeW0gPD0gVktfWikpIHsKCQkgICAgdmtleSA9IGtleXN5bTsKCQl9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKCQlzd2l0Y2ggKGtleXN5bSkKCQl7CgkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CgkJY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMjsgYnJlYWs7CgkJY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMzsgYnJlYWs7CgkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CgkJY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNTsgYnJlYWs7CgkJY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNjsgYnJlYWs7CgkJY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CgkJY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fQ09NTUE7IGJyZWFrOwoJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CgkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOwoJCWNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BMVVM7IGJyZWFrOwoJCX0KCSAgICB9CgogICAgICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCsrT0VNdmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBXQVJOXyhrZXlib2FyZCkoIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CgkJICAKICAgICAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiT0VNIHNwZWNpZmljIHZpcnR1YWwga2V5ICVYIGFzc2lnbmVkIHRvIGtleWNvZGUgJVg6XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VNdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiKCIpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyCSprc25hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCgkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwogICAgICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCAiJWxYICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCIpXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICB9IC8qIGZvciAqLwoKICAgIC8qIElmIHNvbWUga2V5cyBzdGlsbCBsYWNrIHNjYW5jb2RlcywgYXNzaWduIHNvbWUgYXJiaXRyYXJ5IG9uZXMgdG8gdGhlbSBub3cgKi8KICAgIGZvciAoc2NhbiA9IDB4NjAsIGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdJiYha2V5YzJzY2FuW2tleWNdKSB7CgljaGFyICprc25hbWU7CglrZXlzeW0gPSBUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJOb1N5bWJvbCI7CgoJLyogc2hvdWxkIG1ha2Ugc3VyZSB0aGUgc2NhbmNvZGUgaXMgdW5hc3NpZ25lZCBoZXJlLCBidXQgPj0weDYwIGN1cnJlbnRseSBhbHdheXMgaXMgKi8KCglUUkFDRV8oa2V5KSgiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIC8qIE5vdyBzdG9yZSBvbmUga2V5Y29kZSBmb3IgZWFjaCBtb2RpZmllci4gVXNlZCB0byBzaW11bGF0ZSBrZXlwcmVzc2VzLiAqLwogICAga2NDb250cm9sID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CiAgICBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19BbHRfTCk7CiAgICBpZiAoIWtjQWx0KSBrY0FsdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19NZXRhX0wpOwogICAga2NTaGlmdCA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19TaGlmdF9MKTsKICAgIGtjTnVtTG9jayA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19OdW1fTG9jayk7CiAgICBrY0NhcHNMb2NrID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NhcHNfTG9jayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX1ZrS2V5U2NhbgogKi8KV09SRCBYMTFEUlZfS0VZQk9BUkRfVmtLZXlTY2FuKENIQVIgY0NoYXIpCnsKCUtleUNvZGUga2V5Y29kZTsKCUtleVN5bSBrZXlzeW07ICAgIAkKCWludCBpLGluZGV4OwoJaW50IGhpZ2hieXRlPTA7CgoJLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwoJa2V5c3ltPSh1bnNpZ25lZCBjaGFyKSBjQ2hhcjsvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCglpZiAoa2V5c3ltPD0yNykga2V5c3ltKz0weEZGMDA7LypzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4qLwoJCglrZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwoJaWYgKCFrZXljb2RlKQoJeyAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwoJfQoKCVRSQUNFXyhrZXlib2FyZCkoIlZrS2V5U2NhbiAnJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4XG4iLAoJCQkgY0NoYXIsa2V5c3ltLGtleXN5bSxrZXljb2RlKTsKCQoJaWYgKGtleWNvZGUpCgkgIHsKCSAgICBmb3IgKGluZGV4PS0xLCBpPTA7IChpPDgpICYmIChpbmRleDwwKTsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCgkgICAgICBpZiAoVFNYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksa2V5Y29kZSxpKT09a2V5c3ltKSBpbmRleD1pOwoJICAgIHN3aXRjaCAoaW5kZXgpIHsKCSAgICBjYXNlIC0xIDoKCSAgICAgIFdBUk5fKGtleWJvYXJkKSgiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIixrZXlzeW0pOyBicmVhazsKCSAgICBjYXNlIDAgOiBicmVhazsKCSAgICBjYXNlIDEgOiBoaWdoYnl0ZSA9IDB4MDEwMDsgYnJlYWs7CgkgICAgY2FzZSAyIDogaGlnaGJ5dGUgPSAweDA2MDA7IGJyZWFrOwoJICAgIGNhc2UgMyA6IGhpZ2hieXRlID0gMHgwNzAwOyBicmVhazsKCSAgICBkZWZhdWx0IDogRVJSXyhrZXlib2FyZCkoImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CgkgICAgfQoJICAgIC8qCgkgICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCgkgICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKCSAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCgkgICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKCSAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQoJICAgICAqLwoJICB9CglUUkFDRV8oa2V5Ym9hcmQpKCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlKTsKCXJldHVybiBrZXljMnZrZXlba2V5Y29kZV0raGlnaGJ5dGU7ICAgLyoga2V5Y29kZSAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcFZpcnR1YWxLZXkKICovClVJTlQxNiBYMTFEUlZfS0VZQk9BUkRfTWFwVmlydHVhbEtleShVSU5UMTYgd0NvZGUsIFVJTlQxNiB3TWFwVHlwZSkKewojZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBUUkFDRV8oa2V5Ym9hcmQpKCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0KCglUUkFDRV8oa2V5Ym9hcmQpKCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uIFxuIiwKCQkJIHdDb2RlLHdNYXBUeXBlKTsKCXN3aXRjaCh3TWFwVHlwZSkgewoJCWNhc2UgMDoJeyAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkJCXJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CgkJCVRSQUNFXyhrZXlib2FyZCkoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMTogeyAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCgkJCS8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQoJCQkJCXJldHVybk1WSyAoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik7CgkJCVRSQUNFXyhrZXlib2FyZCkoInJldHVybmluZyBubyB2a2V5LWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMjogeyAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLwoJCQkvKiAod2FzIEZJWE1FKSA6IHdoYXQgZG9lcyB1bnNoaWZ0ZWQgbWVhbiA/ICdhJyBvciAnQScgPyAqLwoJCSAgICAgICAgLyogTXkgV2luZG93cyByZXR1cm5zICdBJy4gKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljOwoJCQljaGFyIHNbMl07CgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOyAvKiB1bnNoaWZ0ZWQgKi8KCgkJCWUua2V5Y29kZSA9IDA7CgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwogICAgICAgICAgCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTl8oa2V5Ym9hcmQpKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsIHdDb2RlKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRV8oa2V5Ym9hcmQpKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgoJCQlpZiAoVFNYTG9va3VwU3RyaW5nKCZlLCBzLCAyLCAma2V5c3ltLCBOVUxMKSkKCQkJICByZXR1cm5NVksgKCpzKTsKCQkJCgkJCVRSQUNFXyhrZXlib2FyZCkoInJldHVybmluZyBubyBBTlNJLlxuIik7CgkJCXJldHVybiAwOwoJCQl9CgoJCWNhc2UgMzogICAvKiAqKk5UIG9ubHkqKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlIGJ1dCBkaXN0aW5ndWlzaCBiZXR3ZWVuICAqLwogICAgICAgICAgICAgIAkJICAvKiAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAgKi8KCQkgICAgICAgICAgRklYTUVfKGtleWJvYXJkKSgiIHN0dWIgZm9yIE5UXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKCgkJZGVmYXVsdDogLyogcmVzZXJ2ZWQgKi8KCQkJV0FSTl8oa2V5Ym9hcmQpKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsCgkJCQl3TWFwVHlwZSk7CgkJCXJldHVybiAwOwkKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9HZXRLZXlOYW1lVGV4dAogKi8KSU5UMTYgWDExRFJWX0tFWUJPQVJEX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFNUUiBscEJ1ZmZlciwgSU5UMTYgblNpemUpCnsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgkKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgLyogRklYTUU6IHNob3VsZCB1c2UgTVZLIHR5cGUgMyAoTlQgdmVyc2lvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgcmlnaHQgYW5kIGxlZnQgKi8KICB2a2V5ID0gWDExRFJWX0tFWUJPQVJEX01hcFZpcnR1YWxLZXkoc2NhbkNvZGUsIDEpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfS0VZQk9BUkRfTWFwVmlydHVhbEtleSh2a2V5LCAyKTsKICBUUkFDRV8oa2V5Ym9hcmQpKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLAogICAgICAgICAgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmICgoblNpemUgPj0gMikgJiYgbHBCdWZmZXIpCgl7CiAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlcigoY2hhcilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfSAKICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5Y10pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5YyA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIGtleXMgPSBUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBUU1hLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JTA0eCBrZXlzeW09JTA0eCBzdHJpbmc9JXNcbiIsCiAgICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgIHsKICAgICAgICAgIHN0cm5jcHkobHBCdWZmZXIsIG5hbWUsIG5TaXplKTsKICAgICAgICAgIHJldHVybiAxOwogICAgICB9CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIEZJWE1FIGZvciB1bmtub3duIGtleXMgICAqLwoKICBGSVhNRV8oa2V5Ym9hcmQpKCIoJTA4bHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CSAKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0VfKGtleWJvYXJkKSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfVG9Bc2NpaQogKgogKiBUaGUgVG9Bc2NpaSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVDE2IFgxMURSVl9LRVlCT0FSRF9Ub0FzY2lpKAogICAgVUlOVDE2IHZpcnRLZXksVUlOVDE2IHNjYW5Db2RlLCBMUEJZVEUgbHBLZXlTdGF0ZSwgCiAgICBMUFZPSUQgbHBDaGFyLCBVSU5UMTYgZmxhZ3MpCnsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIHN0YXRpYyBYQ29tcG9zZVN0YXR1cyBjczsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKCiAgICBpZiAoc2NhbkNvZGU9PTApIHsKICAgICAgICAvKiBUaGlzIGhhcHBlbnMgd2hlbiBkb2luZyBBbHQrbGV0dGVyIDogYSBmYWtlICdkb3duIGFycm93JyBrZXkgcHJlc3MKICAgICAgICAgICBldmVudCBpcyBnZW5lcmF0ZWQgYnkgd2luZG93cy4gSnVzdCBpZ25vcmUgaXQuICovCiAgICAgICAgVFJBQ0VfKGtleWJvYXJkKSgic2NhbkNvZGU9MCwgZG9pbmcgbm90aGluZ1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0VfKGtleWJvYXJkKSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgaWYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCWlmIChscEtleVN0YXRlW1ZLX01FTlVdICYgMHg4MCkKCSAgICBlLnN0YXRlIHw9IEFsdEdyTWFzazsKCWVsc2UKCSAgICBlLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAoJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KCZlKSAmIDB4RkYpICE9IHZpcnRLZXkpIHsKICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgIH0KCSAgfQogICAgICB9CgogICAgaWYgKCh2aXJ0S2V5Pj1WS19OVU1QQUQwKSAmJiAodmlydEtleTw9VktfTlVNUEFEOSkpCiAgICAgICAgZS5rZXljb2RlID0gVFNYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOwogICAgICAgICAgCiAgICBpZiAodmlydEtleT09VktfREVDSU1BTCkKICAgICAgICBlLmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCiAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgewoJV0FSTl8oa2V5Ym9hcmQpKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CglyZXR1cm4gdmlydEtleTsgLyogd2hhdGV2ZXIgKi8KICAgICAgfQogICAgZWxzZSBUUkFDRV8oa2V5Ym9hcmQpKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgcmV0ID0gVFNYTG9va3VwU3RyaW5nKCZlLCAoTFBWT0lEKWxwQ2hhciwgMiwgJmtleXN5bSwgJmNzKTsKICAgIGlmIChyZXQgPT0gMCkKCXsKCUJZVEUgZGVhZF9jaGFyID0gMDsKCgkoKGNoYXIqKWxwQ2hhcilbMV0gPSAnXDAnOwoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKCSAgICB7CgkgICAgKihjaGFyKilscENoYXIgPSBkZWFkX2NoYXI7CgkgICAgcmV0ID0gLTE7CgkgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjaGFyCSprc25hbWU7CgoJICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCUVSUl8oa2V5Ym9hcmQpKCJQbGVhc2UgcmVwb3J0OiBubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAoJCQlrZXlzeW0sIGtzbmFtZSk7CgkJRVJSXyhrZXlib2FyZCkoIih2aXJ0S2V5PSVYLHNjYW5Db2RlPSVYLGtleWNvZGU9JVgsc3RhdGU9JVgpXG4iLAoJCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgPSAxICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCiAgICAgICAgICAgICYmIChrZXlzeW0+PVhLX0tQXzApICYmIChrZXlzeW08PVhLX0tQXzkpKQogICAgICAgIHsKICAgICAgICAgICAgKihjaGFyKilscENoYXIgPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBXZSBoYXZlIGFub3RoZXIgc3BlY2lhbCBjYXNlIGZvciBkZWxldGUga2V5IChYS19EZWxldGUpIG9uIGFuCiAgICAgICAgIGV4dGVuZGVkIGtleWJvYXJkLiBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndCAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRGVsZXRlKQogICAgICAgIHsKICAgICAgICAgICAgKihjaGFyKilscENoYXIgPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRV8oa2V5KSgiVG9Bc2NpaSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4XG4iLAoJCXJldCwgKihjaGFyKilscENoYXIpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfR2V0QmVlcEFjdGl2ZQogKi8KQk9PTCBYMTFEUlZfS0VZQk9BUkRfR2V0QmVlcEFjdGl2ZSgpCnsKICBYS2V5Ym9hcmRTdGF0ZSAga2V5Ym9hcmRfc3RhdGU7CgogIFRTWEdldEtleWJvYXJkQ29udHJvbChkaXNwbGF5LCAma2V5Ym9hcmRfc3RhdGUpOwoKICByZXR1cm4ga2V5Ym9hcmRfc3RhdGUuYmVsbF9wZXJjZW50ICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX1NldEJlZXBBY3RpdmUKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX1NldEJlZXBBY3RpdmUoQk9PTCBiQWN0aXZhdGUpCnsKICBYS2V5Ym9hcmRDb250cm9sIGtleWJvYXJkX3ZhbHVlOwogIAogIGlmKGJBY3RpdmF0ZSkKICAgIGtleWJvYXJkX3ZhbHVlLmJlbGxfcGVyY2VudCA9IC0xOwogIGVsc2UKICAgIGtleWJvYXJkX3ZhbHVlLmJlbGxfcGVyY2VudCA9IDA7CiAgCiAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKGRpc3BsYXksIEtCQmVsbFBlcmNlbnQsICZrZXlib2FyZF92YWx1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0JlZXAKICovCnZvaWQgWDExRFJWX0tFWUJPQVJEX0JlZXAoKQp7CiAgVFNYQmVsbChkaXNwbGF5LCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfR2V0RElTdGF0ZQogKi8KQk9PTCBYMTFEUlZfS0VZQk9BUkRfR2V0RElTdGF0ZShEV09SRCBsZW4sIExQVk9JRCBwdHIpCnsKICBpZiAobGVuPT0yNTYpIHsKICAgIGludCBrZXljLHZrZXk7CiAgICAKICAgIG1lbXNldChwdHIsMCwyNTYpOwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlO2tleWM8bWF4X2tleWNvZGU7a2V5YysrKQogICAgICB7CgkvKiBYIGtleWNvZGUgdG8gdmlydHVhbCBrZXkgKi8KCXZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwoJLyogVGhlIHdpbmRvd3Mgc2NhbmNvZGUgaXMga2V5Yy1taW5fa2V5Y29kZSAqLwoJaWYgKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSYweDgwKSB7CgkgICgoTFBCWVRFKXB0cilba2V5Yy1taW5fa2V5Y29kZV09MHg4MDsKCSAgKChMUEJZVEUpcHRyKVsoa2V5Yy1taW5fa2V5Y29kZSl8MHg4MF09MHg4MDsKCX0KICAgICAgfQogICAgcmV0dXJuIFRSVUU7CiAgfQogIFdBUk5fKHgxMWRydikoIndob29wcywgWDExRFJWX0tFWUJPQVJEX0dldFN0YXRlIGdvdCBsZW4gJWxkP1xuIiwgbGVuKTsKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfR2V0RElEYXRhCiAqLwpCT09MIFgxMURSVl9LRVlCT0FSRF9HZXRESURhdGEoCiAgQllURSAqa2V5c3RhdGUsCiAgRFdPUkQgZG9kc2l6ZSwgTFBESURFVklDRU9CSkVDVERBVEEgZG9kLAogIExQRFdPUkQgZW50cmllcywgRFdPUkQgZmxhZ3MpCnsKICBpbnQga2V5YyxuLHZrZXkseGVudHJpZXM7CiAgICAKICAvKiBGSVhNRSAhISEgKi8KICAKICBpZiAoZW50cmllcykKICAgIHhlbnRyaWVzID0gKmVudHJpZXM7IAogIGVsc2UKICAgIHhlbnRyaWVzID0gMTsKICAKICBuID0gMDsKICAKICBmb3IgKGtleWM9bWluX2tleWNvZGU7KGtleWM8bWF4X2tleWNvZGUpICYmIChuPCplbnRyaWVzKTtrZXljKyspCiAgICB7CiAgICAgIC8qIFgga2V5Y29kZSB0byB2aXJ0dWFsIGtleSAqLwogICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhGRjsKICAgICAgaWYgKGtleXN0YXRlW3ZrZXldID09IChJbnB1dEtleVN0YXRlVGFibGVbdmtleV0mMHg4MCkpCgljb250aW51ZTsKICAgICAgaWYgKGRvZCkgewoJLyogYWRkIGFuIGVudHJ5ICovCglkb2Rbbl0uZHdPZnMJCT0ga2V5Yy1taW5fa2V5Y29kZTsgLyogc2NhbmNvZGUgKi8KCWRvZFtuXS5kd0RhdGEJCT0gSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldJjB4ODA7Cglkb2Rbbl0uZHdUaW1lU3RhbXAJPSAwOyAvKiB1bW0gKi8KCWRvZFtuXS5kd1NlcXVlbmNlCT0gMDsgLyogdW1tICovCgluKys7CiAgICAgIH0KICAgICAgaWYgKCEoZmxhZ3MgJiBESUdERF9QRUVLKSkKCWtleXN0YXRlW3ZrZXldID0gSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldJjB4ODA7CiAgICAgIAogICAgfQogIAogIGlmIChuKSBmcHJpbnRmKHN0ZGVyciwiJWQgZW50cmllc1xuIixuKTsKICAqZW50cmllcyA9IG47CgogIHJldHVybiBUUlVFOwp9CgojZW5kaWYgLyogIWRlZmluZWQoWF9ESVNQTEFZX01JU1NJTkcpICovCgo=