LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1hLQgojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvd2ludXNlcjE2LmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZGlucHV0KTsKCnN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpzdGF0aWMgV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgTFBCWVRFIHBLZXlTdGF0ZVRhYmxlOwpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwpzdGF0aWMgaW50IGtjQ29udHJvbCwga2NBbHQsIGtjU2hpZnQsIGtjTnVtTG9jaywga2NDYXBzTG9jazsgLyoga2V5Y29kZXMgKi8KCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSk7CgovKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KI2RlZmluZSBNQUlOX0xFTiA0OQpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIHRoaXMgaXMgbXkgKDEwMi1rZXkpIGtleWJvYXJkIGxheW91dCwgc29ycnkgaWYgaXQgZG9lc24ndCBxdWl0ZSBtYXRjaCB5b3VycyAqLwogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgPSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBbICAgIF0gKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgICcgICAgXCAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIFwgICAgICB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4NWUsMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2R2b3Jha1tNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgWyAgICBdICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDFBLDB4MUIsCiAvKiAnICAgICwgICAgLiAgICBwICAgIHkgICAgZiAgICBnICAgIGMgICAgciAgICBsICAgIC8gICAgPSAqLwogICAweDI4LDB4MzMsMHgzNCwweDE5LDB4MTUsMHgyMSwweDIyLDB4MkUsMHgxMywweDI2LDB4MzUsMHgwRCwKIC8qIGEgICAgbyAgICBlICAgIHUgICAgaSAgICBkICAgIGggICAgdCAgICBuICAgIHMgICAgLSAgICBcICovCiAgIDB4MUUsMHgxOCwweDEyLDB4MTYsMHgxNywweDIwLDB4MjMsMHgxNCwweDMxLDB4MUYsMHgwQywweDJCLAogLyogOyAgICBxICAgIGogICAgayAgICB4ICAgIGIgICAgbSAgICB3ICAgIHYgICAgeiAqLwogICAweDI3LDB4MTAsMHgyNCwweDI1LDB4MkQsMHgzMCwweDMyLDB4MTEsMHgyRiwweDJDLAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgVktfT0VNXzEwMiwnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV84LFZLX09FTV81LAogICBWS19PRU1fNywnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hemVydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fNywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgICdBJywnWicsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNixWS19PRU1fMSwKICAgJ1EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsJ00nLFZLX09FTV8zLFZLX09FTV81LAogICAnVycsJ1gnLCdDJywnVicsJ0InLCdOJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fOCwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfZHZvcmFrW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV82LAogICBWS19PRU1fNyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCwnUCcsJ1knLCdGJywnRycsJ0MnLCdSJywnTCcsVktfT0VNXzIsVktfT0VNX1BMVVMsCiAgICdBJywnTycsJ0UnLCdVJywnSScsJ0QnLCdIJywnVCcsJ04nLCdTJyxWS19PRU1fTUlOVVMsVktfT0VNXzUsCiAgIFZLX09FTV8xLCdRJywnSicsJ0snLCdYJywnQicsJ00nLCdXJywnVicsJ1onLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgV0lORURFQlVHPStrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIlx4ZmNceGRjIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGY2XHhkNiIsIlx4ZTRceGM0IiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBFcmljIFBvdWVjaCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyfiIsIlwiMyMiLCInNHsiLCIoNVsiLCItNnwiLCLoN2AiLCJfOFxcIiwi5zlesSIsIuAwQCIsIimwXSIsIj0rfSIsCiAiYUEiLCJ6WiIsImVFvyIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqgiLCIko6QiLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFVscmljaCBXZWlnYW5kKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUWAIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiO0IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTbUiLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCK0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUgS2V5cyAoY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgRmVjaG5lcikqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRfMTA1W01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwisiIsIjOnsyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCInYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAiPD58IiwieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAp9OwoKLyoqKiBTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBKb25hdGhhbiBOYXlsb3IpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NHW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErfCIsIjJcIkAiLCIzKiMiLCI05yIsIjUlIiwiNiasIiwiNy+mIiwiOCiiIiwiOSkiLCIwPSIsIic/tCIsIl5gfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86FsiLCKoIV0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OB7IiwiJKN9IiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD5cXCIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGhpbGlwcGUgRnJvaWRldmF1eCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0ZbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSt8IiwiMlwiQCIsIjMqIyIsIjTnIiwiNSUiLCI2JqwiLCI3L6YiLCI4KKIiLCI5KSIsIjA9IiwiJz+0IiwiXmB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8WyIsIqghXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5HsiLCIko30iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PlxcIgp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGspICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2UpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEVzdG9uaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBNZXRzbWEgem9tYmk4MkBob3QuZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrP1xcIiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11aciLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKr0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIENBTi9DU0EgWjI0My4yMDAtOTIga2V5Ym9hcmQgbGF5b3V0IAogKioqIENvbnRyaWJ1dGVkIGJ5IEplYW4tTWljaGVsIERhdWx0IDxqbWRhdWx0QHJldm9sdXRpb25saW51eC5jb20+ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBW01BSU5fTEVOXVs0XSA9CnsKCiAiL1xcIiwiMSG5oSIsIjJAsiIsIjMjs6MiLCI0JLykIiwiNSW9IiwiNj++IiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUrauIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/jYIiwicFD+3iIsIl6o5cUiLCLnx34iLAogImFB5sYiLCJzU9+nIiwiZETw0CIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6tCIsIujIIiwi4MAiLAogInpaIiwieFgiLCJjQ6KpIiwidlYiLCJiQiIsIm5OIiwibU21uiIsIiwnIiwiLlwit/ciLCLpySIsCiAi+dkiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgcHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqu7IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIisqIiwitGAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwiuqoiLCJ+XiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGl0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCLsXiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo6SIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLy5yIsIuCwIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmaSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfYmRzW01BSU5fTEVOXVs0XSA9CnsKICJgfigpIiwiMSEiLCIyQDI/IiwiMyMzKyIsIjQkNFwiIiwiNSUiLCI2XjY9IiwiNyY3OiIsIjgqOC8iLCI5KCIsIjApIiwiLV8tSSIsIj0rLlYiLAogInFRLPsiLCJ3V/PTIiwiZUXlxSIsInJS6MgiLCJ0VPjYIiwieVn52SIsInVV6soiLCJpSfHRIiwib0/kxCIsInBQ58ciLCJbe/bWIiwiXX07IiwKICJhQfzcIiwic1P/3yIsImRE4MAiLCJmRu7OIiwiZ0fmxiIsImhI48MiLCJqSvLSIiwia0vtzSIsImxM4sIiLCI7OuzMIiwiJ1wi99ciLCJcXHwn2yIsCiAielr+3iIsInhY6ckiLCJjQ/raIiwidlb93SIsImJC9NQiLCJuTvXVIiwibU3vzyIsIiw88NAiLCIuPuvLIiwiLz/hwSIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfvfXIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUf/fIiwid1fiwiIsImVF5cUiLCJyUvDQIiwidFTy0iIsInlZ+toiLCJ1VfPTIiwiaUnoyCIsIm9P7s4iLCJwUO/PIiwiW3v42CIsIl19+dkiLAogImFB4MAiLCJzU/HRIiwiZETkxCIsImZG9NQiLCJnR+PDIiwiaEj11SIsImpK6ckiLCJrS+rKIiwibEzryyIsIjs6IiwiJ1wiIiwiXFx8/t4iLAogInpa58ciLCJ4WPzcIiwiY0P21iIsInZW5sYiLCJiQuHBIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQmVsYXJ1c2lhbiBzdGFuZGFyZCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEhsZWIgVmFsb3NrYSkgKi8KLyoqKiBJdCBtYXRjaGVzIGJlbGFydXNpYW4gbGF5b3V0IGZvciBYS0IgZnJvbSBBbGV4YW5kZXIgTWlraGFpbGlhbiAgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CWVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6jsyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT66+IiwicFDa+iIsIlt7yOgiLCJdfScnIiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwvfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCprYiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8uLCIsICI8PnymIiwKfTsKCgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQYXZlbCBSb3NraW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfa29pOHJbTUFJTl9MRU5dWzRdID0KewogIigpIiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNToiLCI2LCIsIjcuIiwiODsiLCI5PyIsIjAlIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFx8IiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfY3AxMjUxW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHpySIsIndX9tYiLCJlRfPTIiwiclLqyiIsInRU5cUiLCJ5We3NIiwidVXjwyIsImlJ+NgiLCJvT/nZIiwicFDnxyIsIlt79dUiLCJdffraIiwKICJhQfTUIiwic1P72yIsImRE4sIiLCJmRuDAIiwiZ0fvzyIsImhI8NAiLCJqSu7OIiwia0vryyIsImxM5MQiLCI7OubGIiwiJ1wi/d0iLCJcXHwiLAogInpa/98iLCJ4WPfXIiwiY0Px0SIsInZW7MwiLCJiQujIIiwibk7y0iIsIm1N/NwiLCIsPOHBIiwiLj7+3iIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHR8SIsIndX1/ciLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdn5IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfd39IiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSsrqIiwia0vL6yIsImxMzOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielra+iIsInhY2PgiLCJjQ8PjIiwidlbW9iIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6tvSIsIjEhMSEiLCIyQDJcIiIsIjMjMyciLCI0JDQqIiwiNSU1OiIsIjZeNiwiLCI3JjcuIiwiOCo4OyIsIjkoOSgiLCIwKTApIiwiLV8tXyIsIj0rPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX2ntyIsCiAiYUHG5iIsInNTprYiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcIqS0IiwiXFx8XFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIGJ5IE8uIE55a3lmb3JjaHluICovCi8qKiogIChhcyBpdCBhcHBlYXJzIG9uIG1vc3Qgb2Yga2V5Ym9hcmRzIHNvbGQgdG9kYXkpICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKtvSIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCKntyIsCiAixuYiLCKmtiIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCKktCIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIChwYWlyIHRvIHRoZSBwcmV2aW91cykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKjsyIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVNbTUFJTl9MRU5dWzRdID0KewogIrqqIiwiMSEiLCIyXCIiLCIztyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKhvyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJgXiIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIrSoIiwi58ciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgWm9sdOFuIEtvduFjcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSd+IiwiMlwityIsIjMrXiIsIjQhoiIsIjUlsCIsIjYvsiIsIjc9YCIsIjgo/yIsIjkptCIsIvbWvSIsIvzcqCIsIvPTuCIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSc0iLCJvT/giLCJwUCIsIvXV9yIsIvra1yIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpK7SIsImtLsyIsImxMoyIsIunJJCIsIuHB3yIsIvvbpCIsCiAieVk+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzsiLCIuOj4iLCItXyoiLAogIu3NPCIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGhyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCIvPyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfcGM5OHgxW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMCIsIi09IiwiXmAiLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQH4iLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFJhdWwgR29tZXMgRmVybmFuZGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjaoIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrRgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwifl4iLCJdfSIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IHdpdGggPEFMVCBHUj4gKGNvbnRyaWJ1dGVkIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJfYWx0X2dyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxITkiLCIyQDIiLCIzIzMiLCI0JCMiLCI1JVwiIiwiNigsIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rJyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCI0YCIsIlt7KiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiZ0ciLCJ+XiIsIl19OiIsCiAiXFx8IiwieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiOzoiLCIvPzAiCn07CgovKioqIFVTIGludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHdXN0YXZvIE5vcm9uaGEgKGtvdkBkZWJpYW4ub3JnKSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfaW50bFtNQUlOX0xFTl1bNF0gPQp7CiAgImB+IiwgIjEhIiwgIjJAIiwgIjMjIiwgIjQkIiwgIjUlIiwgIjZeIiwgIjcmIiwgIjgqIiwgIjkoIiwgIjApIiwgIi1fIiwgIj0rIiwgIlxcfCIsCiAgInFRIiwgIndXIiwgImVFIiwgInJSIiwgInRUIiwgInlZIiwgInVVIiwgImlJIiwgIm9PIiwgInBQIiwgIlt7IiwgIl19IiwKICAiYUEiLCAic1MiLCAiZEQiLCAiZkYiLCAiZ0ciLCAiaEgiLCAiakoiLCAia0siLCAibEwiLCAiOzoiLCAiJ1wiIiwKICAieloiLCAieFgiLCAiY0MiLCAidlYiLCAiYkIiLCAibk4iLCAibU0iLCAiLDwiLCAiLj4iLCAiLz8iCn07CgovKioqIFNsb3ZhayBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShza19xd2VydHkpIGluIHhrYnNlbCkKICAtIGRlYWRfYWJvdmVyaW5nIHJlcGxhY2VkIHdpdGggZGVncmVlIC0gbm8gc3ltYm9sIGluIGlzbzg4NTktMgogIC0gYnJva2VuYmFyIHJlcGxhY2VkIHdpdGggYmFyCQkJCQkqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS1tNQUlOX0xFTl1bNF0gPQp7CiAiOzAiLCIrMSIsIrUyIiwiuTMiLCLoNCIsIrs1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwiJ3YiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCLkKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9FwiIiwipyEiLCLyKSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjeikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjel9xd2VydHkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaX3F3ZXJ0eVtNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIFNsb3ZhayBhbmQgQ3plY2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19kdWFsKGNzX3NrX3VjdykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLX3Byb2dbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUeTEIiwid1fszCIsImVF6ckiLCJyUvjYIiwidFS7qyIsInlZ/d0iLCJ1VfnZIiwiaUntzSIsIm9P89MiLCJwUPbWIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTuakiLCJkRO/PIiwiZkbryyIsImdH4MAiLCJoSPraIiwiakr83CIsImtL9NQiLCJsTLWlIiwiOzoiLCInXCIiLCJcXHwiLAogInpavq4iLCJ4WKQiLCJjQ+jIIiwidlbnxyIsImJCIiwibk7y0iIsIm1N5cUiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBDemVjaCBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2libShjc19xd2VydHkpIGluIHhrYnNlbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1NbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpML0pIiwiPSUiLCIiLAogInFRXFwiLCJ3V3wiLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i9beyIsIikoXX0iLAogImFBIiwic1PwIiwiZETQIiwiZkZbIiwiZ0ddIiwiaEgiLCJqSiIsImtLsyIsImxMoyIsIvlcIiQiLCKnId8iLCKoJyIsCiAielo+IiwieFgjIiwiY0MmIiwidlZAIiwiYkJ7Iiwibk59IiwibU0iLCIsPzwiLCIuOj4iLCItXyoiLAogIjw+XFx8Igp9OwoKLyoqKiBMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEdhYnJpZWwgT3JsYW5kbyBHYXJjaWEpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xBW01BSU5fTEVOXVs0XSA9CnsKICJ8sCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiv6EiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIrSoIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwie1teIiwifV0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQgKHBjL2x0IGluIFhGcmVlODYgNC4zLjAsIGNvbnRyaWJ1dGVkIGJ5IE5lcmlqdXMgQmFsaftuYXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBMYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVEtbTUFJTl9MRU5dWzRdID0KewoiXCLpIiwiMSEiLCIyJyIsIjNeIyIsIjQrJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIqP1xcIiwiLV8iLAoicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwi/UnuIiwib08iLCJwUCIsIvDQIiwi/Nx+IiwKImFB5iIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7YCIsCiJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIvbWIiwi58ciLCIuOiIKfTsKCi8qKiogVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVFJbTUFJTl9MRU5dWzRdID0KewoiXCJcXCIsIjEhIiwiMiciLCIzXiIsIjQrIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKj8iLCItXyIsCiJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1JIiwib08iLCJwUCIsIvDQIiwi/NwiLAoiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi/t4iLCJp3SIsIiw7IiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46IiwKIjw+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+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItPSIsCiAiW10iCn07CgoKCi8qKiogTGF5b3V0IHRhYmxlLiBBZGQgeW91ciBrZXlib2FyZCBtYXBwaW5ncyB0byB0aGlzIGxpc3QgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBMQ0lEIGxjaWQ7IC8qIGlucHV0IGxvY2FsZSBpZGVudGlmaWVyLCBsb29rIGZvciBMT0NBTEVfSUxBTkdVQUdFCiAgICAgICAgICAgICAgICAgaW4gdGhlIGFwcHJvcHJpYXRlIGRsbHMva2VybmVsL25scy8ubmxzIGZpbGUgKi8KICAgIGNvbnN0IGNoYXIgKmNvbW1lbnQ7CiAgICBjb25zdCBjaGFyICgqa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjb25zdCBXT1JEICgqc2NhbilbTUFJTl9MRU5dOyAvKiBzY2FuIGNvZGVzIG1hcHBpbmcgKi8KICAgIGNvbnN0IFdPUkQgKCp2a2V5KVtNQUlOX0xFTl07IC8qIHZpcnR1YWwga2V5IGNvZGVzIG1hcHBpbmcgKi8KfSBtYWluX2tleV90YWJbXT17CiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfVVNfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWspIiwgJm1haW5fa2V5X1VTX2R2b3JhaywgJm1haW5fa2V5X3NjYW5fZHZvcmFrLCAmbWFpbl9rZXlfdmtleV9kdm9yYWt9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMgSW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVVNfaW50bCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwOSwgIkJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9ERSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfREVfbm9kZWFkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCBmb3IgbG9naXRlY2ggZGVza3RvcCBwcm8iLCAmbWFpbl9rZXlfREVfbG9naXRlY2gsICAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUiLCAmbWFpbl9rZXlfREVfbm9kZWFkXzEwNSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIENBTi9DU0EtWjI0My4yMDAtOTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODBjLCAiQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDA4MTYsICJQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BUX2JyLCAmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IEFMVCBHUiIsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MGIsICJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX2JkcywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjMsICJCZWxhcnVzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CWSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1JVX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEiLCAmbWFpbl9rZXlfUlVfY3AxMjUxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlVfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9VQV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1JVX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEwLCAiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGYsICJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBlLCAiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxNSwgIlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjQsICJTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDExLCAiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjeiIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjel9xd2VydHkiLCAmbWFpbl9rZXlfQ1pfcXdlcnR5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI3LCAiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIiLCAmbWFpbl9rZXlfVFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLCAwLCAwLCAwLCAgLyogRkY2MCAqLwogICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX0NBTkNFTCwgMCwgMCwgMCwgMCwgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgVktfQ0xFQVIsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfU0VQQVJBVE9SLCBWS19TVUJUUkFDVCwgVktfREVDSU1BTCwgVktfRElWSURFLAogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgVktfTlVNUEFENCwgVktfTlVNUEFENSwgVktfTlVNUEFENiwgVktfTlVNUEFENywKICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDksIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIFZLX0YxLCBWS19GMiwKICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYsIDAsIDAsICAgICAgIC8qIEZGQzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX01FTlUsCiAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAvKiBGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV9zY2FuWzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIDB4MEUsIDB4MEYsIDB4MDAsIC8qPyovIDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiwgICAgICAvKiBGRjUwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICAvKj8qLyAwLCAweDEzNywgLyo/Ki8gMCwgMHgxNTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIEZGNjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMzgsIDB4MTQ1LCAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExQywgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMHgwMCwgMHgwMCwgMHgzNywgMHg0RSwgLyo/Ki8gMCwgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgMHgzQiwgMHgzQywKICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZDOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAweDAwLCAweDJBLCAweDM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgMHgxMzgsIDB4MzgsIDB4MTM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE1MyAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCi8qIHgxMSBsb2NrIG11c3QgYmUgaGVsZCAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYSUMgeGljLCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwoKICAgIGlmICh4aWMpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGtleXN5bSA+PSAweEZGQUUpICYmIChrZXlzeW0gPD0gMHhGRkI5KSAmJiAoa2V5c3ltICE9IDB4RkZBRikKCSYmIChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIFRSQUNFXyhrZXkpKCJlLT5rZXljb2RlID0gJXhcbiIsIGUtPmtleWNvZGUpOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCnN0YXRpYyBCT09MIE51bVN0YXRlPUZBTFNFLCBDYXBzU3RhdGU9RkFMU0U7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0CiAqLwpzdGF0aWMgdm9pZCBzZW5kX2tleWJvYXJkX2lucHV0KCBXT1JEIHdWaywgV09SRCB3U2NhbiwgRFdPUkQgZHdGbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIGlucHV0LnR5cGUgICAgICAgICAgICAgPSBXSU5FX0lOVEVSTkFMX0lOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHdWazsKICAgIGlucHV0LnUua2kud1NjYW4gICAgICAgPSB3U2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBkd0ZsYWdzOwogICAgaW5wdXQudS5raS50aW1lICAgICAgICA9IHRpbWU7CiAgICBpbnB1dC51LmtpLmR3RXh0cmFJbmZvID0gMDsKICAgIFNlbmRJbnB1dCggMSwgJmlucHV0LCBzaXplb2YoaW5wdXQpICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJS0VZQk9BUkRfR2VuZXJhdGVNc2cKICoKICogR2VuZXJhdGUgRG93bitVcCBtZXNzYWdlcyB3aGVuIE51bUxvY2sgb3IgQ2Fwc0xvY2sgaXMgcHJlc3NlZC4KICoKICogQ29udmVudGlvbiA6IGNhbGxlZCB3aXRoIHZrZXkgb25seSBWS19OVU1MT0NLIG9yIFZLX0NBUElUQUwKICoKICovCnN0YXRpYyB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IEV2dHlwZSwgRFdPUkQgZXZlbnRfdGltZSApCnsKICBCT09MICogU3RhdGUgPSAodmtleT09VktfTlVNTE9DSz8gJk51bVN0YXRlIDogJkNhcHNTdGF0ZSk7CiAgRFdPUkQgdXAsIGRvd247CgogIGlmICgqU3RhdGUpIHsKICAgIC8qIFRoZSBJTlRFUk1FRElBUlkgc3RhdGUgbWVhbnMgOiBqdXN0IGFmdGVyIGEgJ3ByZXNzJyBldmVudCwgaWYgYSAncmVsZWFzZScgZXZlbnQgY29tZXMsCiAgICAgICBkb24ndCB0cmVhdCBpdC4gSXQncyBmcm9tIHRoZSBzYW1lIGtleSBwcmVzcy4gVGhlbiB0aGUgc3RhdGUgZ29lcyB0byBPTi4KICAgICAgIEFuZCBmcm9tIHRoZXJlLCBhICdyZWxlYXNlJyBldmVudCB3aWxsIHN3aXRjaCBvZmYgdGhlIHRvZ2dsZSBrZXkuICovCiAgICAqU3RhdGU9RkFMU0U7CiAgICBUUkFDRSgiSU5URVJNIDogZG9uXCd0IHRyZWF0IHJlbGVhc2Ugb2YgdG9nZ2xlIGtleS4gSW5wdXRLZXlTdGF0ZVRhYmxlWyUjeF0gPSAlI3hcbiIsdmtleSxwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgfSBlbHNlCiAgICB7CiAgICAgICAgZG93biA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCk7CiAgICAgICAgdXAgPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApIHwgS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCBwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MSApIC8qIGl0IHdhcyBPTiAqLwoJICB7CgkgICAgaWYgKEV2dHlwZSE9S2V5UHJlc3MpCgkgICAgICB7CgkJVFJBQ0UoIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CgkgICAgICAgIHNlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGRvd24sIGV2ZW50X3RpbWUgKTsKCSAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUgKTsKCQkqU3RhdGU9RkFMU0U7CgkJcEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvZmYuICovCgkgICAgICB9CgkgIH0KCWVsc2UgLyogaXQgd2FzIE9GRiAqLwoJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKCSAgICB7CgkgICAgICBUUkFDRSgiT0ZGICsgS2V5cHJlc3MgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZG93biwgZXZlbnRfdGltZSApOwoJICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUgKTsKCSAgICAgICpTdGF0ZT1UUlVFOyAvKiBHb2VzIHRvIGludGVybWVkaWFyeSBzdGF0ZSBiZWZvcmUgZ29pbmcgdG8gT04gKi8KCSAgICAgIHBLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7IC8qIFRvZ2dsZSBzdGF0ZSB0byBvbi4gKi8KCSAgICB9CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8KaW5saW5lIHN0YXRpYyB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggaW50IHZrZXksIGludCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChwS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgdmtleSwgcEtleVN0YXRlVGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCiAgICAgICAgc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgMCwgc3RhdGU/IDAgOiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKCiAgICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyICUjLjJ4XG4iLHBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5bWFwTm90aWZ5CiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZC4KICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4KICovCnZvaWQgWDExRFJWX0tleW1hcE5vdGlmeSggSFdORCBod25kLCBYS2V5bWFwRXZlbnQgKmV2ZW50ICkKewogICAgaW50IGksIGosIGFsdCwgY29udHJvbCwgc2hpZnQ7CiAgICBEV09SRCB0aW1lID0gR2V0Q3VycmVudFRpbWUoKTsKCiAgICBhbHQgPSBjb250cm9sID0gc2hpZnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCFldmVudC0+a2V5X3ZlY3RvcltpXSkgY29udGludWU7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICghKGV2ZW50LT5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSkgY29udGludWU7CiAgICAgICAgICAgIHN3aXRjaChrZXljMnZrZXlbKGkgKiA4KSArIGpdICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX01FTlU6ICAgIGFsdCA9IDE7IGJyZWFrOwogICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IGNvbnRyb2wgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19TSElGVDogICBzaGlmdCA9IDE7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX01FTlUsIGFsdCwgdGltZSApOwogICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIFZLX0NPTlRST0wsIGNvbnRyb2wsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19TSElGVCwgc2hpZnQsIHRpbWUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhLZXlFdmVudCAqZXZlbnQgKQp7CiAgICBjaGFyIFN0clsyNF07CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBpZiAoeGljKQogICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIGFzY2lpX2NoYXJzID0gWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCBzaXplb2YoU3RyKSwgJmtleXN5bSwgTlVMTCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIC8qIElnbm9yZSBzb21lIHVud2FudGVkIGV2ZW50cyAqLwogICAgaWYgKChrZXlzeW0gPj0gWEtfSVNPX0xvY2sgJiYga2V5c3ltIDw9IFhLX0lTT19MYXN0X0dyb3VwX0xvY2spIHx8CiAgICAgICAgIGtleXN5bSA9PSBYS19Nb2RlX3N3aXRjaCkKICAgIHsKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBUUkFDRSgiSWdub3JpbmcgJXMga2V5Ym9hcmQgZXZlbnRcbiIsIFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBUUkFDRV8oa2V5KSgic3RhdGUgPSAlWCBuYnl0ZSA9ICVkLCBzdGF0dXMgMHgleFxuIiwgZXZlbnQtPnN0YXRlLCBhc2NpaV9jaGFycywgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICBFUlIoIkJ1ZmZlciBPdmVyZmxvdyBuZWVkICVpIVxuIixhc2NpaV9jaGFycyk7CgogICAgaWYgKHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCiAgICB7CiAgICAgICAgWDExRFJWX1hJTUxvb2t1cENoYXJzKCBTdHIsIGFzY2lpX2NoYXJzICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIFN0clthc2NpaV9jaGFyc10gPSAnXDAnOwogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY2hhcgkqa3NuYW1lOwoKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgIyBvZiBjaGFycz0lZCAvIDB4JTAyeCAvICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIGFzY2lpX2NoYXJzLCBTdHJbMF0gJiAweGZmLCBTdHIpOwogICAgfQoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLGV2ZW50KTsKICAgIC8qIFggcmV0dXJucyBrZXljb2RlIDAgZm9yIGNvbXBvc2VkIGNoYXJhY3RlcnMgKi8KICAgIGlmICghdmtleSAmJiBhc2NpaV9jaGFycykgdmtleSA9IFZLX05PTkFNRTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgaWYgKHZrZXkpCiAgIHsKICAgIHN3aXRjaCAodmtleSAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIFZLX05VTUxPQ0s6CiAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCAweDQ1LCBldmVudC0+dHlwZSwgZXZlbnRfdGltZSApOwogICAgICBicmVhazsKICAgIGNhc2UgVktfQ0FQSVRBTDoKICAgICAgVFJBQ0UoIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCAweDNBLCBldmVudC0+dHlwZSwgZXZlbnRfdGltZSApOwogICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgOiAlIy4yeFxuIixwS2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKHBLZXlTdGF0ZVRhYmxlW1ZLX05VTUxPQ0tdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBOdW1Mb2NrTWFzaykpCgkgIHsKCSAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUuXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UHJlc3MsIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgS2V5UmVsZWFzZSwgZXZlbnRfdGltZSApOwoJICB9CiAgICAgICAgLyogQWRqdXN0IHRoZSBDQVBTTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwoJaWYgKCEocEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSkKCSAgewogICAgICAgICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgQ2FwcyBMb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIEtleVByZXNzLCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIEtleVJlbGVhc2UsIGV2ZW50X3RpbWUgKTsKCSAgfQoJLyogTm90IE51bSBub3IgQ2FwcyA6IGVuZCBvZiBpbnRlcm1lZGlhcnkgc3RhdGVzIGZvciBib3RoLiAqLwoJTnVtU3RhdGUgPSBGQUxTRTsKCUNhcHNTdGF0ZSA9IEZBTFNFOwoKCWJTY2FuID0ga2V5YzJzY2FuW2V2ZW50LT5rZXljb2RlXSAmIDB4RkY7CglUUkFDRV8oa2V5KSgiYlNjYW4gPSAweCUwMnguXG4iLCBiU2Nhbik7CgoJZHdGbGFncyA9IDA7CglpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKCWlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoKICAgICAgICBzZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUgKTsKICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dAogKgogKiBDYWxsZWQgZnJvbSBYMTFEUlZfSW5pdEtleWJvYXJkCiAqICBUaGlzIHJvdXRpbmUgd2Fsa3MgdGhyb3VnaCB0aGUgZGVmaW5lZCBrZXlib2FyZCBsYXlvdXRzIGFuZCBzZWxlY3RzCiAqICB3aGljaGV2ZXIgbWF0Y2hlcyBtb3N0IGNsb3NlbHkuCiAqIFgxMSBsb2NrIG11c3QgYmUgaGVsZC4KICovCnN0YXRpYyB2b2lkClgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQgKHZvaWQpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bTsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbNF0gPQogIHswLCAwLCAwLCAwfTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KICBmb3IgKGN1cnJlbnQgPSAwOyBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudDsgY3VycmVudCsrKSB7CiAgICBUUkFDRSgiQXR0ZW1wdGluZyB0byBtYXRjaCBhZ2FpbnN0IFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQpOwogICAgbWF0Y2ggPSAwOwogICAgbWlzbWF0Y2ggPSAwOwogICAgc2NvcmUgPSAwOwogICAgc2VxID0gMDsKICAgIGxrZXkgPSBtYWluX2tleV90YWJbY3VycmVudF0ua2V5OwogICAgcGtleSA9IC0xOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMDApICYmIChrZXlzeW0gIT0gJyAnKSkKICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICVsZFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICAgICAgaWYgKGNrZXlbMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjoyIsIGZvciBleGFtcGxlKSAqLwoJLyogaG93ZXZlciwgdGhlIHNjb3JlIHdpbGwgYmUgaGlnaGVyIGZvciBsb25nZXIgbWF0Y2hlcyAqLwoJZm9yIChrZXkgPSAwOyBrZXkgPCBNQUlOX0xFTjsga2V5KyspIHsKCSAgZm9yIChvayA9IDAsIGkgPSAwOyAob2sgPj0gMCkgJiYgKGkgPCBzeW1zKTsgaSsrKSB7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldID09IGNrZXlbaV0pKQoJICAgICAgb2srKzsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gIT0gY2tleVtpXSkpCgkgICAgICBvayA9IC0xOwoJICB9CgkgIGlmIChvayA+IDApIHsKCSAgICBzY29yZSArPSBvazsKCSAgICBicmVhazsKCSAgfQoJfQoJLyogY291bnQgdGhlIG1hdGNoZXMgYW5kIG1pc21hdGNoZXMgKi8KCWlmIChvayA+IDApIHsKCSAgbWF0Y2grKzsKCSAgLyogYW5kIGhvdyBtdWNoIHRoZSBrZXljb2RlIG9yZGVyIG1hdGNoZXMgKi8KCSAgaWYgKGtleSA+IHBrZXkpIHNlcSsrOwoJICBwa2V5ID0ga2V5OwoJfSBlbHNlIHsKICAgICAgICAgIC8qIHByaW50IHNwYWNlcyBpbnN0ZWFkIG9mIFwwJ3MgKi8KICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2tleSk7IGkrKykgaWYgKCFja2V5W2ldKSBja2V5W2ldID0gJyAnOwogICAgICAgICAgVFJBQ0VfKGtleSkoIm1pc21hdGNoIGZvciBrZXlzeW0gMHglMDRsWCwga2V5Y29kZSAlZCwgZ290ICVjJWMlYyVjXG4iLAogICAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrZXljLCBja2V5WzBdLCBja2V5WzFdLCBja2V5WzJdLCBja2V5WzNdKTsKCSAgbWlzbWF0Y2grKzsKCSAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKQogICAgV0FSTigiVXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuL3ZpcnR1YWwgY29kZXMgbWFwcGluZy5cbiIsCiAgICAgICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSW5pdEtleWJvYXJkIChYMTFEUlYuQCkKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggQllURSAqa2V5X3N0YXRlX3RhYmxlICkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBLZXlTeW0gKmtzcDsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleSwgT0VNdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CgogICAgcEtleVN0YXRlVGFibGUgPSBrZXlfc3RhdGVfdGFibGU7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGtleXN5bXNfcGVyX2tleWNvZGUuCiAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCiAgICBYRnJlZShrc3ApOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgIH0KICAgIH0KICAgIFhGcmVlTW9kaWZpZXJtYXAobW1wKTsKCiAgICAvKiBEZXRlY3QgdGhlIGtleWJvYXJkIGxheW91dCAqLwogICAgWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCgpOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5rZXk7CiAgICBzeW1zID0gKGtleXN5bXNfcGVyX2tleWNvZGUgPiA0KSA/IDQgOiBrZXlzeW1zX3Blcl9rZXljb2RlOwoKICAgIC8qIE5vdyBidWlsZCB0d28gY29udmVyc2lvbiBhcnJheXMgOgogICAgICoga2V5Y29kZSAtPiB2a2V5ICsgc2NhbmNvZGUgKyBleHRlbmRlZAogICAgICogdmtleSArIGV4dGVuZGVkIC0+IGtleWNvZGUgKi8KCiAgICBlMi5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUyLnN0YXRlID0gMDsKCiAgICBPRU12a2V5ID0gVktfT0VNXzg7IC8qIG5leHQgaXMgYXZhaWxhYmxlLiAgKi8KICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgY2hhciBidWZbMzBdOwogICAgICAgIGludCBoYXZlX2NoYXJzOwoKICAgICAgICBrZXlzeW0gPSAwOwogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGhhdmVfY2hhcnMgPSBYTG9va3VwU3RyaW5nKCZlMiwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSBpZiAoaGF2ZV9jaGFycykgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIGkpOwoJCWlmICgoa2V5c3ltPDB4ODAwMCkgJiYgKGtleXN5bSE9JyAnKSkKICAgICAgICAgICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlbaV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2tleVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgfQoJCX0gZWxzZSB7CgkJICBja2V5W2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJCX0KCSAgICAgIH0KCSAgICAgIC8qIGZpbmQga2V5IHdpdGggbG9uZ2VzdCBtYXRjaCBzdHJlYWsgKi8KCSAgICAgIGZvciAoa2V5bj0wOyBrZXluPE1BSU5fTEVOOyBrZXluKyspIHsKCQlmb3IgKG9rPSgqbGtleSlba2V5bl1baT0wXTsgb2smJihpPDQpOyBpKyspCgkJICBpZiAoKCpsa2V5KVtrZXluXVtpXSAmJiAoKmxrZXkpW2tleW5dW2ldIT1ja2V5W2ldKSBvaz0wOwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiNpZiAwIC8qIHRoaXMgYnJlYWtzIFZLX09FTV94IFZLZXlzIGluIHNvbWUgbGF5b3V0IHRhYmxlcyBieSBpbnNlcnRpbmcKICAgICAgICogYSBWSyBjb2RlIGludG8gYSBub3QgYXBwcm9wcmlhdGUgcGxhY2UuCiAgICAgICAqLwogICAgICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCgkgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gVktfMCAmJiBrZXlzeW0gPD0gVktfOSkKICAgICAgICAgICAgICAgICAgICB8fCAoa2V5c3ltID49IFZLX0EgJiYga2V5c3ltIDw9IFZLX1opKSB7CgkJICAgIHZrZXkgPSBrZXlzeW07CgkJfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwoJCXN3aXRjaCAoa2V5c3ltKQoJCXsKCQljYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8xOyBicmVhazsKCQljYXNlICcvJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8yOyBicmVhazsKCQljYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKCQljYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV80OyBicmVhazsKCQljYXNlICdcXCc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV81OyBicmVhazsKCQljYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV82OyBicmVhazsKCQljYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLX09FTV83OyBicmVhazsKCQljYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9DT01NQTsgYnJlYWs7CgkJY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUEVSSU9EOyBicmVhazsKCQljYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9NSU5VUzsgYnJlYWs7CgkJY2FzZSAnKyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUExVUzsgYnJlYWs7CgkJfQoJICAgIH0KCiAgICAgICAgICAgIGlmICghdmtleSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogT3RoZXJzIGtleXM6IGxldCdzIGFzc2lnbiBPRU0gdmlydHVhbCBrZXkgY29kZXMgaW4gdGhlIGFsbG93ZWQgcmFuZ2UsCiAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIChbMHhiYSwweGMwXSwgWzB4ZGIsMHhlNF0sIDB4ZTYgKGdpdmVuIHVwKSBldCBbMHhlOSwweGY1XSkgKi8KICAgICAgICAgICAgICAgIHN3aXRjaCAoKytPRU12a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CgogICAgICAgICAgICAgICAgaWYgKFRSQUNFX09OKGtleWJvYXJkKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiT0VNIHNwZWNpZmljIHZpcnR1YWwga2V5ICVYIGFzc2lnbmVkIHRvIGtleWNvZGUgJVg6XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VNdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcgkqa3NuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCgkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSggIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIilcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgIH0KICAgICAgICBUUkFDRSgia2V5Y29kZSAlMDR4ID0+IHZrZXkgJTA0eFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICBrZXljMnNjYW5bZTIua2V5Y29kZV0gPSBzY2FuOwogICAgfSAvKiBmb3IgKi8KCiAgICAvKiBJZiBzb21lIGtleXMgc3RpbGwgbGFjayBzY2FuY29kZXMsIGFzc2lnbiBzb21lIGFyYml0cmFyeSBvbmVzIHRvIHRoZW0gbm93ICovCiAgICBmb3IgKHNjYW4gPSAweDYwLCBrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKGtleWMydmtleVtrZXljXSYmIWtleWMyc2NhbltrZXljXSkgewoJY2hhciAqa3NuYW1lOwoJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJOb1N5bWJvbCI7CgoJLyogc2hvdWxkIG1ha2Ugc3VyZSB0aGUgc2NhbmNvZGUgaXMgdW5hc3NpZ25lZCBoZXJlLCBidXQgPj0weDYwIGN1cnJlbnRseSBhbHdheXMgaXMgKi8KCglUUkFDRV8oa2V5KSgiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIC8qIE5vdyBzdG9yZSBvbmUga2V5Y29kZSBmb3IgZWFjaCBtb2RpZmllci4gVXNlZCB0byBzaW11bGF0ZSBrZXlwcmVzc2VzLiAqLwogICAga2NDb250cm9sID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19Db250cm9sX0wpOwogICAga2NBbHQgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0FsdF9MKTsKICAgIGlmICgha2NBbHQpIGtjQWx0ID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBYS19NZXRhX0wpOwogICAga2NTaGlmdCA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgWEtfU2hpZnRfTCk7CiAgICBrY051bUxvY2sgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX051bV9Mb2NrKTsKICAgIGtjQ2Fwc0xvY2sgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIFhLX0NhcHNfTG9jayk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlib2FyZExheW91dExpc3QgKFgxMURSVi5AKQogKi8KVUlOVCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXRMaXN0KElOVCBzaXplLCBIS0wgKmhrbCkKewogICAgSU5UIGk7CgogICAgVFJBQ0UoIiVkLCAlcFxuIiwgc2l6ZSwgaGtsKTsKCiAgICBpZiAoIXNpemUpCiAgICB7CiAgICAgICAgc2l6ZSA9IDQwOTY7IC8qIGhvcGUgd2Ugd2lsbCBuZXZlciBoYXZlIHRoYXQgbWFueSAqLwogICAgICAgIGhrbCA9IE5VTEw7CiAgICB9CgogICAgZm9yIChpID0gMDsgbWFpbl9rZXlfdGFiW2ldLmNvbW1lbnQgJiYgKGkgPCBzaXplKTsgaSsrKQogICAgewogICAgICAgIGlmIChoa2wpCiAgICAgICAgewogICAgICAgICAgICBEV09SRCBsYXlvdXQgPSBtYWluX2tleV90YWJbaV0ubGNpZDsKICAgICAgICAgICAgTEFOR0lEIGxhbmdpZDsKCiAgICAgICAgICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgICAgICAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgICAgICAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgICAgICAgICAgaGtsW2ldID0gKEhLTClsYXlvdXQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBpZiAoZHdUaHJlYWRpZCAmJiBkd1RocmVhZGlkICE9IEdldEN1cnJlbnRUaHJlYWRJZCgpKQogICAgICAgIEZJWE1FKCJjb3VsZG4ndCByZXR1cm4ga2V5Ym9hcmQgbGF5b3V0IGZvciB0aHJlYWQgJTA0bHhcbiIsIGR3VGhyZWFkaWQpOwoKI2lmIDAKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwojZWxzZQogICAgLyogRklYTUU6CiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKI2VuZGlmCiAgICAvKiAKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogRklYTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywnbCcsJ3gnLDB9OwogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgc3ByaW50ZlcobmFtZSwgZm9ybWF0VywgbGF5b3V0KTsKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cobmFtZSkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcCwgJTA0eDogc3R1YiFcbiIsIGhrbCwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggWE1hcHBpbmdFdmVudCAqZXZlbnQgKQp7CiAgICBIV05EIGh3bmQ7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZyhldmVudCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggcEtleVN0YXRlVGFibGUgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaSwgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIGlmICghV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VTklYQ1AsIDAsICZ3Q2hhciwgMSwgJmNDaGFyLCAxLCBOVUxMLCBOVUxMKSkKICAgIHsKICAgICAgICBXQVJOKCJubyB0cmFuc2xhdGlvbiBmcm9tIHVuaWNvZGUgdG8gQ1BfVU5JWENQIGZvciAweCUwMnhcbiIsIHdDaGFyKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgVFJBQ0UoIndDaGFyIDB4JTAyeCAtPiBjQ2hhciAnJWMnXG4iLCB3Q2hhciwgY0NoYXIpOwoKICAgIC8qIGNoYXItPmtleXN5bSAoc2FtZSBmb3IgQU5TSSBjaGFycykgKi8KICAgIGtleXN5bSA9ICh1bnNpZ25lZCBjaGFyKWNDaGFyOyAvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCiAgICBpZiAoa2V5c3ltIDw9IDI3KSBrZXlzeW0gKz0gMHhGRjAwOyAvKiBzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4gKi8KCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwogICAgaWYgKCFrZXljb2RlKQogICAgeyAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KICAgICAgICBUUkFDRSgicmV0cnlpbmcgd2l0aCB8IDB4RkUwMFxuIik7CiAgICAgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0UoIiclYycoJSNseCwgJWx1KTogZ290IGtleWNvZGUgJSMuMnggKCVkKVxuIiwKICAgICAgICAgICAgY0NoYXIsIGtleXN5bSwga2V5c3ltLCBrZXljb2RlLCBrZXljb2RlKTsKCiAgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KICAgIHJldCA9IGtleWMydmtleVtrZXljb2RlXTsKCiAgICBpZiAoIWtleWNvZGUgfHwgIXJldCkKICAgIHsKICAgICAgICBUUkFDRSgia2V5Y29kZSBmb3IgJyVjJyBub3QgZm91bmQsIHJldHVybmluZyAtMVxuIiwgY0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpbmRleCA9IC0xOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCiAgICB7CiAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaSkgPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIGNhc2UgMDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiByZXQgKz0gMHgwMTAwOyBicmVhazsKICAgICAgICBjYXNlIDI6IHJldCArPSAweDA2MDA7IGJyZWFrOwogICAgICAgIGNhc2UgMzogcmV0ICs9IDB4MDcwMDsgYnJlYWs7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CgojZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBUUkFDRSgicmV0dXJuaW5nIDB4JXguXG4iLHZhbHVlKTsgcmV0dXJuIHZhbHVlOyB9CgogICAgVFJBQ0UoIndDb2RlPTB4JXgsIHdNYXBUeXBlPSVkLCBoa2wgJXBcbiIsIHdDb2RlLCB3TWFwVHlwZSwgaGtsKTsKICAgIGlmIChoa2wgIT0gWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCglzd2l0Y2god01hcFR5cGUpIHsKCQljYXNlIDA6CXsgLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJCQlyZXR1cm5NVksgKGtleWMyc2NhbltrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7IH0KCgkJY2FzZSAxOiB7IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KCQkJLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KCQkJaW50IGtleWM7CgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKCQkJCWlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCgkJCQkJcmV0dXJuTVZLIChrZXljMnZrZXlba2V5Y10gJiAweEZGKTsKCQkJVFJBQ0UoInJldHVybmluZyBubyB2a2V5LWNvZGUuXG4iKTsKCQkgICAgICAgIHJldHVybiAwOyB9CgoJCWNhc2UgMjogeyAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgInVuc2hpZnRlZCIgbWVhbnMuIGluIHdpbmRvd3MgVktfVyAoMHg1NykKICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJucyAweDU3LCB3aGljaCBpcyB1cGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljOwoJCQljaGFyIHNbMl07CgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgoJCQllLnN0YXRlID0gTG9ja01hc2s7CgkJCS8qIExvY2tNYXNrIHNob3VsZCBiZWhhdmUgZXhhY3RseSBsaWtlIGNhcHMgbG9jayAtIHVwZXJjYXNlCgkJCSAqIHRoZSBsZXR0ZXIga2V5cyBhbmQgdGhhdHMgYWJvdXQgaXQuICovCgogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCgkJCWUua2V5Y29kZSA9IDA7CgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoMCwmZSkgJiAweEZGKSAhPSB3Q29kZSkgewoJCQkJICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKCQkJCQkgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoKHdDb2RlPj1WS19OVU1QQUQwKSAmJiAod0NvZGU8PVZLX05VTVBBRDkpKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKCQkJaWYgKHdDb2RlPT1WS19ERUNJTUFMKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISEgXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKCQkJaWYgKFhMb29rdXBTdHJpbmcoJmUsIHMsIDIsICZrZXlzeW0sIE5VTEwpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTVZLICgqcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gQU5TSS5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQlyZXR1cm4gMDsKCQkJfQoKCQljYXNlIDM6ICAgLyogKipOVCBvbmx5Kiogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSBidXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAgKi8KICAgICAgICAgICAgICAJCSAgLyogICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgICovCgkJICAgICAgICAgIEZJWE1FKCIgc3R1YiBmb3IgTlRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwoKCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlXQVJOKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIC8qIEZJWE1FOiBzaG91bGQgdXNlIE1WSyB0eXBlIDMgKE5UIHZlcnNpb24gdGhhdCBkaXN0aW5ndWlzaGVzIHJpZ2h0IGFuZCBsZWZ0ICovCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoc2NhbkNvZGUsIDEsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgodmtleSwgMiwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKICBUUkFDRSgic2NhbiAweCUwNHgsIHZrZXkgMHglMDR4LCBBTlNJIDB4JTA0eFxuIiwgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmICgoblNpemUgPj0gMikgJiYgbHBCdWZmZXIpCgl7CiAgICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyVygoV0NIQVIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIGZvciAoa2V5aT1taW5fa2V5Y29kZTsga2V5aTw9bWF4X2tleWNvZGU7IGtleWkrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5aV0pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5aSA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICBrZXljID0gKEtleUNvZGUpIGtleWk7CiAgICAgIGtleXMgPSBYS2V5Y29kZVRvS2V5c3ltKHRocmVhZF9kaXNwbGF5KCksIGtleWMsIDApOwogICAgICBuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXMpOwogICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JTA0eCBrZXlzeW09JTA0eCBzdHJpbmc9JXNcbiIsCiAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCAoaW50KWtleXMsIG5hbWUpOwogICAgICBpZiAobHBCdWZmZXIgJiYgblNpemUgJiYgbmFtZSkKICAgICAgewogICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIG5hbWUsIC0xLCBscEJ1ZmZlciwgblNpemUpOwogICAgICAgICAgbHBCdWZmZXJbblNpemUgLSAxXSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgfQogIH0KCiAgLyogRmluYWxseSBpc3N1ZSBGSVhNRSBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgRklYTUUoIiglMDhseCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDR4LCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgaWYgKGxwQnVmZmVyICYmIG5TaXplKQogICAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlRXggKFgxMURSVi5AKQogKgogKiBUaGUgVG9Vbmljb2RlIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsLWtleSBjb2RlIGFuZCBrZXlib2FyZAogKiBzdGF0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBXaW5kb3dzIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzLgogKgogKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBhIGRlYWQga2V5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiBPdGhlcndpc2UsCiAqIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogVmFsdWUJTWVhbmluZwogKiAwCVRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgaGFzIG5vIHRyYW5zbGF0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQuCiAqIDEJT25lIFdpbmRvd3MgY2hhcmFjdGVyIHdhcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KICogMglUd28gY2hhcmFjdGVycyB3ZXJlIGNvcGllZCB0byB0aGUgYnVmZmVyLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEKICogICAgICBkZWFkLWtleSBjaGFyYWN0ZXIgKGFjY2VudCBvciBkaWFjcml0aWMpIHN0b3JlZCBpbiB0aGUga2V5Ym9hcmQgbGF5b3V0IGNhbm5vdAogKiAgICAgIGJlIGNvbXBvc2VkIHdpdGggdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSB0byBmb3JtIGEgc2luZ2xlIGNoYXJhY3Rlci4KICoKICogRklYTUUgOiBzaG91bGQgZG8gdGhlIGFib3ZlIChyZXR1cm4gMiBmb3Igbm9uIG1hdGNoaW5nIGRlYWRjaGFyK2NoYXIgY29tYmluYXRpb25zKQogKgogKi8KSU5UIFgxMURSVl9Ub1VuaWNvZGVFeChVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIExQQllURSBscEtleVN0YXRlLAoJCSAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgWEtleUV2ZW50IGU7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKICAgIGNoYXIgbHBDaGFyWzEwXTsKICAgIEhXTkQgZm9jdXM7CiAgICBYSUMgeGljOwoKICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGhrbCAhPSBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIGlmICgobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApICYmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICB7CiAgICAgICAgVFJBQ0UoIkN0cmwrQWx0K1trZXldIHdvbid0IGdlbmVyYXRlIGEgY2hhcmFjdGVyXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgZm9jdXMgPSBHZXRGb2N1cygpOwogICAgaWYgKGZvY3VzKSBmb2N1cyA9IEdldEFuY2VzdG9yKCBmb2N1cywgR0FfUk9PVCApOwogICAgaWYgKCFmb2N1cykgZm9jdXMgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIGUud2luZG93ID0gWDExRFJWX2dldF93aG9sZV93aW5kb3coIGZvY3VzICk7CiAgICB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBmb2N1cyApOwoKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAgICB7CglUUkFDRSgiU2hpZnRNYXNrID0gJTA0eFxuIiwgU2hpZnRNYXNrKTsKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQogICAgewoJVFJBQ0UoIkxvY2tNYXNrID0gJTA0eFxuIiwgTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJDb250cm9sTWFzayA9ICUwNHhcbiIsIENvbnRyb2xNYXNrKTsKCWUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTnVtTG9ja01hc2sgPSAlMDR4XG4iLCBOdW1Mb2NrTWFzayk7CgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgfQoKICAgIC8qIFJlc3RvcmUgc2F2ZWQgQWx0R3Igc3RhdGUgKi8KICAgIFRSQUNFKCJBbHRHck1hc2sgPSAlMDR4XG4iLCBBbHRHck1hc2spOwogICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gMHglMDR4XG4iLAoJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKICAgICAgeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KICAgICAgICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHZpcnRLZXkpCiAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLCZlKSAmIDB4RkYpICE9IHZpcnRLZXkpIHsKICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgIH0KCSAgfQogICAgICB9CgogICAgaWYgKCh2aXJ0S2V5Pj1WS19OVU1QQUQwKSAmJiAodmlydEtleTw9VktfTlVNUEFEOSkpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKCiAgICBpZiAodmlydEtleT09VktfREVDSU1BTCkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIix2aXJ0S2V5KTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJcmV0dXJuIHZpcnRLZXk7IC8qIHdoYXRldmVyICovCiAgICAgIH0KICAgIGVsc2UgVFJBQ0UoIkZvdW5kIGtleWNvZGUgJWQgKDB4JTJYKVxuIixlLmtleWNvZGUsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIGlmICh4aWMpCiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sIE5VTEwpOwogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBpZiAocmV0ID09IDApCiAgICB7CglCWVRFIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDA5OwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQoJICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgJmRlYWRfY2hhciwgMSwgYnVmVywgYnVmV19zaXplKTsKCSAgICByZXQgPSAtMTsKCSAgICB9CgllbHNlCgkgICAgewoJICAgIGNoYXIJKmtzbmFtZTsKCiAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoJICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlFUlIoIlBsZWFzZSByZXBvcnQ6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUpOwoJCUVSUigiKHZpcnRLZXk9JVgsc2NhbkNvZGU9JVgsa2V5Y29kZT0lWCxzdGF0ZT0lWClcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBtb3JlIGFyZWFzIHdoZXJlIFggcmV0dXJucyBjaGFyYWN0ZXJzIGJ1dCBXaW5kb3dzIGRvZXMgbm90CiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sICovCiAgICAgICAgaWYgKGUuc3RhdGUgJiBDb250cm9sTWFzaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGtleXN5bT49MzMpICYmIChrZXlzeW0gPCAnQScpKSB8fAogICAgICAgICAgICAgICAgKChrZXlzeW0gPiAnWicpICYmIChrZXlzeW0gPCAnYScpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCgkvKiBwZXJmb3JtIHRyYW5zbGF0aW9uIHRvIHVuaWNvZGUgKi8KCWlmKHJldCkKCXsKCSAgICBUUkFDRV8oa2V5KSgiVHJhbnNsYXRpbmcgY2hhciAweCUwMnggdG8gdW5pY29kZVxuIiwgKihCWVRFICopbHBDaGFyKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9Cgpmb3VuZDoKICAgIFRSQUNFXyhrZXkpKCJUb1VuaWNvZGUgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleCAlc1xuIiwKCQlyZXQsIChyZXQgJiYgYnVmVykgPyBidWZXWzBdIDogMCwgYnVmVyA/ICIiIDogIihubyBidWZmZXIpIik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhCZWxsKHRocmVhZF9kaXNwbGF5KCksIDApOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQo=