LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1gxMV9YS0JMSUJfSAojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luLmgiCiNpbmNsdWRlICJ4MTFkcnYuaCIKI2luY2x1ZGUgIndpbmUvc2VydmVyLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCnR5cGVkZWYgdW5pb24KewogICAgc3RydWN0CiAgICB7CiNpZm5kZWYgQklURklFTERTX0JJR0VORElBTgogICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQgOiAxNjsKI2VuZGlmCiAgICAgICAgdW5zaWduZWQgbG9uZyBjb2RlIDogODsKICAgICAgICB1bnNpZ25lZCBsb25nIGV4dGVuZGVkIDogMTsKICAgICAgICB1bnNpZ25lZCBsb25nIHVudXNlZCA6IDI7CiAgICAgICAgdW5zaWduZWQgbG9uZyB3aW5faW50ZXJuYWwgOiAyOwogICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCA6IDE7CiAgICAgICAgdW5zaWduZWQgbG9uZyBwcmV2aW91cyA6IDE7CiAgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc2l0aW9uIDogMTsKI2lmZGVmIEJJVEZJRUxEU19CSUdFTkRJQU4KICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50IDogMTY7CiNlbmRpZgogICAgfSBscDE7CiAgICB1bnNpZ25lZCBsb25nIGxwMjsKfSBLRVlMUDsKCi8qIGtleSBzdGF0ZSB0YWJsZSBiaXRzOgogIDB4ODAgLT4ga2V5IGlzIHByZXNzZWQKICAweDQwIC0+IGtleSBnb3QgcHJlc3NlZCBzaW5jZSBsYXN0IHRpbWUKICAweDAxIC0+IGtleSBpcyB0b2dnbGVkCiovCkJZVEUga2V5X3N0YXRlX3RhYmxlWzI1Nl07CgpzdGF0aWMgQllURSBUcmFja1N5c0tleSA9IDA7IC8qIGRldGVybWluZSB3aGV0aGVyIEFMVCBrZXkgdXAgd2lsbCBjYXVzZSBhIFdNX1NZU0tFWVVQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBXTV9LRVlVUCBtZXNzYWdlICovCgpzdGF0aWMgaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgQWx0R3JNYXNrOyAvKiBtYXNrIGluIHRoZSBYS2V5RXZlbnQgc3RhdGUgKi8KCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSk7CgovKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KI2RlZmluZSBNQUlOX0xFTiA0OQpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIHRoaXMgaXMgbXkgKDEwMi1rZXkpIGtleWJvYXJkIGxheW91dCwgc29ycnkgaWYgaXQgZG9lc24ndCBxdWl0ZSBtYXRjaCB5b3VycyAqLwogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIFwgICAgICB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4NWUsMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2R2b3Jha1tNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgWyAgICBdICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDFBLDB4MUIsCiAvKiAnICAgICwgICAgLiAgICBwICAgIHkgICAgZiAgICBnICAgIGMgICAgciAgICBsICAgIC8gICAgPSAqLwogICAweDI4LDB4MzMsMHgzNCwweDE5LDB4MTUsMHgyMSwweDIyLDB4MkUsMHgxMywweDI2LDB4MzUsMHgwRCwKIC8qIGEgICAgbyAgICBlICAgIHUgICAgaSAgICBkICAgIGggICAgdCAgICBuICAgIHMgICAgLSAgICBcICovCiAgIDB4MUUsMHgxOCwweDEyLDB4MTYsMHgxNywweDIwLDB4MjMsMHgxNCwweDMxLDB4MUYsMHgwQywweDJCLAogLyogOyAgICBxICAgIGogICAgayAgICB4ICAgIGIgICAgbSAgICB3ICAgIHYgICAgeiAqLwogICAweDI3LDB4MTAsMHgyNCwweDI1LDB4MkQsMHgzMCwweDMyLDB4MTEsMHgyRiwweDJDLAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewogIC8qIHRoaXMgaXMgbXkgKDEwNi1rZXkpIGtleWJvYXJkIGxheW91dCwgc29ycnkgaWYgaXQgZG9lc24ndCBxdWl0ZSBtYXRjaCB5b3VycyAqLwogLyogMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgIF4gICAgXCAqLwogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDI5LAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBAICAgIFsgKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgIDogICAgXSAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fMywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfdjJbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fNSwnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX1BMVVMsVktfT0VNXzQsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNixWS19PRU1fMSwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzMsVktfT0VNXzcsVktfT0VNXzIsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fTUlOVVMsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1onLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdZJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6XzEwNVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1onLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgIFZLX09FTV8xMDIsJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyLCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYXplcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV9QTFVTLAogICAnQScsJ1onLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdRJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLCdNJyxWS19PRU1fMyxWS19PRU1fNSwKICAgJ1cnLCdYJywnQycsJ1YnLCdCJywnTicsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzgsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2R2b3Jha1tNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsJ1AnLCdZJywnRicsJ0cnLCdDJywnUicsJ0wnLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICAnQScsJ08nLCdFJywnVScsJ0knLCdEJywnSCcsJ1QnLCdOJywnUycsVktfT0VNX01JTlVTLFZLX09FTV81LAogICBWS19PRU1fMSwnUScsJ0onLCdLJywnWCcsJ0InLCdNJywnVycsJ1YnLCdaJywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIFdJTkVERUJVRz0ra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogR2VybWFuIExvZ2l0ZWNoIERlc2t0b3AgUHJvIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9sb2dpdGVjaFtNQUlOX0xFTl1bNF0gPQp7CiAiXlx4YjAiLCIxISIsIjJcIiIsIjNceGE3IiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiXHhkZj9cXCIsIidgIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCJceGZjXHhkYyIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiXHhmNlx4ZDYiLCJceGU0XHhjNCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAobW9zdGx5IGNvbnRyaWJ1dGVkIGJ5IFV3ZSBCb25uZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwovKiAoWEZyZWU4NiByZXBvcnRzIHRoZSA8PiBrZXkgZXZlbiBpZiBpdCdzIG5vdCBwaHlzaWNhbGx5IHRoZXJlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKGR2b3JhayB2ZXJzaW9uKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19kdm9yYWtbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCJbeyIsIl19IiwKICInXCIiLCIsPCIsIi4+IiwicFAiLCJ5WSIsImZGIiwiZ0ciLCJjQyIsInJSIiwibEwiLCIvPyIsIj0rIiwKICJhQSIsIm9PIiwiZUUiLCJ1VSIsImlJIiwiZEQiLCJoSCIsInRUIiwibk4iLCJzUyIsIi1fIiwiXFx8IiwKICI7OiIsInFRIiwiakoiLCJrSyIsInhYIiwiYkIiLCJtTSIsIndXIiwidlYiLCJ6WiIKfTsKCi8qKiogQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUtbTUFJTl9MRU5dWzRdID0KewogImAiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ0AiLCIjfiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcfCIKfTsKCi8qKiogRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GUltNQUlOX0xFTl1bNF0gPQp7CiAisiIsIiYxIiwi6TIiLCJcIjMiLCInNCIsIig1IiwiLTYiLCLoNyIsIl84Iiwi5zkiLCLgMCIsIimwIiwiPSsiLAogImFBIiwieloiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqgiLCIkoyIsCiAicVEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JSIsIiq1IiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCIhpyIsCiAiPD4iCn07CgovKioqIEljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVNbTUFJTl9MRU5dWzRdID0KewogIrAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCL21iIsIi1fIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvDQIiwiJz8iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwitMQiLCIrKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46Iiwi/t4iLAogIjw+Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIt8/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD58Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX25vZGVhZFtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIrQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIDEwNSBLZXlzIChjb250cmlidXRlZCBieSBNYXR0aGlhcyBGZWNobmVyKSovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX25vZGVhZF8xMDVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCKyIiwiM6ezIiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19Iiwi3z9cXCIsIidgIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICI8PnwiLCJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCn07CgovKioqIFN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjaCAtdmFyaWFudCBkZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0dbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSsiLCIyXCIiLCIzKiIsIjTnIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCJeYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86CIsIqghIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgIiwiJKMiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRltNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8IiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIun2Iiwi4OQiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGspICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2UpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEVzdG9uaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FVFtNQUlOX0xFTl1bNF0gPQp7CiAit34iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwi9dUiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2FfZW5oYW5jZWQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApvCIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIrioXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzp+IiwiYGB7IiwiPD59IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnLSIsIi4iLCLpySIsCiAiq7uwIgp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EgLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBX2ZyW01BSU5fTEVOXVs0XSA9CnsKICIjfCIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjUlIiwiNj8iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXl4iLCK4qCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCJgYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnIiwiLiIsIunJIiwKICKruyIKfTsKCi8qKiogQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBW01BSU5fTEVOXVs0XSA9CnsKICIvXFwiLCIxIbmhIiwiMkCyIiwiMyOzoyIsIjQkvKQiLCI1Jb0iLCI2P74iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/jYIiwicFD+3iIsIl6oqCIsIufHfiIsCiAiYUHmxiIsInNT36ciLCJkRPDQIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzq0Iiwi6MgiLCLgwCIsCiAieloiLCJ4WCIsImNDoqkiLCJ2ViIsImJCIiwibk4iLCJtTbW6IiwiLCciLCIuXCK39yIsIunJIiwKICL52SIKfTsKCi8qKiogUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBwdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiq7siLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiKyoiLCK0YCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCK6qiIsIn5eIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIuxeIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIujpIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvLnIiwi4LAiLCL5pyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBGaW5uaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGZpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GSVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19iZHNbTUFJTl9MRU5dWzRdID0KewogImB+KCkiLCIxISIsIjJAMj8iLCIzIzMrIiwiNCQ0XCIiLCI1JSIsIjZeNj0iLCI3Jjc6IiwiOCo4LyIsIjkoIiwiMCkiLCItXy1JIiwiPSsuViIsCiAicVEs+yIsIndX89MiLCJlReXFIiwiclLoyCIsInRU+NgiLCJ5WfnZIiwidVXqyiIsImlJ8dEiLCJvT+TEIiwicFDnxyIsIlt79tYiLCJdfTsiLAogImFB/NwiLCJzU//fIiwiZETgwCIsImZG7s4iLCJnR+bGIiwiaEjjwyIsImpK8tIiLCJrS+3NIiwibEziwiIsIjs67MwiLCInXCL31yIsIlxcfCfbIiwKICJ6Wv7eIiwieFjpySIsImND+toiLCJ2Vv3dIiwiYkL01CIsIm5O9dUiLCJtTe/PIiwiLDzw0CIsIi4+68siLCIvP+HBIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+99ciLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR/98iLCJ3V+LCIiwiZUXlxSIsInJS8NAiLCJ0VPLSIiwieVn62iIsInVV89MiLCJpSejIIiwib0/uziIsInBQ788iLCJbe/jYIiwiXX352SIsCiAiYUHgwCIsInNT8dEiLCJkROTEIiwiZkb01CIsImdH48MiLCJoSPXVIiwiakrpySIsImtL6soiLCJsTOvLIiwiOzoiLCInXCIiLCJcXHz+3iIsCiAielrnxyIsInhY/NwiLCJjQ/bWIiwidlbmxiIsImJC4cEiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCZWxhcnVzaWFuIHN0YW5kYXJkIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSGxlYiBWYWxvc2thKSAqLwovKioqIEl0IG1hdGNoZXMgYmVsYXJ1c2lhbiBsYXlvdXQgZm9yIFhLQiBmcm9tIEFsZXhhbmRlciBNaWtoYWlsaWFuICAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JZW01BSU5fTEVOXVs0XSA9CnsKICJgfqOzIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9Prr4iLCJwUNr6IiwiW3vI6CIsIl19JyciLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfC98IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkKmtiIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy4sIiwgIjw+fKYiLAp9OwoKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9rb2k4cltNQUlOX0xFTl1bNF0gPQp7CiAiKCkiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1OiIsIjYsIiwiNy4iLCI4OyIsIjk/IiwiMCUiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXHwiLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9jcDEyNTFbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUenJIiwid1f21iIsImVF89MiLCJyUurKIiwidFTlxSIsInlZ7c0iLCJ1VePDIiwiaUn42CIsIm9P+dkiLCJwUOfHIiwiW3v11SIsIl19+toiLAogImFB9NQiLCJzU/vbIiwiZETiwiIsImZG4MAiLCJnR+/PIiwiaEjw0CIsImpK7s4iLCJrS+vLIiwibEzkxCIsIjs65sYiLCInXCL93SIsIlxcfCIsCiAielr/3yIsInhY99ciLCJjQ/HRIiwidlbszCIsImJC6MgiLCJuTvLSIiwibU383CIsIiw84cEiLCIuPv7eIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUdHxIiwid1fX9yIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2fkiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl193f0iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKyuoiLCJrS8vrIiwibEzM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wtr6IiwieFjY+CIsImNDw+MiLCJ2Vtb2IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBW01BSU5fTEVOXVs0XSA9CnsKICJgfq29IiwiMSExISIsIjJAMlwiIiwiMyMzJyIsIjQkNCoiLCI1JTU6IiwiNl42LCIsIjcmNy4iLCI4Kjg7IiwiOSg5KCIsIjApMCkiLCItXy1fIiwiPSs9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfae3IiwKICJhQcbmIiwic1OmtiIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wipLQiLCJcXHxcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Lz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgYnkgTy4gTnlreWZvcmNoeW4gKi8KLyoqKiAgKGFzIGl0IGFwcGVhcnMgb24gbW9zdCBvZiBrZXlib2FyZHMgc29sZCB0b2RheSkgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQV9zdGRbTUFJTl9MRU5dWzRdID0KewogIq29IiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIqe3IiwKICLG5iIsIqa2Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsIqS0IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKHBhaXIgdG8gdGhlIHByZXZpb3VzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9zdGRbTUFJTl9MRU5dWzRdID0KewogIqOzIiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTcGFuaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqoiLCIxISIsIjJcIiIsIjO3IiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwitKgiLCLnxyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCZWxnaWFuIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JFW01BSU5fTEVOXVs0XSA9CnsKICIiLCImMXwiLCLpMkAiLCJcIjMjIiwiJzQiLCIoNSIsIqc2XiIsIug3IiwiITgiLCLnOXsiLCLgMH0iLCIpsCIsIi1fIiwKICJhQSIsInpaIiwiZUWkIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqFsiLCIkKl0iLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvkltCIsIrWjYCIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiPSt+IiwKICI8PlxcIgp9OwoKLyoqKiBIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hVW01BSU5fTEVOXVs0XSA9CnsKICIwpyIsIjEnIiwiMlwiIiwiMysiLCI0ISIsIjUlIiwiNi8iLCI3PSIsIjgoIiwiOSkiLCL21iIsIvzcIiwi89MiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi9dUiLCL62iIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6ckiLCLhwSIsIvvbIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAi7c0iCn07CgovKioqIFBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JqciLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUXqyiIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/PTIiwicFAiLCJbeyIsIl19IiwKICJhQbGhIiwic1O2piIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMs6MiLCI7OiIsIidcIiIsIlxcfCIsCiAielq/ryIsInhYvKwiLCJjQ+bGIiwidlYiLCJiQiIsIm5O8dEiLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2kpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICKpuSIsIqq6IiwixeUiLCLS8iIsItT0Iiwi2voiLCLV9SIsIsnpIiwiz+8iLCLQ8CIsItv7IiwiW10iLAogIsHhIiwi0/MiLCLE5CIsIsbmIiwix+ciLCLI6CIsIqi4Iiwiy+siLCLM7CIsIt7+Iiwiq7siLCItXyIsCiAiobEiLCKvvyIsIsPjIiwi1/ciLCLC4iIsIs7uIiwize0iLCIsOyIsIi46Iiwi1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAMlwiIiwiMyMiLCI0JCIsIjUlIiwiNl42JiIsIjcmNy8iLCI4KjgoIiwiOSg5KSIsIjApMD0iLCItXyc/IiwiPSsrKiIsCiAicVGpuSIsIndXqroiLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdr6IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfVtdIiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSqi4Iiwia0vL6yIsImxMzOwiLCI7Ot7+IiwiJ1wiq7siLCJcXHwtXyIsCiAielqhsSIsInhYr78iLCJjQ8PjIiwidlbX9yIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8LDsiLCIuPi46IiwiLz/W9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGhyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCIvPyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfcGM5OHgxW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXmAiLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQH4iLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgR29tZXMgRmVybmFuZGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjaoIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrRgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IHdpdGggPEFMVCBHUj4gKGNvbnRyaWJ1dGVkIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJfYWx0X2dyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxITkiLCIyQDIiLCIzIzMiLCI0JCMiLCI1JVwiIiwiNigsIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rJyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCI0YCIsIlt7KiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiZ0ciLCJ+XiIsIl19OiIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPzAiCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiOzAiLCIrMSIsIrUyIiwiuTMiLCLoNCIsIrs1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwiJ3YiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCLkKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9FwiIiwipyEiLCLyKSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjeikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjel9xd2VydHkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaX3F3ZXJ0eVtNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIFNsb3ZhayBhbmQgQ3plY2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19kdWFsKGNzX3NrX3VjdykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLX3Byb2dbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUeTEIiwid1fszCIsImVF6ckiLCJyUvjYIiwidFS7qyIsInlZ/d0iLCJ1VfnZIiwiaUntzSIsIm9P89MiLCJwUPbWIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTuakiLCJkRO/PIiwiZkbryyIsImdH4MAiLCJoSPraIiwiakr83CIsImtL9NQiLCJsTLWlIiwiOzoiLCInXCIiLCJcXHwiLAogInpavq4iLCJ4WKQiLCJjQ+jIIiwidlbnxyIsImJCIiwibk7y0iIsIm1N5cUiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShjc19xd2VydHkpIGluIHhrYnNlbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1NbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpML0pIiwiPSUiLCIiLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i9beyIsIikoXX0iLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIvlcIiQiLCKnId8iLCKoJyIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEdhYnJpZWwgT3JsYW5kbyBHYXJjaWEpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xBW01BSU5fTEVOXVs0XSA9CnsKICJ8sCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiv6EiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrSoIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwie1teIiwifV0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBsdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTFRfQltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCLgwCIsIujIIiwi5sYiLCLryyIsIuHBIiwi8NAiLCL42CIsIvvbIiwipSgiLCK0KSIsIi1fIiwi/t4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICKqrCIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJbTUFJTl9MRU5dWzRdID0KewoiXCJcXCIsIjEhIiwiMiciLCIzXiIsIjQrIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKj8iLCItXyIsCiJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIlx4YjlJIiwib08iLCJwUCIsIlx4YmJceGFiIiwi/NwiLAoiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiXHhiYVx4YWEiLCJpXDAiLCIsOyIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIsCiI8PiIKfTsKCi8qKiogVHVya2lzaCBGIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyZikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJfRltNQUlOX0xFTl1bNF0gPQp7CiIrKiIsIjEhIiwiMlwiIiwiM14jIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMD0iLCIvPyIsIi1fIiwKImZGIiwiZ0ciLCJceGJiXHhhYiIsIlx4YjlJIiwib08iLCJkRCIsInJSIiwibk4iLCJoSCIsInBQIiwicVEiLCJ3VyIsCiJ1VSIsImlcMCIsImVFIiwiYUEiLCL83CIsInRUIiwia0siLCJtTSIsImxMIiwieVkiLCJceGJhXHhhYSIsInhYIiwKImpKIiwi9tYiLCJ2ViIsImNDIiwi58ciLCJ6WiIsInNTIiwiYkIiLCIuOiIsIiw7IiwKIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMW01BSU5fTEVOXVs0XSA9CnsKICJgfjsiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRLyIsIndXJyIsImVF9yIsInJS+CIsInRU4CIsInlZ6CIsInVV5SIsImlJ7yIsIm9P7SIsInBQ9CIsIlt7IiwiXX0iLAogImFB+SIsInNT4yIsImRE4iIsImZG6yIsImdH8iIsImhI6SIsImpK5yIsImtL7CIsImxM6iIsIjs68yIsIlwnXCIsIiwiXFx8IiwKICJ6WuYiLCJ4WPEiLCJjQ+EiLCJ2VuQiLCJiQvAiLCJuTu4iLCJtTfYiLCIsPPoiLCIuPvUiLCIvPy4iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsaWxfcGhvbmV0aWMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1flIiwiZUXgIiwiclL4IiwidFT6IiwieVnyIiwidVXlIiwiaUnpIiwib0/xIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1P5IiwiZETjIiwiZkb0IiwiZ0fiIiwiaEjkIiwiakrpIiwia0vrIiwibEzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW5SIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIC1zeW1ib2xzICJ1cyhwYzEwNSkraWxfc2FoYXJvbiIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lMX3NhaGFyb25bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V/EiLCJlRSIsInJS+CIsInRU6CIsInlZ4yIsInVVIiwiaUkiLCJvTyIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT5SIsImRE7CIsImZG+iIsImdH4iIsImhI5CIsImpK+SIsImtL6yIsImxM6SIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VvIiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBHcmVlayBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEtyaXRvbiBLeXJpbWlzIDxreXJpbWlzQGN0aS5ncj4pCiAgR3JlZWsgY2hhcmFjdGVycyBmb3IgIndXIiBhbmQgInNTIiBhcmUgb21pdHRlZCB0byBub3QgcHJvZHVjZSBhIG1pc21hdGNoCiAgbWVzc2FnZSBzaW5jZSB0aGV5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcnMgaW4gZ3IgYW5kIGVsIFhGcmVlODYgbGF5b3V0cy4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRUxbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUTs6Iiwid1ciLCJlReXFIiwiclLx0SIsInRU9NQiLCJ5WfXVIiwidVXoyCIsImlJ6ckiLCJvT+/PIiwicFDw0CIsIlt7IiwiXX0iLAogImFB4cEiLCJzUyIsImRE5MQiLCJmRvbWIiwiZ0fjwyIsImhI58ciLCJqSu7OIiwia0vqyiIsImxM68siLCI7OrSoIiwiJ1wiIiwiXFx8IiwKICJ6WubGIiwieFj31yIsImND+NgiLCJ2VvnZIiwiYkLiwiIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogVGhhaSAoS2VkbWFuZWUpIGtleWJvYXJkIGxheW91dCBieSBTdXBwaGFjaG9rZSBTdW50aXdpY2hheWEgPG1yY2hva2VAb3BlbnRsZS5vcmc+ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3RoW01BSU5fTEVOXVs0XSA9CnsKICJgfl8lIiwiMSHlKyIsIjJAL/EiLCIzIy3yIiwiNCTA8yIsIjUltvQiLCI2XtjZIiwiNybW3yIsIjgqpPUiLCI5KLX2IiwiMCmo9yIsIi1fovgiLCI9K6r5IiwKICJxUebwIiwid1fkXCIiLCJlRdOuIiwiclK+sSIsInRU0LgiLCJ5WdHtIiwidVXV6iIsImlJw7MiLCJvT7nPIiwicFDCrSIsIlt7urAiLCJdfcUsIiwKICJhQb/EIiwic1PLpiIsImREoa8iLCJmRrTiIiwiZ0fgrCIsImhI6eciLCJqSujrIiwia0vSySIsImxMysgiLCI7OserIiwiXCdcIqcuIiwiXFx8o6UiLAogInpavCgiLCJ4WLspIiwiY0PhqSIsInZWzc4iLCJiQtoiLCJuTtfsIiwibU23PyIsIiw8wbIiLCIuPuPMIiwiLz+9xiIKfTsgCgovKioqIFZOQyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl92bmNbTUFJTl9MRU5dID0KewogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDFBLDB4MUIsMHgyNywweDI4LDB4MjksMHgzMywweDM0LDB4MzUsMHgyQiwKICAgMHgxRSwweDMwLDB4MkUsMHgyMCwweDEyLDB4MjEsMHgyMiwweDIzLDB4MTcsMHgyNCwweDI1LDB4MjYsMHgzMiwweDMxLDB4MTgsMHgxOSwweDEwLDB4MTMsMHgxRiwweDE0LDB4MTYsMHgyRiwweDExLDB4MkQsMHgxNSwweDJDLAogICAweDU2Cn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3ZuY1tNQUlOX0xFTl0gPQp7CiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzQsVktfT0VNXzYsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzMsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzUsCiAgICdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08nLCdQJywnUScsJ1InLCdTJywnVCcsJ1UnLCdWJywnVycsJ1gnLCdZJywnWicsCiAgIFZLX09FTV8xMDIKfTsKCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X3ZuY1tNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwiW3siLCJdfSIsIjs6IiwiJ1wiIiwiYH4iLCIsPCIsIi4+IiwiLz8iLCJcXHwiLAogImFBIiwiYkIiLCJjQyIsImREIiwiZUUiLCJmRiIsImdHIiwiaEgiLCJpSSIsImpKIiwia0siLCJsTCIsIm1NIiwibk4iLCJvTyIsInBQIiwicVEiLCJyUiIsInNTIiwidFQiLCJ1VSIsInZWIiwid1ciLCJ4WCIsInlZIiwieloiCn07CgovKioqIER1dGNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIG5sKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05MW01BSU5fTEVOXVs0XSA9CnsKICJApyIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3XyIsIjgoIiwiOSkiLCIwJyIsIi8/IiwisH4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiqH4iLCIqfCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiK7EiLCInYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItPSIsCiAiW10iCn07CgoKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBMQ0lEIGxjaWQ7IC8qIGlucHV0IGxvY2FsZSBpZGVudGlmaWVyLCBsb29rIGZvciBMT0NBTEVfSUxBTkdVQUdFCiAgICAgICAgICAgICAgICAgaW4gdGhlIGFwcHJvcHJpYXRlIGRsbHMva2VybmVsL25scy8ubmxzIGZpbGUgKi8KICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQ7CiAgICBjb25zdCBjaGFyICgqa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjb25zdCBXT1JEICgqc2NhbilbTUFJTl9MRU5dOyAvKiBzY2FuIGNvZGVzIG1hcHBpbmcgKi8KICAgIGNvbnN0IFdPUkQgKCp2a2V5KVtNQUlOX0xFTl07IC8qIHZpcnR1YWwga2V5IGNvZGVzIG1hcHBpbmcgKi8KfSBtYWluX2tleV90YWJbXT17CiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWspIiwgJm1haW5fa2V5X1VTX2R2b3JhaywgJm1haW5fa2V5X3NjYW5fZHZvcmFrLCAmbWFpbl9rZXlfdmtleV9kdm9yYWt9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMgSW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVNfaW50bCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwOSwgIkJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9ERSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCBmb3IgbG9naXRlY2ggZGVza3RvcCBwcm8iLCAmbWFpbl9rZXlfREVfbG9naXRlY2gsICAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUiLCAmbWFpbl9rZXlfREVfbm9kZWFkXzEwNSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKENBX2ZyKSIsICZtYWluX2tleV9DQV9mciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwYywgIkJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwODE2LCAiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCBBTFQgR1IiLCAmbWFpbl9rZXlfUFRfYnJfYWx0X2dyLCZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDBiLCAiRmlubmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19iZHMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIzLCAiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxIiwgJm1haW5fa2V5X1JVX2NwMTI1MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfVUFfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9SVV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMCwgIkl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBmLCAiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZSwgIkh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MTUsICJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI0LCAiU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHNyIiwgJm1haW5fa2V5X1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzciIsICZtYWluX2tleV9VU19TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDYsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNn0sCiB7MHgwNDExLCAiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjeiIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjel9xd2VydHkiLCAmbWFpbl9rZXlfQ1pfcXdlcnR5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI3LCAiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIiLCAmbWFpbl9rZXlfVFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0cmYiLCAmbWFpbl9rZXlfVFJfRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3NhaGFyb24sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJWTkMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3ZuYywgJm1haW5fa2V5X3NjYW5fdm5jLCAmbWFpbl9rZXlfdmtleV92bmN9LAogezB4MDQwOCwgIkdyZWVrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZSwgIlRoYWkgKEtlZG1hbmVlKSAga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3RoLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEzLCAiRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05MLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgogezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAwLCAwLCBWS19FU0NBUEUsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjUwICovCiAgICBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsMCwwLCBWS19BUFBTLCAvKiBGRjYwICovCiAgICAwLCBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgVktfRU5ELCBWS19DTEVBUiwgVktfSU5TRVJULCBWS19ERUxFVEUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgVktfT0VNX05FQ19FUVVBTCwgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgMCwgMCwgICAgICAgLyogRkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfU0hJRlQsIFZLX1NISUZULCBWS19DT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgVktfTUVOVSwKICAgIFZLX01FTlUsIFZLX01FTlUsIFZLX01FTlUsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzOCwgMHgxNDUsICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MzYsIDB4MUQsIDB4MTFELCAweDNBLCAweDAwLCAweDM4LCAgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwovKiB4MTEgbG9jayBtdXN0IGJlIGhlbGQgKi8Kc3RhdGljIFdPUkQgRVZFTlRfZXZlbnRfdG9fdmtleSggWElDIHhpYywgWEtleUV2ZW50ICplKQp7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFN0YXR1cyBzdGF0dXM7CiAgICBjaGFyIGJ1ZlsyNF07CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZS0+dHlwZSA9PSBLZXlQcmVzcykKICAgICAgICBYbWJMb29rdXBTdHJpbmcoeGljLCBlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICBYTG9va3VwU3RyaW5nKGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoZS0+c3RhdGUgJiBOdW1Mb2NrTWFzaykgJiYKICAgICAgICAoa2V5c3ltID09IFhLX0tQX1NlcGFyYXRvciB8fCBrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCB8fAogICAgICAgICAoa2V5c3ltID49IFhLX0tQXzAgJiYga2V5c3ltIDw9IFhLX0tQXzkpKSkKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIFRSQUNFXyhrZXkpKCJlLT5rZXljb2RlID0gJXhcbiIsIGUtPmtleWNvZGUpOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kdm9pZCBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggV09SRCB3VmssIFdPUkQgd1NjYW4sIERXT1JEIGR3RmxhZ3MsIERXT1JEIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RXh0cmFJbmZvLCBVSU5UIGluamVjdGVkX2ZsYWdzICkKewogICAgVUlOVCBtZXNzYWdlOwogICAgS0VZTFAga2V5bHA7CiAgICBLQkRMTEhPT0tTVFJVQ1QgaG9vazsKICAgIFdPUkQgd1ZrU3RyaXBwZWQ7CgogICAgd1ZrID0gTE9CWVRFKHdWayk7CgogICAgLyogc3RyaXAgbGVmdC9yaWdodCBmb3IgbWVudSwgY29udHJvbCwgc2hpZnQgKi8KICAgIGlmICh3VmsgPT0gVktfTE1FTlUgfHwgd1ZrID09IFZLX1JNRU5VKQogICAgICAgIHdWa1N0cmlwcGVkID0gVktfTUVOVTsKICAgIGVsc2UgaWYgKHdWayA9PSBWS19MQ09OVFJPTCB8fCB3VmsgPT0gVktfUkNPTlRST0wpCiAgICAgICAgd1ZrU3RyaXBwZWQgPSBWS19DT05UUk9MOwogICAgZWxzZSBpZiAod1ZrID09IFZLX0xTSElGVCB8fCB3VmsgPT0gVktfUlNISUZUKQogICAgICAgIHdWa1N0cmlwcGVkID0gVktfU0hJRlQ7CiAgICBlbHNlCiAgICAgICAgd1ZrU3RyaXBwZWQgPSB3Vms7CgogICAga2V5bHAubHAyID0gMDsKICAgIGtleWxwLmxwMS5jb3VudCA9IDE7CiAgICBrZXlscC5scDEuY29kZSA9IHdTY2FuOwogICAga2V5bHAubHAxLmV4dGVuZGVkID0gKGR3RmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpICE9IDA7CiAgICBrZXlscC5scDEud2luX2ludGVybmFsID0gMDsgLyogdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggZGlhbG9ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvbid0IHJlbWVtYmVyIHdoZXJlIEkgcmVhZCBpdCAtIEFLICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQncyAnMScgdW5kZXIgd2luZG93cywgd2hlbiBhIGRpYWxvZyBib3ggYXBwZWFycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCB5b3UgcHJlc3Mgb25lIG9mIHRoZSB1bmRlcmxpbmVkIGtleXMgLSBERiovCgogICAgLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgdGVzdCBmb3IgYWxsIHRoaXMgKi8KICAgIGlmIChkd0ZsYWdzICYgS0VZRVZFTlRGX0tFWVVQICkKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZVVA7CiAgICAgICAgaWYgKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSAmJgogICAgICAgICAgICAoKHdWa1N0cmlwcGVkID09IFZLX01FTlUpIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKQogICAgICAgICAgICAgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgewogICAgICAgICAgICBpZiggVHJhY2tTeXNLZXkgPT0gVktfTUVOVSB8fCAvKiA8QUxUPi1kb3duLzxBTFQ+LXVwIHNlcXVlbmNlICovCiAgICAgICAgICAgICAgICAod1ZrU3RyaXBwZWQgIT0gVktfTUVOVSkpIC8qIDxBTFQ+LWRvd24uLi48c29tZXRoaW5nIGVsc2U+LXVwICovCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZVVA7CiAgICAgICAgICAgIFRyYWNrU3lzS2V5ID0gMDsKICAgICAgICB9CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gJj0gfjB4ODA7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSAmPSB+MHg4MDsKICAgICAgICBrZXlscC5scDEucHJldmlvdXMgPSAxOwogICAgICAgIGtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBrZXlscC5scDEucHJldmlvdXMgPSAoa2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSAhPSAwOwogICAgICAgIGtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKICAgICAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbd1ZrXSAmIDB4ODApKSBrZXlfc3RhdGVfdGFibGVbd1ZrXSBePSAweDAxOwogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdIHw9IDB4YzA7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSB8PSAweGMwOwoKICAgICAgICBtZXNzYWdlID0gV01fS0VZRE9XTjsKICAgICAgICBpZiAoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODApICYmICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZRE9XTjsKICAgICAgICAgICAgVHJhY2tTeXNLZXkgPSB3VmtTdHJpcHBlZDsKICAgICAgICB9CiAgICB9CgogICAga2V5bHAubHAxLmNvbnRleHQgPSAoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgIT0gMDsgLyogMSBpZiBhbHQgKi8KCiAgICBUUkFDRV8oa2V5KSgiIHdQYXJhbT0lMDR4LCBsUGFyYW09JTA4bHgsIElucHV0S2V5U3RhdGU9JXhcbiIsCiAgICAgICAgICAgICAgICB3VmssIGtleWxwLmxwMiwga2V5X3N0YXRlX3RhYmxlW3dWa10gKTsKCiAgICBob29rLnZrQ29kZSAgICAgID0gd1ZrOwogICAgaG9vay5zY2FuQ29kZSAgICA9IHdTY2FuOwogICAgaG9vay5mbGFncyAgICAgICA9IChrZXlscC5scDIgPj4gMjQpIHwgaW5qZWN0ZWRfZmxhZ3M7CiAgICBob29rLnRpbWUgICAgICAgID0gdGltZTsKICAgIGhvb2suZHdFeHRyYUluZm8gPSBkd0V4dHJhSW5mbzsKICAgIGlmIChIT09LX0NhbGxIb29rcyggV0hfS0VZQk9BUkRfTEwsIEhDX0FDVElPTiwgbWVzc2FnZSwgKExQQVJBTSkmaG9vaywgVFJVRSApKSByZXR1cm47CgogICAgU0VSVkVSX1NUQVJUX1JFUSggc2VuZF9oYXJkd2FyZV9tZXNzYWdlICkKICAgIHsKICAgICAgICByZXEtPmlkICAgICAgID0gKGluamVjdGVkX2ZsYWdzICYgTExLSEZfSU5KRUNURUQpID8gMCA6IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgIHJlcS0+d2luICAgICAgPSAwOwogICAgICAgIHJlcS0+bXNnICAgICAgPSBtZXNzYWdlOwogICAgICAgIHJlcS0+d3BhcmFtICAgPSB3Vms7CiAgICAgICAgcmVxLT5scGFyYW0gICA9IGtleWxwLmxwMjsKICAgICAgICByZXEtPnggICAgICAgID0gY3Vyc29yX3Bvcy54OwogICAgICAgIHJlcS0+eSAgICAgICAgPSBjdXJzb3JfcG9zLnk7CiAgICAgICAgcmVxLT50aW1lICAgICA9IHRpbWU7CiAgICAgICAgcmVxLT5pbmZvICAgICA9IGR3RXh0cmFJbmZvOwogICAgICAgIHdpbmVfc2VydmVyX2NhbGwoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgRFdPUkQgZXZlbnRfdGltZSApCnsKICBCT09MICogU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSk7CiAgRFdPUkQgdXAsIGRvd247CgogIGlmICgqU3RhdGUpIHsKICAgIC8qIFRoZSBJTlRFUk1FRElBUlkgc3RhdGUgbWVhbnMgOiBqdXN0IGFmdGVyIGEgJ3ByZXNzJyBldmVudCwgaWYgYSAncmVsZWFzZScgZXZlbnQgY29tZXMsCiAgICAgICBkb24ndCB0cmVhdCBpdC4gSXQncyBmcm9tIHRoZSBzYW1lIGtleSBwcmVzcy4gVGhlbiB0aGUgc3RhdGUgZ29lcyB0byBPTi4KICAgICAgIEFuZCBmcm9tIHRoZXJlLCBhICdyZWxlYXNlJyBldmVudCB3aWxsIHN3aXRjaCBvZmYgdGhlIHRvZ2dsZSBrZXkuICovCiAgICAqU3RhdGU9RkFMU0U7CiAgICBUUkFDRSgiSU5URVJNIDogZG9uJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBrZXlfc3RhdGVfdGFibGVbJSN4XSA9ICUjeFxuIiwKICAgICAgICAgIHZrZXksa2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKICB9IGVsc2UKICAgIHsKICAgICAgICBkb3duID0gKHZrZXk9PVZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwKTsKICAgICAgICB1cCA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCkgfCBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIGtleV9zdGF0ZV90YWJsZVt2a2V5XSAmIDB4MSApIC8qIGl0IHdhcyBPTiAqLwoJICB7CgkgICAgaWYgKEV2dHlwZSE9S2V5UHJlc3MpCgkgICAgICB7CgkJVFJBQ0UoIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBkb3duLCBldmVudF90aW1lLCAwLCAwICk7CgkgICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCB1cCwgZXZlbnRfdGltZSwgMCwgMCApOwoJCSpTdGF0ZT1GQUxTRTsKCQlrZXlfc3RhdGVfdGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovCgkgICAgICB9CgkgIH0KCWVsc2UgLyogaXQgd2FzIE9GRiAqLwoJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKCSAgICB7CgkgICAgICBUUkFDRSgiT0ZGICsgS2V5cHJlc3MgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGRvd24sIGV2ZW50X3RpbWUsIDAsIDAgKTsKCSAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCB1cCwgZXZlbnRfdGltZSwgMCwgMCApOwoJICAgICAgKlN0YXRlPVRSVUU7IC8qIEdvZXMgdG8gaW50ZXJtZWRpYXJ5IHN0YXRlIGJlZm9yZSBnb2luZyB0byBPTiAqLwoJICAgICAga2V5X3N0YXRlX3RhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvbi4gKi8KCSAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8Kc3RhdGljIGlubGluZSB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggaW50IHZrZXksIGludCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChrZXlfc3RhdGVfdGFibGVbdmtleV0gJiAweDgwKSE9MCkgIT0gc3RhdGUpCiAgICB7CiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBzdGF0ZSBmb3IgdmtleSAlIy4yeC4gU3RhdGUgYmVmb3JlICUjLjJ4XG4iLAogICAgICAgICAgICAgIHZrZXksIGtleV9zdGF0ZV90YWJsZVt2a2V5XSk7CgogICAgICAgIC8qIEZha2Uga2V5IGJlaW5nIHByZXNzZWQgaW5zaWRlIHdpbmUgKi8KICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgMCwgc3RhdGU/IDAgOiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUsIDAsIDAgKTsKCiAgICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyICUjLjJ4XG4iLGtleV9zdGF0ZV90YWJsZVt2a2V5XSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleW1hcE5vdGlmeQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KSB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuCiAqLwp2b2lkIFgxMURSVl9LZXltYXBOb3RpZnkoIEhXTkQgaHduZCwgWEV2ZW50ICpldmVudCApCnsKICAgIGludCBpLCBqLCBhbHQsIGNvbnRyb2wsIHNoaWZ0OwogICAgRFdPUkQgdGltZSA9IEdldEN1cnJlbnRUaW1lKCk7CgogICAgYWx0ID0gY29udHJvbCA9IHNoaWZ0ID0gMDsKICAgIC8qIHRoZSBtaW5pbXVtIGtleWNvZGUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gOCwgc28gd2UgY2FuCiAgICAgKiBza2lwIHRoZSBmaXJzdCA4IHZhbHVlcywgaGVuY2Ugc3RhcnQgYXQgMQogICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBpZiAoIWV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoIShldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSkgY29udGludWU7CiAgICAgICAgICAgIHN3aXRjaChrZXljMnZrZXlbKGkgKiA4KSArIGpdICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX01FTlU6ICAgIGFsdCA9IDE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IGNvbnRyb2wgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19TSElGVDogICBzaGlmdCA9IDE7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX01FTlUsIGFsdCwgdGltZSApOwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX0NPTlRST0wsIGNvbnRyb2wsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19TSElGVCwgc2hpZnQsIHRpbWUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhFdmVudCAqeGV2ICkKewogICAgWEtleUV2ZW50ICpldmVudCA9ICZ4ZXYtPnhrZXk7CiAgICBjaGFyIFN0clsyNF07CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBldmVudC0+dHlwZSA9PSBLZXlQcmVzcykKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIEVSUigiQnVmZmVyIE92ZXJmbG93IG5lZWQgJWkhXG4iLGFzY2lpX2NoYXJzKTsKCiAgICBpZiAoc3RhdHVzID09IFhMb29rdXBDaGFycykKICAgIHsKICAgICAgICBYMTFEUlZfWElNTG9va3VwQ2hhcnMoIFN0ciwgYXNjaWlfY2hhcnMgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgYXJlIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZSB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggZm9yIEFsdEdyIHNob3VsZCBiZSAyCiAgICAgICAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgLyogU2F2ZSBhbHNvIGFsbCBwb3NzaWJsZSBtb2RpZmllciBzdGF0ZXMuICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAoMHg2MDAwIHwgTW9kMU1hc2sgfCBNb2QyTWFzayB8IE1vZDNNYXNrIHwgTW9kNE1hc2sgfCBNb2Q1TWFzayk7CgogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgZGVidWdzdHJfYW4oU3RyLCBhc2NpaV9jaGFycykpOwogICAgfQoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLGV2ZW50KTsKICAgIC8qIFggcmV0dXJucyBrZXljb2RlIDAgZm9yIGNvbXBvc2VkIGNoYXJhY3RlcnMgKi8KICAgIGlmICghdmtleSAmJiBhc2NpaV9jaGFycykgdmtleSA9IFZLX05PTkFNRTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgaWYgKHZrZXkpCiAgIHsKICAgIHN3aXRjaCAodmtleSAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIFZLX05VTUxPQ0s6CiAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBldmVudC0+dHlwZSwgZXZlbnRfdGltZSApOwogICAgICBicmVhazsKICAgIGNhc2UgVktfQ0FQSVRBTDoKICAgICAgVFJBQ0UoIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxrZXlfc3RhdGVfdGFibGVbdmtleV0pOwogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnQtPnR5cGUsIGV2ZW50X3RpbWUgKTsKICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyIDogJSMuMnhcbiIsa2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIEFkanVzdCB0aGUgTlVNTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEoa2V5X3N0YXRlX3RhYmxlW1ZLX05VTUxPQ0tdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBOdW1Mb2NrTWFzaykpCgkgIHsKCSAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUuXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UHJlc3MsIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UmVsZWFzZSwgZXZlbnRfdGltZSApOwoJICB9CiAgICAgICAgLyogQWRqdXN0IHRoZSBDQVBTTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBMb2NrTWFzaykpCgkgIHsKICAgICAgICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHMgTG9jayBzdGF0ZS5cbiIpOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlQcmVzcywgZXZlbnRfdGltZSApOwoJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBLZXlSZWxlYXNlLCBldmVudF90aW1lICk7CgkgIH0KCS8qIE5vdCBOdW0gbm9yIENhcHMgOiBlbmQgb2YgaW50ZXJtZWRpYXJ5IHN0YXRlcyBmb3IgYm90aC4gKi8KCU51bVN0YXRlID0gRkFMU0U7CglDYXBzU3RhdGUgPSBGQUxTRTsKCgliU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwoJVFJBQ0VfKGtleSkoImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKCWR3RmxhZ3MgPSAwOwoJaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CglpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXkgJiAweGZmLCBiU2NhbiwgZHdGbGFncywgZXZlbnRfdGltZSwgMCwgMCApOwogICAgfQogICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCAodm9pZCkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBpLCBzeW1zOwogIGludCBzY29yZSwga2V5Yywga2V5LCBwa2V5LCBvazsKICBLZXlTeW0ga2V5c3ltID0gMDsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbMjU2XVs0XTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KCiAgbWVtc2V0KCBja2V5LCAwLCBzaXplb2YoY2tleSkgKTsKICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewogICAgICAgIGlmICghKGtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpKSkgY29udGludWU7CgkvKiBBbGxvdyBib3RoIG9uZS1ieXRlIGFuZCB0d28tYnl0ZSBuYXRpb25hbCBrZXlzeW1zICovCglpZiAoKGtleXN5bSA8IDB4ODAwMCkgJiYgKGtleXN5bSAhPSAnICcpKQogICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2tleWNdW2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJYS0IgY291bGQgbm90IHRyYW5zbGF0ZSBrZXlzeW0gJWxkXG4iLCBrZXlzeW0pOwogICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2tleVtrZXljXVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNlIHsKCSAgY2tleVtrZXljXVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogIH0KCiAgZm9yIChjdXJyZW50ID0gMDsgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQ7IGN1cnJlbnQrKykgewogICAgVFJBQ0UoIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50KTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgaWYgKGNrZXlba2V5Y11bMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlba2V5Y11baV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKICAgICAgICAgIC8qIHByaW50IHNwYWNlcyBpbnN0ZWFkIG9mIFwwJ3MgKi8KICAgICAgICAgIGNoYXIgc3RyWzVdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgc3RyW2ldID0gY2tleVtrZXljXVtpXSA/IGNrZXlba2V5Y11baV0gOiAnICc7CiAgICAgICAgICBzdHJbNF0gPSAwOwogICAgICAgICAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXlzeW0gMHglMDRsWCwga2V5Y29kZSAlZCwgZ290ICVzXG4iLCBrZXlzeW0sIGtleWMsIHN0ciApOwogICAgICAgICAgbWlzbWF0Y2grKzsKICAgICAgICAgIHNjb3JlIC09IHN5bXM7Cgl9CiAgICAgIH0KICAgIH0KICAgIFRSQUNFKCJtYXRjaGVzPSVkLCBtaXNtYXRjaGVzPSVkLCBzZXE9JWQsIHNjb3JlPSVkXG4iLAoJICAgbWF0Y2gsIG1pc21hdGNoLCBzZXEsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkKICAgIFdBUk4oIlVzaW5nIGNsb3Nlc3QgbWF0Y2ggKCVzKSBmb3Igc2Nhbi92aXJ0dWFsIGNvZGVzIG1hcHBpbmcuXG4iLAogICAgICAgIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKCiAgVFJBQ0UoImRldGVjdGVkIGxheW91dCBpcyBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCh2b2lkKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleVN5bSAqa3NwOwogICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgS2V5Q29kZSAqa2NwOwogICAgWEtleUV2ZW50IGUyOwogICAgV09SRCBzY2FuLCB2a2V5LCBPRU12a2V5OwogICAgaW50IGtleWMsIGksIGtleW4sIHN5bXM7CiAgICBjaGFyIGNrZXlbNF09ezAsMCwwLDB9OwogICAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICAgIGNoYXIgdmtleV91c2VkWzI1Nl0gPSB7IDAgfTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFhGcmVlKGtzcCk7CgogICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CgogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwoKICAgIE9FTXZrZXkgPSBWS19PRU1fODsgLyogbmV4dCBpcyBhdmFpbGFibGUuICAqLwogICAgbWVtc2V0KGtleWMydmtleSwgMCwgc2l6ZW9mKGtleWMydmtleSkpOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsgLyogWEZyZWU4NiB2ZW5kb3Iga2V5cyAqLwogICAgICAgICAgICAgICAgdmtleSA9IHhmcmVlODZfdmVuZG9yX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgLyogQWxsIHZlbmRvciBrZXlzIGFyZSBleHRlbmRlZCB3aXRoIGEgc2NhbiBjb2RlIG9mIDAgcGVyIHRlc3Rpbmcgb24gV2luWFAgKi8KICAgICAgICAgICAgICAgIHNjYW4gPSAweDEwMDsKCQl2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICUwNHggPT4gdmtleSAlMDR4XG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICAgICAgaWYgKCh2a2V5ICYgMHhmZikgJiYgdmtleV91c2VkWyh2a2V5ICYgMHhmZildKQogICAgICAgICAgICBXQVJOKCJ2a2V5ICUwNHggaXMgYmVpbmcgdXNlZCBieSBtb3JlIHRoYW4gb25lIGtleWNvZGVcbiIsIHZrZXkpOwogICAgICAgIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSA9IDE7CiAgICB9IC8qIGZvciAqLwoKI2RlZmluZSBWS0VZX0lGX05PVF9VU0VEKHZrZXkpICh2a2V5X3VzZWRbKHZrZXkpXSA/IDAgOiAodmtleV91c2VkWyh2a2V5KV0gPSAxLCAodmtleSkpKQogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhmZjsKICAgICAgICBpZiAodmtleSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwogICAgICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gWEtfMCAmJiBrZXlzeW0gPD0gWEtfOSkKICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gWEtfQSAmJiBrZXlzeW0gPD0gWEtfWikpIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKGtleXN5bSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8yKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzQpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV81KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9DT01NQSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BFUklPRCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX01JTlVTKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUExVUyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgewogICAgICAgICAgICAvKiBPdGhlcnMga2V5czogbGV0J3MgYXNzaWduIE9FTSB2aXJ0dWFsIGtleSBjb2RlcyBpbiB0aGUgYWxsb3dlZCByYW5nZSwKICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoKytPRU12a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKE9FTXZrZXkgPCAweGY1ICYmIHZrZXlfdXNlZFtPRU12a2V5XSk7CgogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChPRU12a2V5KTsKCiAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWDpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoImtleWNvZGUgJTA0eCA9PiB2a2V5ICUwNHhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIH0KICAgIH0gLyogZm9yICovCiN1bmRlZiBWS0VZX0lGX05PVF9VU0VECgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICUwMnggKCVzKVxuIixzY2FuLGtleWMsa3NuYW1lKTsKCWtleWMyc2NhbltrZXljXT1zY2FuKys7CiAgICAgIH0KCiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgU0hPUlQgcmV0dmFsOwoKICAgIC8qIFBob3Rvc2hvcCBsaXZlbG9ja3MgdW5sZXNzIG1vdXNlIGV2ZW50cyBhcmUgaW5jbHVkZWQgaGVyZSAqLwogICAgWDExRFJWX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMCwgTlVMTCwgMCwgUVNfS0VZIHwgUVNfTU9VU0UsIDAgKTsKCiAgICByZXR2YWwgPSAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg0MCkgPyAweDAwMDEgOiAwKSB8CiAgICAgICAgICAgICAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg4MCkgPyAweDgwMDAgOiAwKTsKICAgIGtleV9zdGF0ZV90YWJsZVtrZXldICY9IH4weDQwOwogICAgVFJBQ0VfKGtleSkoIigleCkgLT4gJXhcbiIsIGtleSwgcmV0dmFsKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0TGlzdCAoWDExRFJWLkApCiAqLwpVSU5UIFgxMURSVl9HZXRLZXlib2FyZExheW91dExpc3QoSU5UIHNpemUsIEhLTCAqaGtsKQp7CiAgICBJTlQgaTsKCiAgICBUUkFDRSgiJWQsICVwXG4iLCBzaXplLCBoa2wpOwoKICAgIGlmICghc2l6ZSkKICAgIHsKICAgICAgICBzaXplID0gNDA5NjsgLyogaG9wZSB3ZSB3aWxsIG5ldmVyIGhhdmUgdGhhdCBtYW55ICovCiAgICAgICAgaGtsID0gTlVMTDsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBtYWluX2tleV90YWJbaV0uY29tbWVudCAmJiAoaSA8IHNpemUpOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGhrbCkKICAgICAgICB7CiAgICAgICAgICAgIFVMT05HX1BUUiBsYXlvdXQgPSBtYWluX2tleV90YWJbaV0ubGNpZDsKICAgICAgICAgICAgTEFOR0lEIGxhbmdpZDsKCiAgICAgICAgICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgICAgICAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgICAgICAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgICAgICAgICAgaGtsW2ldID0gKEhLTClsYXlvdXQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgVUxPTkdfUFRSIGxheW91dDsKICAgIExBTkdJRCBsYW5naWQ7CgogICAgaWYgKGR3VGhyZWFkaWQgJiYgZHdUaHJlYWRpZCAhPSBHZXRDdXJyZW50VGhyZWFkSWQoKSkKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKI2lmIDAKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwojZWxzZQogICAgLyogRklYTUU6CiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKI2VuZGlmCiAgICAvKiAKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogRklYTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywnbCcsJ3gnLDB9OwogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgc3ByaW50ZlcobmFtZSwgZm9ybWF0VywgbGF5b3V0KTsKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cobmFtZSkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcCwgJTA0eDogc3R1YiFcbiIsIGhrbCwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKCZldmVudC0+eG1hcHBpbmcpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaSwgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIC8qIEZJWE1FOiB3aGF0IGhhcHBlbnMgaWYgd0NoYXIgaXMgbm90IGEgTGF0aW4xIGNoYXJhY3RlciBhbmQgQ1BfVU5JWENQCiAgICAgKiBpcyBVVEYtOCAobXVsdGlieXRlIGVuY29kaW5nKT8KICAgICAqLwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFKCInJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4ICglZClcbiIsCiAgICAgICAgICAgIGNDaGFyLCBrZXlzeW0sIGtleXN5bSwga2V5Y29kZSwga2V5Y29kZSk7CgogICAgLyoga2V5Y29kZSAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCiAgICByZXQgPSBrZXljMnZrZXlba2V5Y29kZV07CgogICAgaWYgKCFrZXljb2RlIHx8ICFyZXQpCiAgICB7CiAgICAgICAgVFJBQ0UoImtleWNvZGUgZm9yICclYycgbm90IGZvdW5kLCByZXR1cm5pbmcgLTFcbiIsIGNDaGFyKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW5kZXggPSAtMTsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwogICAgewogICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGkpID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBzd2l0Y2ggKGluZGV4KQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIiwga2V5c3ltKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgIGNhc2UgMTogcmV0ICs9IDB4MDEwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiByZXQgKz0gMHgwNjAwOyBicmVhazsKICAgICAgICBjYXNlIDM6IHJldCArPSAweDA3MDA7IGJyZWFrOwogICAgfQogICAgLyoKICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAogICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCiAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQogICAgICovCgogICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5RXggKFgxMURSVi5AKQogKi8KVUlOVCBYMTFEUlZfTWFwVmlydHVhbEtleUV4KFVJTlQgd0NvZGUsIFVJTlQgd01hcFR5cGUsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoaGtsICE9IFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgoJc3dpdGNoKHdNYXBUeXBlKSB7CgkJY2FzZSBNQVBWS19WS19UT19WU0M6IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KCQljYXNlIE1BUFZLX1ZLX1RPX1ZTQ19FWDogLyogRklYTUU6IHNob3VsZCBkaWZmZXJlbnRpYXRlIGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCBrZXlzICovCgkJewoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJCQlyZXR1cm5NVksgKGtleWMyc2NhbltrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7CgkJfQoJCWNhc2UgTUFQVktfVlNDX1RPX1ZLOiAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCgkJY2FzZSBNQVBWS19WU0NfVE9fVktfRVg6IC8qIEZJWE1FOiBzaG91bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQga2V5cyAqLwoJCXsKCQkJLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCgkJCQkJcmV0dXJuTVZLIChrZXljMnZrZXlba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyB2a2V5LWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOwoJCX0KCQljYXNlIE1BUFZLX1ZLX1RPX0NIQVI6IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCgkJewogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgInVuc2hpZnRlZCIgbWVhbnMuIGluIHdpbmRvd3MgVktfVyAoMHg1NykKICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJucyAweDU3LCB3aGljaCBpcyB1cGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljOwoJCQljaGFyIHNbMl07CgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgoJCQllLnN0YXRlID0gTG9ja01hc2s7CgkJCS8qIExvY2tNYXNrIHNob3VsZCBiZWhhdmUgZXhhY3RseSBsaWtlIGNhcHMgbG9jayAtIHVwZXJjYXNlCgkJCSAqIHRoZSBsZXR0ZXIga2V5cyBhbmQgdGhhdCdzIGFib3V0IGl0LiAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgoJCQllLmtleWNvZGUgPSAwOwoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KDAsJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKCQkJaWYgKFhMb29rdXBTdHJpbmcoJmUsIHMsIDIsICZrZXlzeW0sIE5VTEwpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTVZLICgqcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQlyZXR1cm4gMDsKCQl9CgkJZGVmYXVsdDogLyogcmVzZXJ2ZWQgKi8KCQkJRklYTUUoIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwoJCQlyZXR1cm4gMDsKCX0KCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleU5hbWVUZXh0IChYMTFEUlYuQCkKICovCklOVCBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQV1NUUiBscEJ1ZmZlciwgSU5UIG5TaXplKQp7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgLyogRklYTUU6IHNob3VsZCB1c2UgTVZLIHR5cGUgMyAoTlQgdmVyc2lvbiB0aGF0IGRpc3Rpbmd1aXNoZXMgcmlnaHQgYW5kIGxlZnQgKi8KICB2a2V5ID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeChzY2FuQ29kZSwgMSwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCAyLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXJXKChXQ0hBUilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IFhLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CiAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0lMDR4IGtleXN5bT0lMDR4IHN0cmluZz0lc1xuIiwKICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgbmFtZSk7CiAgICAgIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSAmJiBuYW1lKQogICAgICB7CiAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgLTEsIGxwQnVmZmVyLCBuU2l6ZSk7CiAgICAgICAgICBscEJ1ZmZlcltuU2l6ZSAtIDFdID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICB9CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIFdBUk4gZm9yIHVua25vd24ga2V5cyAgICovCgogIFdBUk4oIiglMDh4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNHgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICBpZiAobHBCdWZmZXIgJiYgblNpemUpCiAgICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsCgkJICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBscENoYXJbMTBdOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChoa2wgIT0gWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICh2aXJ0S2V5ID49IFZLX0xFRlQgJiYgdmlydEtleSA8PSBWS19ET1dOKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5IC0gVktfTEVGVCArIFhLX0xlZnQpOwoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICh2aXJ0S2V5PT1WS19TRVBBUkFUT1IpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB2aXJ0S2V5KTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0UoIkZvdW5kIGtleWNvZGUgJWQgKDB4JTJYKVxuIixlLmtleWNvZGUsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nLAogICAgICogZS50eXBlIHdhcyBzZXQgdG8gS2V5UHJlc3MgYWJvdmUuCiAgICAgKi8KICAgIGlmICh4aWMpCiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICBFUlIoIkJ1ZmZlciBPdmVyZmxvdyBuZWVkICVkIVxuIiwgcmV0KTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDA5OwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQogICAgICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgJmRlYWRfY2hhciwgMSwgYnVmVywgYnVmV19zaXplKTsKCSAgICByZXQgPSAtMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgogICAgICAgIGlmIChrZXlzeW0gPj0gMHgwMTAwMDEwMCAmJiBrZXlzeW0gPD0gMHgwMTAwZmZmZikKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVuaWNvZGUgZGlyZWN0IG1hcHBpbmcgKi8KICAgICAgICAgICAgYnVmV1swXSA9IGtleXN5bSAmIDB4ZmZmZjsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGtleXN5bSA+PiA4KSA9PSAweDEwMDhGRikgewogICAgICAgICAgICBidWZXWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgllbHNlCgkgICAgewoJICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoJICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlXQVJOKCJubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lKTsKCQlXQVJOKCJ2aXJ0S2V5PSVYLCBzY2FuQ29kZT0lWCwga2V5Y29kZT0lWCwgc3RhdGU9JVhcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBtb3JlIGFyZWFzIHdoZXJlIFggcmV0dXJucyBjaGFyYWN0ZXJzIGJ1dCBXaW5kb3dzIGRvZXMgbm90CiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sICovCiAgICAgICAgaWYgKGUuc3RhdGUgJiBDb250cm9sTWFzaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGtleXN5bT49MzMpICYmIChrZXlzeW0gPCAnQScpKSB8fAogICAgICAgICAgICAgICAgKChrZXlzeW0gPiAnWicpICYmIChrZXlzeW0gPCAnYScpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogSGFjayB0byBkZXRlY3QgYW4gWExvb2t1cFN0cmluZyBoYXJkLWNvZGVkIHRvIExhdGluMSAqLwogICAgICAgIGlmIChyZXQgPT0gMSAmJiBrZXlzeW0gPj0gMHgwMGEwICYmIGtleXN5bSA8PSAweDAwZmYgJiYgKEJZVEUpbHBDaGFyWzBdID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAoQllURSlscENoYXJbMF07CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCB0byB1bmljb2RlXG4iLCAqKEJZVEUgKilscENoYXIpOwoJICAgIHJldCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBscENoYXIsIHJldCwgYnVmVywgYnVmV19zaXplKTsKCX0KICAgIH0KCmZvdW5kOgogICAgVFJBQ0VfKGtleSkoIlRvVW5pY29kZSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4ICVzXG4iLAoJCXJldCwgKHJldCAmJiBidWZXKSA/IGJ1ZldbMF0gOiAwLCBidWZXID8gIiIgOiAiKG5vIGJ1ZmZlcikiKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQmVlcCAoWDExRFJWLkApCiAqLwp2b2lkIFgxMURSVl9CZWVwKHZvaWQpCnsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWEJlbGwodGhyZWFkX2Rpc3BsYXkoKSwgMCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9Cg==