LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1gxMV9YS0JMSUJfSAojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7CgovKiBrZXkgc3RhdGUgdGFibGUgYml0czoKICAweDgwIC0+IGtleSBpcyBwcmVzc2VkCiAgMHg0MCAtPiBrZXkgZ290IHByZXNzZWQgc2luY2UgbGFzdCB0aW1lCiAgMHgwMSAtPiBrZXkgaXMgdG9nZ2xlZAoqLwpCWVRFIGtleV9zdGF0ZV90YWJsZVsyNTZdOwoKc3RhdGljIEJZVEUgVHJhY2tTeXNLZXkgPSAwOyAvKiBkZXRlcm1pbmUgd2hldGhlciBBTFQga2V5IHVwIHdpbGwgY2F1c2UgYSBXTV9TWVNLRVlVUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgV01fS0VZVVAgbWVzc2FnZSAqLwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIFNjcm9sbExvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpfMTA1W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgVktfT0VNXzEwMiwnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV84LFZLX09FTV81LAogICBWS19PRU1fNywnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hemVydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fNywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNX1BMVVMsCiAgICdBJywnWicsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNixWS19PRU1fMSwKICAgJ1EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsJ00nLFZLX09FTV8zLFZLX09FTV81LAogICAnVycsJ1gnLCdDJywnVicsJ0InLCdOJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fOCwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfZHZvcmFrW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV82LAogICBWS19PRU1fNyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCwnUCcsJ1knLCdGJywnRycsJ0MnLCdSJywnTCcsVktfT0VNXzIsVktfT0VNX1BMVVMsCiAgICdBJywnTycsJ0UnLCdVJywnSScsJ0QnLCdIJywnVCcsJ04nLCdTJyxWS19PRU1fTUlOVVMsVktfT0VNXzUsCiAgIFZLX09FTV8xLCdRJywnSicsJ0snLCdYJywnQicsJ00nLCdXJywnVicsJ1onLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKLyoqKiBERUZJTkUgWU9VUiBORVcgTEFOR1VBR0UtU1BFQ0lGSUMgTUFQUElOR1MgQkVMT1csIFNFRSBFWElTVElORyBUQUJMRVMgKi8KCi8qIHRoZSBWSyBtYXBwaW5ncyBmb3IgdGhlIG1haW4ga2V5Ym9hcmQgd2lsbCBiZSBhdXRvLWFzc2lnbmVkIGFzIGJlZm9yZSwKICAgc28gd2hhdCB3ZSBoYXZlIGhlcmUgaXMganVzdCB0aGUgY2hhcmFjdGVyIHRhYmxlcyAqLwovKiBvcmRlcjogTm9ybWFsLCBTaGlmdCwgQWx0R3IsIFNoaWZ0LUFsdEdyICovCi8qIFdlIHJlY29tbWVuZCB5b3Ugd3JpdGUganVzdCB3aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCAoaS5lLiB3aGF0J3MKICAgd3JpdHRlbiBvbiB0aGUga2V5Y2FwcyksIG5vdCB0aGUgYnVuY2ggb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIGJlaGluZCBBbHRHcgogICBhbmQgU2hpZnQtQWx0R3IgaWYgaXQgY2FuIHZhcnkgYW1vbmcgZGlmZmVyZW50IFggc2VydmVycyAqLwovKiBSZW1lbWJlciB0aGF0IHlvdXIgMTAybmQga2V5ICh0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgc2hvdWxkIGJlIG9uIGEKICAgc2VwYXJhdGUgbGluZSwgc2VlIGV4aXN0aW5nIHRhYmxlcyAqLwovKiBJZiBXaW5lIGZhaWxzIHRvIG1hdGNoIHlvdXIgbmV3IHRhYmxlLCB1c2UgV0lORURFQlVHPStrZXkgdG8gZmluZCBvdXQgd2h5ICovCi8qIFJlbWVtYmVyIHRvIGFsc28gYWRkIHlvdXIgbmV3IHRhYmxlIHRvIHRoZSBsYXlvdXQgaW5kZXggdGFibGUgZmFyIGJlbG93ISAqLwoKLyoqKiBHZXJtYW4gTG9naXRlY2ggRGVza3RvcCBQcm8ga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RFX2xvZ2l0ZWNoW01BSU5fTEVOXVs0XSA9CnsKICJeXHhiMCIsIjEhIiwiMlwiIiwiM1x4YTciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCJceGRmP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIlx4ZmNceGRjIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGY2XHhkNiIsIlx4ZTRceGM0IiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMiIsIlwiMyIsIic0IiwiKDUiLCItNiIsIug3IiwiXzgiLCLnOSIsIuAwIiwiKbAiLCI9KyIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjIiwKICJxUSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi3z8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwitCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqfiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgMTA1IEtleXMgKGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEZlY2huZXIpKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkXzEwNVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIrIiLCIzp7MiLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiJ2AiLAogInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogIjw+fCIsInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSciLCIyXCIiLCIzKyIsIjQhIiwiNSUiLCI2LyIsIjc9IiwiOCgiLCI5KSIsIvbWIiwi/NwiLCLz0yIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL11SIsIvraIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLpySIsIuHBIiwi+9siLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICLtzSIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogIqm5IiwiqroiLCLF5SIsItLyIiwi1PQiLCLa+iIsItX1IiwiyekiLCLP7yIsItDwIiwi2/siLCJbXSIsCiAiweEiLCLT8yIsIsTkIiwixuYiLCLH5yIsIsjoIiwiqLgiLCLL6yIsIszsIiwi3v4iLCKruyIsIi1fIiwKICKhsSIsIq+/Iiwiw+MiLCLX9yIsIsLiIiwizu4iLCLN7SIsIiw7IiwiLjoiLCLW9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAyXCIiLCIzIyIsIjQkIiwiNSUiLCI2XjYmIiwiNyY3LyIsIjgqOCgiLCI5KDkpIiwiMCkwPSIsIi1fJz8iLCI9KysqIiwKICJxUam5Iiwid1equiIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2voiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl19W10iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKqLgiLCJrS8vrIiwibEzM7CIsIjs63v4iLCInXCKruyIsIlxcfC1fIiwKICJ6WqGxIiwieFivvyIsImNDw+MiLCJ2Vtf3IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwsOyIsIi4+LjoiLCIvP9b2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHIpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNqgiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCJ+XiIsIl19IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/IiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgd2l0aCA8QUxUIEdSPiAoY29udHJpYnV0ZWQgYnkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icl9hbHRfZ3JbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhOSIsIjJAMiIsIjMjMyIsIjQkIyIsIjUlXCIiLCI2KCwiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsnIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIjRgIiwiW3sqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJnRyIsIn5eIiwiXX06IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/MCIKfTsKCi8qKiogVVMgaW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEd1c3Rhdm8gTm9yb25oYSAoa292QGRlYmlhbi5vcmcpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19pbnRsW01BSU5fTEVOXVs0XSA9CnsKICAiYH4iLCAiMSEiLCAiMkAiLCAiMyMiLCAiNCQiLCAiNSUiLCAiNl4iLCAiNyYiLCAiOCoiLCAiOSgiLCAiMCkiLCAiLV8iLCAiPSsiLCAiXFx8IiwKICAicVEiLCAid1ciLCAiZUUiLCAiclIiLCAidFQiLCAieVkiLCAidVUiLCAiaUkiLCAib08iLCAicFAiLCAiW3siLCAiXX0iLAogICJhQSIsICJzUyIsICJkRCIsICJmRiIsICJnRyIsICJoSCIsICJqSiIsICJrSyIsICJsTCIsICI7OiIsICInXCIiLAogICJ6WiIsICJ4WCIsICJjQyIsICJ2ViIsICJiQiIsICJuTiIsICJtTSIsICIsPCIsICIuPiIsICIvPyIKfTsKCi8qKiogU2xvdmFrIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKHNrX3F3ZXJ0eSkgaW4geGtic2VsKQogIC0gZGVhZF9hYm92ZXJpbmcgcmVwbGFjZWQgd2l0aCBkZWdyZWUgLSBubyBzeW1ib2wgaW4gaXNvODg1OS0yCiAgLSBicm9rZW5iYXIgcmVwbGFjZWQgd2l0aCBiYXIJCQkJCSovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLW01BSU5fTEVOXVs0XSA9CnsKICI7MCIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCIndiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIuQoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL0XCIiLCKnISIsIvIpIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWltNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6X3F3ZXJ0eSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pfcXdlcnR5W01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogU2xvdmFrIGFuZCBDemVjaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2R1YWwoY3Nfc2tfdWN3KSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tfcHJvZ1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR5MQiLCJ3V+zMIiwiZUXpySIsInJS+NgiLCJ0VLurIiwieVn93SIsInVV+dkiLCJpSe3NIiwib0/z0yIsInBQ9tYiLCJbeyIsIl19IiwKICJhQeHBIiwic1O5qSIsImRE788iLCJmRuvLIiwiZ0fgwCIsImhI+toiLCJqSvzcIiwia0v01CIsImxMtaUiLCI7OiIsIidcIiIsIlxcfCIsCiAielq+riIsInhYpCIsImND6MgiLCJ2VufHIiwiYkIiLCJuTvLSIiwibU3lxSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKGNzX3F3ZXJ0eSkgaW4geGtic2VsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DU1tNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwvSkiLCI9JSIsIiIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6L1t7IiwiKShdfSIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi+VwiJCIsIqch3yIsIqgnIiwKICJ6Wj4iLCJ4WCMiLCJjQyYiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTSIsIiw/PCIsIi46PiIsIi1fKiIsCiAiPD5cXHwiCn07CgovKioqIExhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR2FicmllbCBPcmxhbmRvIEdhcmNpYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTEFbTUFJTl9MRU5dWzRdID0KewogInywIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCK/oSIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitKgiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBMaXRodWFuaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGx0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MVF9CW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIuDAIiwi6MgiLCLmxiIsIuvLIiwi4cEiLCLw0CIsIvjYIiwi+9siLCKlKCIsIrQpIiwiLV8iLCL+3iIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIqqsIgp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIExheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9US1tNQUlOX0xFTl1bNF0gPQp7CiJcIukiLCIxISIsIjInIiwiM14jIiwiNCskIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIio/XFwiLCItXyIsCiJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCL9Se4iLCJvTyIsInBQIiwi8NAiLCL83H4iLAoiYUHmIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL+3iIsImndIiwiLDtgIiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46Igp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUltNQUlOX0xFTl1bNF0gPQp7CiJcIlxcIiwiMSEiLCIyJyIsIjNeIiwiNCsiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIqPyIsIi1fIiwKInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiXHhiOUkiLCJvTyIsInBQIiwiXHhiYlx4YWIiLCL83CIsCiJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGJhXHhhYSIsImlcMCIsIiw7IiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46IiwKIjw+Igp9OwoKLyoqKiBUdXJraXNoIEYga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHJmKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUl9GW01BSU5fTEVOXVs0XSA9CnsKIisqIiwiMSEiLCIyXCIiLCIzXiMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwPSIsIi8/IiwiLV8iLAoiZkYiLCJnRyIsIlx4YmJceGFiIiwiXHhiOUkiLCJvTyIsImREIiwiclIiLCJuTiIsImhIIiwicFAiLCJxUSIsIndXIiwKInVVIiwiaVwwIiwiZUUiLCJhQSIsIvzcIiwidFQiLCJrSyIsIm1NIiwibEwiLCJ5WSIsIlx4YmFceGFhIiwieFgiLAoiakoiLCL21iIsInZWIiwiY0MiLCLnxyIsInpaIiwic1MiLCJiQiIsIi46IiwiLDsiLAoiPD4iCn07CgovKioqIElzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxbTUFJTl9MRU5dWzRdID0KewogImB+OyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEvIiwid1cnIiwiZUX3IiwiclL4IiwidFTgIiwieVnoIiwidVXlIiwiaUnvIiwib0/tIiwicFD0IiwiW3siLCJdfSIsCiAiYUH5Iiwic1PjIiwiZETiIiwiZkbrIiwiZ0fyIiwiaEjpIiwiakrnIiwia0vsIiwibEzqIiwiOzrzIiwiXCdcIiwiLCJcXHwiLAogInpa5iIsInhY8SIsImND4SIsInZW5CIsImJC8CIsIm5O7iIsIm1N9iIsIiw8+iIsIi4+9SIsIi8/LiIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbF9waG9uZXRpYykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V+UiLCJlReAiLCJyUvgiLCJ0VPoiLCJ5WfIiLCJ1VeUiLCJpSekiLCJvT/EiLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU/kiLCJkROMiLCJmRvQiLCJnR+IiLCJoSOQiLCJqSukiLCJrS+siLCJsTOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlblIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgLXN5bWJvbHMgInVzKHBjMTA1KStpbF9zYWhhcm9uIikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfc2FoYXJvbltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX8SIsImVFIiwiclL4IiwidFToIiwieVnjIiwidVUiLCJpSSIsIm9PIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1PlIiwiZETsIiwiZkb6IiwiZ0fiIiwiaEjkIiwiakr5Iiwia0vrIiwibEzpIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW8iIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEdyZWVrIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgS3JpdG9uIEt5cmltaXMgPGt5cmltaXNAY3RpLmdyPikKICBHcmVlayBjaGFyYWN0ZXJzIGZvciAid1ciIGFuZCAic1MiIGFyZSBvbWl0dGVkIHRvIG5vdCBwcm9kdWNlIGEgbWlzbWF0Y2gKICBtZXNzYWdlIHNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVycyBpbiBnciBhbmQgZWwgWEZyZWU4NiBsYXlvdXRzLiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFROzoiLCJ3VyIsImVF5cUiLCJyUvHRIiwidFT01CIsInlZ9dUiLCJ1VejIIiwiaUnpySIsIm9P788iLCJwUPDQIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTIiwiZETkxCIsImZG9tYiLCJnR+PDIiwiaEjnxyIsImpK7s4iLCJrS+rKIiwibEzryyIsIjs6tKgiLCInXCIiLCJcXHwiLAogInpa5sYiLCJ4WPfXIiwiY0P42CIsInZW+dkiLCJiQuLCIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBUaGFpIChLZWRtYW5lZSkga2V5Ym9hcmQgbGF5b3V0IGJ5IFN1cHBoYWNob2tlIFN1bnRpd2ljaGF5YSA8bXJjaG9rZUBvcGVudGxlLm9yZz4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdGhbTUFJTl9MRU5dWzRdID0KewogImB+XyUiLCIxIeUrIiwiMkAv8SIsIjMjLfIiLCI0JMDzIiwiNSW29CIsIjZe2NkiLCI3JtbfIiwiOCqk9SIsIjkotfYiLCIwKaj3IiwiLV+i+CIsIj0rqvkiLAogInFR5vAiLCJ3V+RcIiIsImVF064iLCJyUr6xIiwidFTQuCIsInlZ0e0iLCJ1VdXqIiwiaUnDsyIsIm9Puc8iLCJwUMKtIiwiW3u6sCIsIl19xSwiLAogImFBv8QiLCJzU8umIiwiZEShryIsImZGtOIiLCJnR+CsIiwiaEjp5yIsImpK6OsiLCJrS9LJIiwibEzKyCIsIjs6x6siLCJcJ1wipy4iLCJcXHyjpSIsCiAielq8KCIsInhYuykiLCJjQ+GpIiwidlbNziIsImJC2iIsIm5O1+wiLCJtTbc/IiwiLDzBsiIsIi4+48wiLCIvP73GIgp9OyAKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fNCxWS19PRU1fNixWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fMyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fNSwKICAgJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLCdIJywnSScsJ0onLCdLJywnTCcsJ00nLCdOJywnTycsJ1AnLCdRJywnUicsJ1MnLCdUJywnVScsJ1YnLCdXJywnWCcsJ1knLCdaJywKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbmwpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTkxbTUFJTl9MRU5dWzRdID0KewogIkCnIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjdfIiwiOCgiLCI5KSIsIjAnIiwiLz8iLCKwfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCKofiIsIip8IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIrsSIsIidgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi09IiwKICJbXSIKfTsKCgoKLyoqKiBMYXlvdXQgdGFibGUuIEFkZCB5b3VyIGtleWJvYXJkIG1hcHBpbmdzIHRvIHRoaXMgbGlzdCAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIExDSUQgbGNpZDsgLyogaW5wdXQgbG9jYWxlIGlkZW50aWZpZXIsIGxvb2sgZm9yIExPQ0FMRV9JTEFOR1VBR0UKICAgICAgICAgICAgICAgICBpbiB0aGUgYXBwcm9wcmlhdGUgZGxscy9rZXJuZWwvbmxzLy5ubHMgZmlsZSAqLwogICAgY29uc3QgY2hhciAqY29tbWVudDsKICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9VU19waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKGR2b3JhaykiLCAmbWFpbl9rZXlfVVNfZHZvcmFrLCAmbWFpbl9rZXlfc2Nhbl9kdm9yYWssICZtYWluX2tleV92a2V5X2R2b3Jha30sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODA5LCAiQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA3LCAiR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9ERV9ub2RlYWQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IGZvciBsb2dpdGVjaCBkZXNrdG9wIHBybyIsICZtYWluX2tleV9ERV9sb2dpdGVjaCwgICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIDEwNSIsICZtYWluX2tleV9ERV9ub2RlYWRfMTA1LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0el8xMDV9LAogezB4MDgwNywgIlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDEwMGMsICJTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFkLCAiU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0UsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyfSwKIHsweDA0MjUsICJFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTQsICJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05PLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA2LCAiRGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYywgIkZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRlIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoQ0FfZnIpIiwgJm1haW5fa2V5X0NBX2ZyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODBjLCAiQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDA4MTYsICJQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BUX2JyLCAmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IEFMVCBHUiIsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MGIsICJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX2JkcywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjMsICJCZWxhcnVzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CWSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1JVX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEiLCAmbWFpbl9rZXlfUlVfY3AxMjUxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlVfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9VQV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1JVX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEwLCAiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGYsICJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBlLCAiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxNSwgIlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjQsICJTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgc3IiLCAmbWFpbl9rZXlfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHVzLHNyIiwgJm1haW5fa2V5X1VTX1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNwZWNpZmljKSIsICZtYWluX2tleV9IUl9qZWxseSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMSwgIkphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfanAxMDYsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNiwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2fSwKIHsweDA0MTEsICJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgJm1haW5fa2V5X0NaLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6X3F3ZXJ0eSIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjcsICJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0ciIsICZtYWluX2tleV9UUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyZiIsICZtYWluX2tleV9UUl9GLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfc2FoYXJvbiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlZOQyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdm5jLCAmbWFpbl9rZXlfc2Nhbl92bmMsICZtYWluX2tleV92a2V5X3ZuY30sCiB7MHgwNDA4LCAiR3JlZWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFlLCAiVGhhaSAoS2VkbWFuZWUpICBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdGgsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTMsICJEdXRjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTkwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKCiB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfdmtleVsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMCwgVktfSEFOR1VMLCAwLCAwLCBWS19IQU5KQSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTAgKi8KICAgIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwwLDAsIFZLX0FQUFMsIC8qIEZGNjAgKi8KICAgIDAsIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICBWS19FTkQsIFZLX0NMRUFSLCBWS19JTlNFUlQsIFZLX0RFTEVURSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwKICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDQsIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5LCAwLCAwLCAwLCBWS19PRU1fTkVDX0VRVUFMLCAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICBWS19GMSwgVktfRjIsCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2LCAwLCAwLCAgICAgICAvKiBGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAwLCBWS19MU0hJRlQsIFZLX1JTSElGVCwgVktfTENPTlRST0wsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkUwICovCiAgICBWS19SQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgVktfTUVOVSwKICAgIFZLX01FTlUsIFZLX0xNRU5VLCBWS19STUVOVSwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEzOCwgMHgxNDUsICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MTM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgovKiBSZXR1cm5zIHRoZSBXaW5kb3dzIHZpcnR1YWwga2V5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBYIGV2ZW50IDxlPiAqLwovKiB4MTEgbG9jayBtdXN0IGJlIGhlbGQgKi8Kc3RhdGljIFdPUkQgRVZFTlRfZXZlbnRfdG9fdmtleSggWElDIHhpYywgWEtleUV2ZW50ICplKQp7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFN0YXR1cyBzdGF0dXM7CiAgICBjaGFyIGJ1ZlsyNF07CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZS0+dHlwZSA9PSBLZXlQcmVzcykKICAgICAgICBYbWJMb29rdXBTdHJpbmcoeGljLCBlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICBYTG9va3VwU3RyaW5nKGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwoKICAgIGlmICgoZS0+c3RhdGUgJiBOdW1Mb2NrTWFzaykgJiYKICAgICAgICAoa2V5c3ltID09IFhLX0tQX1NlcGFyYXRvciB8fCBrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCB8fAogICAgICAgICAoa2V5c3ltID49IFhLX0tQXzAgJiYga2V5c3ltIDw9IFhLX0tQXzkpKSkKICAgICAgICAvKiBPbmx5IHRoZSBLZXlwYWQga2V5cyAwLTkgYW5kIC4gc2VuZCBkaWZmZXJlbnQga2V5c3ltcwogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgTnVtTG9jayBzdGF0ZSAqLwogICAgICAgIHJldHVybiBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4RkZdOwoKICAgIFRSQUNFXyhrZXkpKCJlLT5rZXljb2RlID0gJXhcbiIsIGUtPmtleWNvZGUpOwoKICAgIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0CiAqLwp2b2lkIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBXT1JEIHdWaywgV09SRCB3U2NhbiwgRFdPUkQgZXZlbnRfZmxhZ3MsIERXT1JEIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RXh0cmFJbmZvLCBVSU5UIGluamVjdGVkX2ZsYWdzICkKewogICAgVUlOVCBtZXNzYWdlOwogICAgS0JETExIT09LU1RSVUNUIGhvb2s7CiAgICBXT1JEIGZsYWdzLCB3VmtTdHJpcHBlZCwgd1ZrTCwgd1ZrUiwgdmtfaG9vayA9IHdWazsKCiAgICB3VmsgPSBMT0JZVEUod1ZrKTsKICAgIGZsYWdzID0gTE9CWVRFKHdTY2FuKTsKCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpIGZsYWdzIHw9IEtGX0VYVEVOREVEOwogICAgLyogRklYTUU6IHNldCBLRl9ETEdNT0RFIGFuZCBLRl9NRU5VTU9ERSB3aGVuIG5lZWRlZCAqLwoKICAgIC8qIHN0cmlwIGxlZnQvcmlnaHQgZm9yIG1lbnUsIGNvbnRyb2wsIHNoaWZ0ICovCiAgICBzd2l0Y2ggKHdWaykKICAgIHsKICAgIGNhc2UgVktfTUVOVToKICAgIGNhc2UgVktfTE1FTlU6CiAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgIHdWayA9IChldmVudF9mbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgPyBWS19STUVOVSA6IFZLX0xNRU5VOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfTUVOVTsKICAgICAgICB3VmtMID0gVktfTE1FTlU7CiAgICAgICAgd1ZrUiA9IFZLX1JNRU5VOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DT05UUk9MOgogICAgY2FzZSBWS19MQ09OVFJPTDoKICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgd1ZrID0gKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSA/IFZLX1JDT05UUk9MIDogVktfTENPTlRST0w7CiAgICAgICAgd1ZrU3RyaXBwZWQgPSBWS19DT05UUk9MOwogICAgICAgIHdWa0wgPSBWS19MQ09OVFJPTDsKICAgICAgICB3VmtSID0gVktfUkNPTlRST0w7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX1NISUZUOgogICAgY2FzZSBWS19MU0hJRlQ6CiAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICB3VmsgPSAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpID8gVktfUlNISUZUIDogVktfTFNISUZUOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfU0hJRlQ7CiAgICAgICAgd1ZrTCA9IFZLX0xTSElGVDsKICAgICAgICB3VmtSID0gVktfUlNISUZUOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICB3VmtTdHJpcHBlZCA9IHdWa0wgPSB3VmtSID0gd1ZrOwogICAgfQoKICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9LRVlVUCkKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZVVA7CiAgICAgICAgaWYgKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSAmJgogICAgICAgICAgICAoKHdWa1N0cmlwcGVkID09IFZLX01FTlUpIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKQogICAgICAgICAgICAgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgewogICAgICAgICAgICBpZiggVHJhY2tTeXNLZXkgPT0gVktfTUVOVSB8fCAvKiA8QUxUPi1kb3duLzxBTFQ+LXVwIHNlcXVlbmNlICovCiAgICAgICAgICAgICAgICAod1ZrU3RyaXBwZWQgIT0gVktfTUVOVSkpIC8qIDxBTFQ+LWRvd24uLi48c29tZXRoaW5nIGVsc2U+LXVwICovCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZVVA7CiAgICAgICAgICAgIFRyYWNrU3lzS2V5ID0gMDsKICAgICAgICB9CiAgICAgICAgZmxhZ3MgfD0gS0ZfUkVQRUFUIHwgS0ZfVVA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbWVzc2FnZSA9IFdNX0tFWURPV047CiAgICAgICAgaWYgKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwIHx8IHdWa1N0cmlwcGVkID09IFZLX01FTlUpICYmCiAgICAgICAgICAgICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCB8fCB3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKSkKICAgICAgICB7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBXTV9TWVNLRVlET1dOOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IHdWa1N0cmlwcGVkOwogICAgICAgIH0KICAgICAgICBpZiAoa2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSBmbGFncyB8PSBLRl9SRVBFQVQ7CiAgICB9CgogICAgVFJBQ0VfKGtleSkoIiB3UGFyYW09JTA0eCwgbFBhcmFtPSUwOGx4LCBJbnB1dEtleVN0YXRlPSV4XG4iLAogICAgICAgICAgICAgICAgd1ZrLCBNQUtFTFBBUkFNKCAxLCBmbGFncyApLCBrZXlfc3RhdGVfdGFibGVbd1ZrXSApOwoKICAgIC8qIEhvb2sgZ2V0cyB3aGF0ZXZlciBrZXkgd2FzIHNlbnQuICovCiAgICBob29rLnZrQ29kZSAgICAgID0gdmtfaG9vazsKICAgIGhvb2suc2NhbkNvZGUgICAgPSB3U2NhbjsKICAgIGhvb2suZmxhZ3MgICAgICAgPSAoZmxhZ3MgPj4gOCkgfCBpbmplY3RlZF9mbGFnczsKICAgIGhvb2sudGltZSAgICAgICAgPSB0aW1lOwogICAgaG9vay5kd0V4dHJhSW5mbyA9IGR3RXh0cmFJbmZvOwogICAgaWYgKEhPT0tfQ2FsbEhvb2tzKCBXSF9LRVlCT0FSRF9MTCwgSENfQUNUSU9OLCBtZXNzYWdlLCAoTFBBUkFNKSZob29rLCBUUlVFICkpIHJldHVybjsKCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfS0VZVVApCiAgICB7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gJj0gfjB4ODA7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbd1ZrXSAmIDB4ODApKSBrZXlfc3RhdGVfdGFibGVbd1ZrXSBePSAweDAxOwogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdIHw9IDB4YzA7CiAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgIH0KCiAgICBpZiAoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgZmxhZ3MgfD0gS0ZfQUxURE9XTjsKCiAgICBpZiAod1ZrU3RyaXBwZWQgPT0gVktfU0hJRlQpIGZsYWdzICY9IH5LRl9FWFRFTkRFRDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZW5kX2hhcmR3YXJlX21lc3NhZ2UgKQogICAgewogICAgICAgIHJlcS0+aWQgICAgICAgPSAoaW5qZWN0ZWRfZmxhZ3MgJiBMTEtIRl9JTkpFQ1RFRCkgPyAwIDogR2V0Q3VycmVudFRocmVhZElkKCk7CiAgICAgICAgcmVxLT53aW4gICAgICA9IDA7CiAgICAgICAgcmVxLT5tc2cgICAgICA9IG1lc3NhZ2U7CiAgICAgICAgcmVxLT53cGFyYW0gICA9IHdWazsKICAgICAgICByZXEtPmxwYXJhbSAgID0gTUFLRUxQQVJBTSggMSAvKiByZXBlYXQgY291bnQgKi8sIGZsYWdzICk7CiAgICAgICAgcmVxLT54ICAgICAgICA9IGN1cnNvcl9wb3MueDsKICAgICAgICByZXEtPnkgICAgICAgID0gY3Vyc29yX3Bvcy55OwogICAgICAgIHJlcS0+dGltZSAgICAgPSB0aW1lOwogICAgICAgIHJlcS0+aW5mbyAgICAgPSBkd0V4dHJhSW5mbzsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZQogKgogKiBVcGRhdGVzIGludGVybmFsIHN0YXRlIGZvciA8dmtleT4sIGRlcGVuZGluZyBvbiBrZXkgPHN0YXRlPiB1bmRlciBYCiAqCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUgKCBXT1JEIHZrZXksIFdPUkQgc2NhbiwgaW50IHN0YXRlLCBEV09SRCB0aW1lICkKewogICAgLyogRG8gc29tZXRoaW5nIGlmIGludGVybmFsIHRhYmxlIHN0YXRlICE9IFggc3RhdGUgZm9yIGtleWNvZGUgKi8KICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVt2a2V5ICYgMHhmZl0gJiAweDgwKSE9MCkgIT0gc3RhdGUpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSB2a2V5ICYgMHgxMDAgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwOwoKICAgICAgICBpZiAoIXN0YXRlKSBmbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CgogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwKICAgICAgICAgICAgICB2a2V5LCBrZXlfc3RhdGVfdGFibGVbdmtleSAmIDB4ZmZdKTsKCiAgICAgICAgLyogRmFrZSBrZXkgYmVpbmcgcHJlc3NlZCBpbnNpZGUgd2luZSAqLwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgc2NhbiAmIDB4ZmYsIGZsYWdzLCB0aW1lLCAwLCAwICk7CgogICAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciAlIy4yeFxuIiwga2V5X3N0YXRlX3RhYmxlW3ZrZXkgJiAweGZmXSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleW1hcE5vdGlmeQogKgogKiBVcGRhdGUgbW9kaWZpZXJzIHN0YXRlIChDdHJsLCBBbHQsIFNoaWZ0KSB3aGVuIHdpbmRvdyBpcyBhY3RpdmF0ZWQuCiAqCiAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbmUgdXNlcyBDdHJsKy4uLiBBbHQrLi4uIG9yIFNoaWZ0Ky4uIHRvIHN3aXRjaAogKiBmcm9tIHdpbmUgdG8gYW5vdGhlciBhcHBsaWNhdGlvbiBhbmQgYmFjay4KICogVG9nZ2xlIGtleXMgYXJlIGhhbmRsZWQgaW4gSGFuZGxlRXZlbnQuCiAqLwp2b2lkIFgxMURSVl9LZXltYXBOb3RpZnkoIEhXTkQgaHduZCwgWEV2ZW50ICpldmVudCApCnsKICAgIGludCBpLCBqOwogICAgRFdPUkQgdGltZSA9IEdldEN1cnJlbnRUaW1lKCk7CgogICAgLyogdGhlIG1pbmltdW0ga2V5Y29kZSBpcyBhbHdheXMgZ3JlYXRlciBvciBlcXVhbCB0byA4LCBzbyB3ZSBjYW4KICAgICAqIHNraXAgdGhlIGZpcnN0IDggdmFsdWVzLCBoZW5jZSBzdGFydCBhdCAxCiAgICAgKi8KICAgIGZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKQogICAgewogICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBXT1JEIHZrZXkgPSBrZXljMnZrZXlbKGkgKiA4KSArIGpdOwogICAgICAgICAgICBXT1JEIHNjYW4gPSBrZXljMnNjYW5bKGkgKiA4KSArIGpdOwogICAgICAgICAgICBpbnQgc3RhdGUgPSAoZXZlbnQtPnhrZXltYXAua2V5X3ZlY3RvcltpXSAmICgxPDxqKSkgIT0gMDsKCiAgICAgICAgICAgIHN3aXRjaCh2a2V5ICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggdmtleSwgc2Nhbiwgc3RhdGUsIHRpbWUgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfbG9ja19zdGF0ZShCWVRFIHZrZXksIFdPUkQgc2NhbiwgRFdPUkQgdGltZSkKewogICAgRFdPUkQgZmxhZ3MgPSB2a2V5ID09IFZLX05VTUxPQ0sgPyBLRVlFVkVOVEZfRVhURU5ERURLRVkgOiAwOwoKICAgIGlmIChrZXlfc3RhdGVfdGFibGVbdmtleV0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CgogICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGZsYWdzLCB0aW1lLCAwLCAwICk7CiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUsIDAsIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhFdmVudCAqeGV2ICkKewogICAgWEtleUV2ZW50ICpldmVudCA9ICZ4ZXYtPnhrZXk7CiAgICBjaGFyIFN0clsyNF07CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBldmVudC0+dHlwZSA9PSBLZXlQcmVzcykKICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgc2l6ZW9mKFN0ciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIEVSUigiQnVmZmVyIE92ZXJmbG93IG5lZWQgJWkhXG4iLGFzY2lpX2NoYXJzKTsKCiAgICBpZiAoc3RhdHVzID09IFhMb29rdXBDaGFycykKICAgIHsKICAgICAgICBYMTFEUlZfWElNTG9va3VwQ2hhcnMoIFN0ciwgYXNjaWlfY2hhcnMgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgYXJlIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZSB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggZm9yIEFsdEdyIHNob3VsZCBiZSAyCiAgICAgICAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgLyogU2F2ZSBhbHNvIGFsbCBwb3NzaWJsZSBtb2RpZmllciBzdGF0ZXMuICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAoMHg2MDAwIHwgTW9kMU1hc2sgfCBNb2QyTWFzayB8IE1vZDNNYXNrIHwgTW9kNE1hc2sgfCBNb2Q1TWFzayk7CgogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgZGVidWdzdHJfYW4oU3RyLCBhc2NpaV9jaGFycykpOwogICAgfQoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLGV2ZW50KTsKICAgIC8qIFggcmV0dXJucyBrZXljb2RlIDAgZm9yIGNvbXBvc2VkIGNoYXJhY3RlcnMgKi8KICAgIGlmICghdmtleSAmJiBhc2NpaV9jaGFycykgdmtleSA9IFZLX05PTkFNRTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgIGlmICghdmtleSkgcmV0dXJuOwoKICAgIGR3RmxhZ3MgPSAwOwogICAgaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CiAgICBpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCgogICAgLyogTm90ZTogWCBzZXRzIHRoZSBiZWxvdyBzdGF0ZXMgb24ga2V5IGRvd24gYW5kIGNsZWFycyB0aGVtIG9uIGtleSB1cC4KICAgICAgIFdpbmRvd3MgdHJpZ2dlcnMgdGhlbSBvbiBrZXkgZG93bi4gKi8KCiAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSAmJgogICAgICAgIHZrZXkgIT0gVktfQ0FQSVRBTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHNMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSk7CiAgICAgICAgdXBkYXRlX2xvY2tfc3RhdGUoVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgICh2a2V5ICYgMHhmZikgIT0gVktfTlVNTE9DSykKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX05VTUxPQ0tdKTsKICAgICAgICB1cGRhdGVfbG9ja19zdGF0ZShWS19OVU1MT0NLLCAweDQ1LCBldmVudF90aW1lKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIFNDUk9MTExPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19TQ1JPTExdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBTY3JvbGxMb2NrTWFzaykgJiYKICAgICAgICB2a2V5ICE9IFZLX1NDUk9MTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIFNjckxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX1NDUk9MTF0pOwogICAgICAgIHVwZGF0ZV9sb2NrX3N0YXRlKFZLX1NDUk9MTCwgMHg0NiwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKICAgIFRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lLCAwLCAwICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKSkpIGNvbnRpbnVlOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMDApICYmIChrZXlzeW0gIT0gJyAnKSkKICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtrZXljXVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICVsZFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI6MiLCBmb3IgZXhhbXBsZSkgKi8KCS8qIGhvd2V2ZXIsIHRoZSBzY29yZSB3aWxsIGJlIGhpZ2hlciBmb3IgbG9uZ2VyIG1hdGNoZXMgKi8KCWZvciAoa2V5ID0gMDsga2V5IDwgTUFJTl9MRU47IGtleSsrKSB7CgkgIGZvciAob2sgPSAwLCBpID0gMDsgKG9rID49IDApICYmIChpIDwgc3ltcyk7IGkrKykgewoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSA9PSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rKys7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldICE9IGNrZXlba2V5Y11baV0pKQoJICAgICAgb2sgPSAtMTsKCSAgfQoJICBpZiAob2sgPiAwKSB7CgkgICAgc2NvcmUgKz0gb2s7CgkgICAgYnJlYWs7CgkgIH0KCX0KCS8qIGNvdW50IHRoZSBtYXRjaGVzIGFuZCBtaXNtYXRjaGVzICovCglpZiAob2sgPiAwKSB7CgkgIG1hdGNoKys7CgkgIC8qIGFuZCBob3cgbXVjaCB0aGUga2V5Y29kZSBvcmRlciBtYXRjaGVzICovCgkgIGlmIChrZXkgPiBwa2V5KSBzZXErKzsKCSAgcGtleSA9IGtleTsKCX0gZWxzZSB7CiAgICAgICAgICAvKiBwcmludCBzcGFjZXMgaW5zdGVhZCBvZiBcMCdzICovCiAgICAgICAgICBjaGFyIHN0cls1XTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHN0cltpXSA9IGNrZXlba2V5Y11baV0gPyBja2V5W2tleWNdW2ldIDogJyAnOwogICAgICAgICAgc3RyWzRdID0gMDsKICAgICAgICAgIFRSQUNFXyhrZXkpKCJtaXNtYXRjaCBmb3Iga2V5c3ltIDB4JTA0bFgsIGtleWNvZGUgJWQsIGdvdCAlc1xuIiwga2V5c3ltLCBrZXljLCBzdHIgKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfSW5pdEtleWJvYXJkCiAqLwp2b2lkIFgxMURSVl9Jbml0S2V5Ym9hcmQoIERpc3BsYXkgKmRpc3BsYXkgKQp7CiAgICBLZXlTeW0gKmtzcDsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleSwgT0VNdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjaGFyIHZrZXlfdXNlZFsyNTZdID0geyAwIH07CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9rZXljb2RlICsgMSAtIG1pbl9rZXljb2RlLCAma2V5c3ltc19wZXJfa2V5Y29kZSk7CiAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGtleXN5bXNfcGVyX2tleWNvZGUuCiAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCiAgICBYRnJlZShrc3ApOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19TY3JvbGxfTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxMb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIlNjcm9sbExvY2tNYXNrIGlzICV4XG4iLCBTY3JvbGxMb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBkaXNwbGF5ICk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwoKICAgIE9FTXZrZXkgPSBWS19PRU1fODsgLyogbmV4dCBpcyBhdmFpbGFibGUuICAqLwogICAgbWVtc2V0KGtleWMydmtleSwgMCwgc2l6ZW9mKGtleWMydmtleSkpOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsgLyogWEZyZWU4NiB2ZW5kb3Iga2V5cyAqLwogICAgICAgICAgICAgICAgdmtleSA9IHhmcmVlODZfdmVuZG9yX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgLyogQWxsIHZlbmRvciBrZXlzIGFyZSBleHRlbmRlZCB3aXRoIGEgc2NhbiBjb2RlIG9mIDAgcGVyIHRlc3Rpbmcgb24gV2luWFAgKi8KICAgICAgICAgICAgICAgIHNjYW4gPSAweDEwMDsKCQl2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICUwNHggPT4gdmtleSAlMDR4XG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICAgICAgaWYgKCh2a2V5ICYgMHhmZikgJiYgdmtleV91c2VkWyh2a2V5ICYgMHhmZildKQogICAgICAgICAgICBXQVJOKCJ2a2V5ICUwNHggaXMgYmVpbmcgdXNlZCBieSBtb3JlIHRoYW4gb25lIGtleWNvZGVcbiIsIHZrZXkpOwogICAgICAgIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSA9IDE7CiAgICB9IC8qIGZvciAqLwoKI2RlZmluZSBWS0VZX0lGX05PVF9VU0VEKHZrZXkpICh2a2V5X3VzZWRbKHZrZXkpXSA/IDAgOiAodmtleV91c2VkWyh2a2V5KV0gPSAxLCAodmtleSkpKQogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhmZjsKICAgICAgICBpZiAodmtleSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwogICAgICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gWEtfMCAmJiBrZXlzeW0gPD0gWEtfOSkKICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gWEtfQSAmJiBrZXlzeW0gPD0gWEtfWikpIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKGtleXN5bSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8yKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzQpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV81KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9DT01NQSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BFUklPRCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX01JTlVTKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUExVUyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgewogICAgICAgICAgICAvKiBPdGhlcnMga2V5czogbGV0J3MgYXNzaWduIE9FTSB2aXJ0dWFsIGtleSBjb2RlcyBpbiB0aGUgYWxsb3dlZCByYW5nZSwKICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoKytPRU12a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKE9FTXZrZXkgPCAweGY1ICYmIHZrZXlfdXNlZFtPRU12a2V5XSk7CgogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChPRU12a2V5KTsKCiAgICAgICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWDpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoImtleWNvZGUgJTA0eCA9PiB2a2V5ICUwNHhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIH0KICAgIH0gLyogZm9yICovCiN1bmRlZiBWS0VZX0lGX05PVF9VU0VECgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICUwMnggKCVzKVxuIixzY2FuLGtleWMsa3NuYW1lKTsKCWtleWMyc2NhbltrZXljXT1zY2FuKys7CiAgICAgIH0KCiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgU0hPUlQgcmV0dmFsOwoKICAgIC8qIFBob3Rvc2hvcCBsaXZlbG9ja3MgdW5sZXNzIG1vdXNlIGV2ZW50cyBhcmUgaW5jbHVkZWQgaGVyZSAqLwogICAgWDExRFJWX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMCwgTlVMTCwgMCwgUVNfS0VZIHwgUVNfTU9VU0UsIDAgKTsKCiAgICByZXR2YWwgPSAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg0MCkgPyAweDAwMDEgOiAwKSB8CiAgICAgICAgICAgICAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg4MCkgPyAweDgwMDAgOiAwKTsKICAgIGtleV9zdGF0ZV90YWJsZVtrZXldICY9IH4weDQwOwogICAgVFJBQ0VfKGtleSkoIigleCkgLT4gJXhcbiIsIGtleSwgcmV0dmFsKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0TGlzdCAoWDExRFJWLkApCiAqLwpVSU5UIFgxMURSVl9HZXRLZXlib2FyZExheW91dExpc3QoSU5UIHNpemUsIEhLTCAqaGtsKQp7CiAgICBJTlQgaTsKCiAgICBUUkFDRSgiJWQsICVwXG4iLCBzaXplLCBoa2wpOwoKICAgIGlmICghc2l6ZSkKICAgIHsKICAgICAgICBzaXplID0gNDA5NjsgLyogaG9wZSB3ZSB3aWxsIG5ldmVyIGhhdmUgdGhhdCBtYW55ICovCiAgICAgICAgaGtsID0gTlVMTDsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBtYWluX2tleV90YWJbaV0uY29tbWVudCAmJiAoaSA8IHNpemUpOyBpKyspCiAgICB7CiAgICAgICAgaWYgKGhrbCkKICAgICAgICB7CiAgICAgICAgICAgIFVMT05HX1BUUiBsYXlvdXQgPSBtYWluX2tleV90YWJbaV0ubGNpZDsKICAgICAgICAgICAgTEFOR0lEIGxhbmdpZDsKCiAgICAgICAgICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgICAgICAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgICAgICAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgICAgICAgICAgaGtsW2ldID0gKEhLTClsYXlvdXQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgVUxPTkdfUFRSIGxheW91dDsKICAgIExBTkdJRCBsYW5naWQ7CgogICAgaWYgKGR3VGhyZWFkaWQgJiYgZHdUaHJlYWRpZCAhPSBHZXRDdXJyZW50VGhyZWFkSWQoKSkKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKI2lmIDAKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwojZWxzZQogICAgLyogRklYTUU6CiAgICAgKiBXaW53b3JkIHVzZXMgcmV0dXJuIHZhbHVlIG9mIEdldEtleWJvYXJkTGF5b3V0IGFzIGEgY29kZXBhZ2UKICAgICAqIHRvIHRyYW5zbGF0ZSBBTlNJIGtleWJvYXJkIG1lc3NhZ2VzIHRvIHVuaWNvZGUuIEJ1dCB3ZSBoYXZlCiAgICAgKiBhIHByb2JsZW0gd2l0aCBpdDogZm9yIGluc3RhbmNlIFBvbGlzaCBrZXlib2FyZCBsYXlvdXQgaXMKICAgICAqIGlkZW50aWNhbCB0byB0aGUgVVMgb25lLCBhbmQgdGhlcmVmb3JlIGluc3RlYWQgb2YgdGhlIFBvbGlzaAogICAgICogbG9jYWxlIGlkIHdlIHJldHVybiB0aGUgVVMgb25lLgogICAgICovCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKI2VuZGlmCiAgICAvKiAKICAgICAqIE1pY3Jvc29mdCBPZmZpY2UgZXhwZWN0cyB0aGlzIHZhbHVlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYwogICAgICogZm9yIEphcGFuZXNlIGFuZCBLb3JlYW4gV2luZG93cyB3aXRoIGFuIElNRSB0aGUgdmFsdWUgaXMgMHhlMDAxCiAgICAgKiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdG8gc2VlIGlmIGFuIElNRSBleGlzdHMgYW5kIGlmIHNvIHRoZW4KICAgICAqIHNldCB0aGlzIHdvcmQgcHJvcGVybHkuCiAgICAgKi8KICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICBpZiAobGFuZ2lkID09IExBTkdfQ0hJTkVTRSB8fCBsYW5naWQgPT0gTEFOR19KQVBBTkVTRSB8fCBsYW5naWQgPT0gTEFOR19LT1JFQU4pCiAgICAgICAgbGF5b3V0IHw9IDB4ZTAwMSA8PCAxNjsgLyogRklYTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywnbCcsJ3gnLDB9OwogICAgRFdPUkQgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBsYXlvdXQgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ubGNpZDsKICAgIC8qIHNlZSBjb21tZW50IGZvciBHZXRLZXlib2FyZExheW91dCAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgc3ByaW50ZlcobmFtZSwgZm9ybWF0VywgbGF5b3V0KTsKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cobmFtZSkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcCwgJTA0eDogc3R1YiFcbiIsIGhrbCwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKCZldmVudC0+eG1hcHBpbmcpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoIHRocmVhZF9kaXNwbGF5KCkgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaSwgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIC8qIEZJWE1FOiB3aGF0IGhhcHBlbnMgaWYgd0NoYXIgaXMgbm90IGEgTGF0aW4xIGNoYXJhY3RlciBhbmQgQ1BfVU5JWENQCiAgICAgKiBpcyBVVEYtOCAobXVsdGlieXRlIGVuY29kaW5nKT8KICAgICAqLwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFKCInJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4ICglZClcbiIsCiAgICAgICAgICAgIGNDaGFyLCBrZXlzeW0sIGtleXN5bSwga2V5Y29kZSwga2V5Y29kZSk7CgogICAgLyoga2V5Y29kZSAtPiAoa2V5YzJ2a2V5KSB2a2V5ICovCiAgICByZXQgPSBrZXljMnZrZXlba2V5Y29kZV07CgogICAgaWYgKCFrZXljb2RlIHx8ICFyZXQpCiAgICB7CiAgICAgICAgVFJBQ0UoImtleWNvZGUgZm9yICclYycgbm90IGZvdW5kLCByZXR1cm5pbmcgLTFcbiIsIGNDaGFyKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW5kZXggPSAtMTsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgLyogZmluZCBzaGlmdCBzdGF0ZSAqLwogICAgewogICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGkpID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBzd2l0Y2ggKGluZGV4KQogICAgewogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIiwga2V5c3ltKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgIGNhc2UgMTogcmV0ICs9IDB4MDEwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiByZXQgKz0gMHgwNjAwOyBicmVhazsKICAgICAgICBjYXNlIDM6IHJldCArPSAweDA3MDA7IGJyZWFrOwogICAgfQogICAgLyoKICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAogICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCiAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQogICAgICovCgogICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5RXggKFgxMURSVi5AKQogKi8KVUlOVCBYMTFEUlZfTWFwVmlydHVhbEtleUV4KFVJTlQgd0NvZGUsIFVJTlQgd01hcFR5cGUsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoaGtsICE9IFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgc3dpdGNoKHdNYXBUeXBlKQogICAgewogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDOiAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCiAgICAgICAgY2FzZSBNQVBWS19WS19UT19WU0NfRVg6CiAgICAgICAgewogICAgICAgICAgICBpbnQga2V5YzsKCiAgICAgICAgICAgIHN3aXRjaCAod0NvZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6IHdDb2RlID0gVktfTFNISUZUOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVktfQ09OVFJPTDogd0NvZGUgPSBWS19MQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX01FTlU6IHdDb2RlID0gVktfTE1FTlU7IGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwogICAgICAgICAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgICAgICAgICAgaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkgYnJlYWs7CgogICAgICAgICAgICBpZiAoa2V5YyA+IG1heF9rZXljb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVks6IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WS19FWDoKICAgICAgICB7CiAgICAgICAgICAgIGludCBrZXljOwogICAgICAgICAgICBVSU5UIHZrZXk7CgogICAgICAgICAgICAvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwogICAgICAgICAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgICAgICAgICAgaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkgYnJlYWs7CgogICAgICAgICAgICBpZiAoa2V5YyA+IG1heF9rZXljb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwogICAgICAgICAgICBpZiAod01hcFR5cGUgPT0gTUFQVktfVlNDX1RPX1ZLKQogICAgICAgICAgICAgICAgc3dpdGNoICh2a2V5KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7IGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuTVZLICh2a2V5KTsKICAgICAgICB9CgkJY2FzZSBNQVBWS19WS19UT19DSEFSOiAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLwoJCXsKICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Ugc3RpbGwgZG9uJ3Qga25vdyB3aGF0ICJ1bnNoaWZ0ZWQiIG1lYW5zLiBpbiB3aW5kb3dzIFZLX1cgKDB4NTcpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybnMgMHg1Nywgd2hpY2ggaXMgdXBlcmNhc2UgJ1cnLiBTbyB3ZSBoYXZlIHRvIHJldHVybiB0aGUgdXBwZXJjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGtleS4uIExvb2tzIGxpa2Ugc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIE1TIGRvY3M/CiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgb25seSB0cnVlIGZvciBsZXR0ZXJzLCBmb3IgZXhhbXBsZSBWS18wIHJldHVybnMgJzAnIG5vdCAnKScuCiAgICAgICAgICAgICAgICAgICAgICAgICAqIC0gaGVuY2Ugd2UgdXNlIHRoZSBsb2NrIG1hc2sgdG8gZW5zdXJlIHRoaXMgaGFwcGVucy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiAoWExvb2t1cFN0cmluZykgYW5zaSBjaGFyICovCgkJCVhLZXlFdmVudCBlOwoJCQlLZXlTeW0ga2V5c3ltOwoJCQlpbnQga2V5YywgbGVuOwoJCQljaGFyIHNbMTBdOwoKCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKCQkJZS5zdGF0ZSA9IDA7CgkJCWUua2V5Y29kZSA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoMCwmZSkgJiAweEZGKSAhPSB3Q29kZSkgewoJCQkJICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKCQkJCQkgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoKHdDb2RlPj1WS19OVU1QQUQwKSAmJiAod0NvZGU8PVZLX05VTVBBRDkpKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKCQkJaWYgKHdDb2RlPT1WS19ERUNJTUFMKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgd2NoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBzLCBsZW4sICZ3Y2gsIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk1WSyh0b3VwcGVyVyh3Y2gpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIEFOU0kuXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCUZJWE1FKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHNjYW5Db2RlLCBNQVBWS19WU0NfVE9fVktfRVgsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFItU2hpZnQgaXMgInNwZWNpYWwiIC0gaXQgaXMgYW4gZXh0ZW5kZWQga2V5IHdpdGggc2VwYXJhdGUgc2NhbiBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUgfD0gMHgxMDA7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCBNQVBWS19WS19UT19DSEFSLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXJXKChXQ0hBUilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IFhLZXljb2RlVG9LZXlzeW0odGhyZWFkX2Rpc3BsYXkoKSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CiAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0lMDR4IGtleXN5bT0lMDR4IHN0cmluZz0lc1xuIiwKICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgbmFtZSk7CiAgICAgIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSAmJiBuYW1lKQogICAgICB7CiAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgLTEsIGxwQnVmZmVyLCBuU2l6ZSk7CiAgICAgICAgICBscEJ1ZmZlcltuU2l6ZSAtIDFdID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICB9CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIFdBUk4gZm9yIHVua25vd24ga2V5cyAgICovCgogIFdBUk4oIiglMDh4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNHgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICBpZiAobHBCdWZmZXIgJiYgblNpemUpCiAgICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgTFBCWVRFIGxwS2V5U3RhdGUsCgkJICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBscENoYXJbMTBdOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0UoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChoa2wgIT0gWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgIGlmICghZm9jdXMpIGZvY3VzID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBlLndpbmRvdyA9IFgxMURSVl9nZXRfd2hvbGVfd2luZG93KCBmb2N1cyApOwogICAgeGljID0gWDExRFJWX2dldF9pYyggZm9jdXMgKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0UoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0UoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB2aXJ0S2V5KQogICAgICAgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwogICAgICAgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgICAgaWYgKChFVkVOVF9ldmVudF90b192a2V5KHhpYywmZSkgJiAweEZGKSAhPSB2aXJ0S2V5KSB7CiAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICB9CgkgIH0KICAgICAgfQoKICAgIGlmICh2aXJ0S2V5ID49IFZLX0xFRlQgJiYgdmlydEtleSA8PSBWS19ET1dOKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5IC0gVktfTEVGVCArIFhLX0xlZnQpOwoKICAgIGlmICgodmlydEtleT49VktfTlVNUEFEMCkgJiYgKHZpcnRLZXk8PVZLX05VTVBBRDkpKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB2aXJ0S2V5LVZLX05VTVBBRDArWEtfS1BfMCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX0RFQ0lNQUwpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwoKICAgIGlmICh2aXJ0S2V5PT1WS19TRVBBUkFUT1IpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB2aXJ0S2V5KTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0UoIkZvdW5kIGtleWNvZGUgJWQgKDB4JTJYKVxuIixlLmtleWNvZGUsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlIDB4JTA0eFxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nLAogICAgICogZS50eXBlIHdhcyBzZXQgdG8gS2V5UHJlc3MgYWJvdmUuCiAgICAgKi8KICAgIGlmICh4aWMpCiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGxwQ2hhciwgc2l6ZW9mKGxwQ2hhciksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICBFUlIoIkJ1ZmZlciBPdmVyZmxvdyBuZWVkICVkIVxuIiwgcmV0KTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDA5OwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCglkZWFkX2NoYXIgPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CglpZiAoZGVhZF9jaGFyKQogICAgICAgIHsKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgJmRlYWRfY2hhciwgMSwgYnVmVywgYnVmV19zaXplKTsKCSAgICByZXQgPSAtMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgogICAgICAgIGlmIChrZXlzeW0gPj0gMHgwMTAwMDEwMCAmJiBrZXlzeW0gPD0gMHgwMTAwZmZmZikKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVuaWNvZGUgZGlyZWN0IG1hcHBpbmcgKi8KICAgICAgICAgICAgYnVmV1swXSA9IGtleXN5bSAmIDB4ZmZmZjsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGtleXN5bSA+PiA4KSA9PSAweDEwMDhGRikgewogICAgICAgICAgICBidWZXWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgllbHNlCgkgICAgewoJICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwoJICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlXQVJOKCJubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lKTsKCQlXQVJOKCJ2aXJ0S2V5PSVYLCBzY2FuQ29kZT0lWCwga2V5Y29kZT0lWCwgc3RhdGU9JVhcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBtb3JlIGFyZWFzIHdoZXJlIFggcmV0dXJucyBjaGFyYWN0ZXJzIGJ1dCBXaW5kb3dzIGRvZXMgbm90CiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sICovCiAgICAgICAgaWYgKGUuc3RhdGUgJiBDb250cm9sTWFzaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGtleXN5bT49MzMpICYmIChrZXlzeW0gPCAnQScpKSB8fAogICAgICAgICAgICAgICAgKChrZXlzeW0gPiAnWicpICYmIChrZXlzeW0gPCAnYScpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSAvKiBDb250cm9sIGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gJ1xuJzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8qIEhhY2sgdG8gZGV0ZWN0IGFuIFhMb29rdXBTdHJpbmcgaGFyZC1jb2RlZCB0byBMYXRpbjEgKi8KICAgICAgICBpZiAocmV0ID09IDEgJiYga2V5c3ltID49IDB4MDBhMCAmJiBrZXlzeW0gPD0gMHgwMGZmICYmIChCWVRFKWxwQ2hhclswXSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gKEJZVEUpbHBDaGFyWzBdOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCgkvKiBwZXJmb3JtIHRyYW5zbGF0aW9uIHRvIHVuaWNvZGUgKi8KCWlmKHJldCkKCXsKCSAgICBUUkFDRV8oa2V5KSgiVHJhbnNsYXRpbmcgY2hhciAweCUwMnggdG8gdW5pY29kZVxuIiwgKihCWVRFICopbHBDaGFyKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9Cgpmb3VuZDoKICAgIFRSQUNFXyhrZXkpKCJUb1VuaWNvZGUgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleCAlc1xuIiwKCQlyZXQsIChyZXQgJiYgYnVmVykgPyBidWZXWzBdIDogMCwgYnVmVyA/ICIiIDogIihubyBidWZmZXIpIik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhCZWxsKHRocmVhZF9kaXNwbGF5KCksIDApOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQo=