LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRmlsZSBzb3J0a2V5LmgKLy8KLy8gCi8vCi8vIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCi8vCi8vIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgovLwovLyAgRGF0ZSAgICAgICAgIE5hbWUgICAgICAgICAgRGVzY3JpcHRpb24KLy8KLy8gIDYvMjAvOTcgICAgIGhlbGVuYSAgICAgIEphdmEgY2xhc3MgbmFtZSBjaGFuZ2UuCi8vICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KLy8gIDYvMjYvOTggICAgIGVybSAgICAgICAgIENoYW5nZWQgdG8gdXNlIGJ5dGUgYXJyYXlzIGFuZCBtZW1jbXAuIAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpZm5kZWYgU09SVEtFWV9ICiNkZWZpbmUgU09SVEtFWV9ICgoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCmNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yOwoKLyoqCiAqIENvbGxhdGlvbiBrZXlzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIENvbGxhdG9yIGNsYXNzLiAgVXNlIHRoZSBDb2xsYXRpb25LZXkgb2JqZWN0cwogKiBpbnN0ZWFkIG9mIENvbGxhdG9yIHRvIGNvbXBhcmUgc3RyaW5ncyBtdWx0aXBsZSB0aW1lcy4gIEEgQ29sbGF0aW9uS2V5CiAqIHByZXByb2Nlc3NlcyB0aGUgY29tcGFyaXNvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDb2xsYXRvciBvYmplY3QgdG8KICogbWFrZSB0aGUgY29tcGFyaXNvbiBmYXN0ZXIuICBJZiB5b3UgYXJlIG5vdCBnb2luZyB0byBjb21wYXJpbmcgc3RyaW5ncwogKiBtdWx0aXBsZSB0aW1lcywgdGhlbiB1c2luZyB0aGUgQ29sbGF0b3Igb2JqZWN0IGlzIGdlbmVyYWxseSBmYXN0ZXIsCiAqIHNpbmNlIGl0IG9ubHkgcHJvY2Vzc2VzIGFzIG11Y2ggb2YgdGhlIHN0cmluZyBhcyBuZWVkZWQgdG8gbWFrZSBhCiAqIGNvbXBhcmlzb24uCiAqIDxwPiBGb3IgZXhhbXBsZSAod2l0aCBzdHJlbmd0aCA9PSB0ZXJ0aWFyeSkKICogPHA+V2hlbiBjb21wYXJpbmcgIkFiZXJuYXRoeSIgdG8gIkJhZ2dpbnMtU215dGh3b3J0aHkiLCBDb2xsYXRvcgogKiBvbmx5IG5lZWRzIHRvIHByb2Nlc3MgYSBjb3VwbGUgb2YgY2hhcmFjdGVycywgd2hpbGUgYSBjb21wYXJpc29uCiAqIHdpdGggQ29sbGF0aW9uS2V5cyB3aWxsIHByb2Nlc3MgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzLiAgT24gdGhlIG90aGVyIGhhbmQsCiAqIGlmIHlvdSBhcmUgZG9pbmcgYSBzb3J0IG9mIGEgbnVtYmVyIG9mIGZpZWxkcywgaXQgaXMgbXVjaCBmYXN0ZXIgdG8gdXNlCiAqIENvbGxhdGlvbktleXMsIHNpbmNlIHlvdSB3aWxsIGJlIGNvbXBhcmluZyBzdHJpbmdzIG11bHRpcGxlIHRpbWVzLgogKiA8cD5UeXBpY2FsIHVzZSBvZiBDb2xsYXRpb25LZXlzIGFyZSBpbiBkYXRhYmFzZXMsIHdoZXJlIHlvdSBzdG9yZSBhIENvbGxhdGlvbktleQogKiBpbiBhIGhpZGRlbiBmaWVsZCwgYW5kIHVzZSBpdCBmb3Igc29ydGluZyBvciBpbmRleGluZy4KICoKICogPHA+RXhhbXBsZSBvZiB1c2U6CiAqIDxwcmU+CiAqIC4gICAgVUVycm9yQ29kZSBzdWNjZXNzID0gVV9aRVJPX0VSUk9SOwogKiAuICAgIENvbGxhdG9yKiBteUNvbGxhdG9yID0gQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKHN1Y2Nlc3MpOwogKiAuICAgIENvbGxhdGlvbktleSoga2V5cyA9IG5ldyBDb2xsYXRpb25LZXkgWzNdOwogKiAuICAgIG15Q29sbGF0b3ItPmdldENvbGxhdGlvbktleSgiVG9tIiwga2V5c1swXSwgc3VjY2VzcyApOwogKiAuICAgIG15Q29sbGF0b3ItPmdldENvbGxhdGlvbktleSgiRGljayIsIGtleXNbMV0sIHN1Y2Nlc3MgKTsKICogLiAgICBteUNvbGxhdG9yLT5nZXRDb2xsYXRpb25LZXkoIkhhcnJ5Iiwga2V5c1syXSwgc3VjY2VzcyApOwogKiAuIAogKiAuICAgIC8vIEluc2lkZSBib2R5IG9mIHNvcnQgcm91dGluZSwgY29tcGFyZSBrZXlzIHRoaXMgd2F5OgogKiAuICAgIENvbGxhdGlvbktleSB0bXA7CiAqIC4gICAgaWYoa2V5c1swXS5jb21wYXJlVG8oIGtleXNbMV0gKSA+IDAgKSB7CiAqIC4gICAgICAgIHRtcCA9IGtleXNbMF07IGtleXNbMF0gPSBrZXlzWzFdOyBrZXlzWzFdID0gdG1wOwogKiAuICAgIH0KICogLiAgICAvLy4uLgogKiA8L3ByZT4KICogPHA+QmVjYXVzZSBDb2xsYXRvcjo6Y29tcGFyZSgpJ3MgYWxnb3JpdGhtIGlzIGNvbXBsZXgsIGl0IGlzIGZhc3RlciB0byBzb3J0CiAqIGxvbmcgbGlzdHMgb2Ygd29yZHMgYnkgcmV0cmlldmluZyBjb2xsYXRpb24ga2V5cyB3aXRoIENvbGxhdG9yOjpnZXRDb2xsYXRpb25LZXkoKS4KICogWW91IGNhbiB0aGVuIGNhY2hlIHRoZSBjb2xsYXRpb24ga2V5cyBhbmQgY29tcGFyZSB0aGVtIHVzaW5nIENvbGxhdGlvbktleTo6Y29tcGFyZVRvKCkuCiAqIDxwPgogKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IDxjb2RlPkNvbGxhdG9yPC9jb2RlPnMgd2l0aCBkaWZmZXJlbnQgTG9jYWxlLAogKiBDb2xsYXRpb25TdHJlbmd0aCBhbmQgRGVjb21wb3NpdGlvbk1vZGUgc2V0dGluZ3Mgd2lsbCByZXR1cm4gZGlmZmVyZW50CiAqIENvbGxhdGlvbktleXMgZm9yIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBMb2NhbGVzIGhhdmUgc3BlY2lmaWMgCiAqIGNvbGxhdGlvbiBydWxlcywgYW5kIHRoZSB3YXkgaW4gd2hpY2ggc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSBkaWZmZXJlbmNlcyAKICogYXJlIHRha2VuIGludG8gYWNjb3VudCwgZm9yIGV4YW1wbGUsIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBDb2xsYXRpb25LZXlzCiAqIGZvciBzYW1lIHN0cmluZ3MuCiAqIDxwPgoKICogQHNlZSAgICAgICAgICBDb2xsYXRvcgogKiBAc2VlICAgICAgICAgIFJ1bGVCYXNlZENvbGxhdG9yCiAqIEB2ZXJzaW9uICAgICAgMS4zIDEyLzE4Lzk2CiAqIEBhdXRob3IgICAgICAgSGVsZW5hIFNoaWgKICovCmNsYXNzIFVfSTE4Tl9BUEkgQ29sbGF0aW9uS2V5IHsKcHVibGljOgogICAgLyoqCiAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gZW1wdHkgY29sbGF0aW9uIGtleSBiYXNlZCBvbiB0aGUgbnVsbCBzdHJpbmcuICBBbiBlbXB0eSAKICAgICAqIGNvbGxhdGlvbiBrZXkgY29udGFpbnMgbm8gc29ydGluZyBpbmZvcm1hdGlvbi4gIFdoZW4gY29tcGFyaW5nIHR3byBlbXB0eQogICAgICogY29sbGF0aW9uIGtleXMsIHRoZSByZXN1bHQgaXMgQ29sbGF0b3I6OkVRVUFMLiAgQ29tcGFyaW5nIGVtcHR5IGNvbGxhdGlvbiBrZXkKICAgICAqIHdpdGggbm9uLWVtcHR5IGNvbGxhdGlvbiBrZXkgaXMgYWx3YXlzIENvbGxhdG9yOjpMRVNTLgogICAgICovCiAgICAgQ29sbGF0aW9uS2V5KCk7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjb2xsYXRpb24ga2V5IGJhc2VkIG9uIHRoZSBjb2xsYXRpb24ga2V5IHZhbHVlcy4gIAogICAgICogQHBhcmFtIHZhbHVlcyB0aGUgY29sbGF0aW9uIGtleSB2YWx1ZXMKICAgICAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgY29sbGF0aW9uIGtleSB2YWx1ZXMsIGluY2x1ZGluZyB0cmFpbGluZyBudWxscy4KICAgICAqIEBzZWUgI2NyZWF0ZUJpdHMKICAgICAqLwogICAgIENvbGxhdGlvbktleShjb25zdCAgdWludDhfdCogICAgdmFsdWVzLAoJCQkJCWludDMyX3QgICAgIGNvdW50KTsKCiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAgKi8KICAgICBDb2xsYXRpb25LZXkoY29uc3QgQ29sbGF0aW9uS2V5JiBvdGhlcik7CiAgICAvKiogCiAgICAgKiBTb3J0IGtleSBkZXN0cnVjdG9yLgogICAgICovCiAgICAgfkNvbGxhdGlvbktleSgpOwoKICAgIC8qKgogICAgICogQXNzaWdubWVudCBvcGVyYXRvcgogICAgICovCiAgICBjb25zdCAgIENvbGxhdGlvbktleSYgICAgICAgICAgIG9wZXJhdG9yPShjb25zdCBDb2xsYXRpb25LZXkmIG90aGVyKTsKCiAgICAvKioKICAgICAqIENvbXBhcmUgaWYgdHdvIGNvbGxhdGlvbiBrZXlzIGFyZSB0aGUgc2FtZS4KICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGNvbGxhdGlvbiBrZXkgdG8gY29tcGFyZSB0by4KICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHR3byBjb2xsYXRpb24ga2V5cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgQ29sbGF0aW9uS2V5JiBzb3VyY2UpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29tcGFyZSBpZiB0d28gY29sbGF0aW9uIGtleXMgYXJlIG5vdCB0aGUgc2FtZS4KICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIGNvbGxhdGlvbiBrZXkgdG8gY29tcGFyZSB0by4KICAgICAqIEByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHR3byBjb2xsYXRpb24ga2V5cyBhcmUgZGlmZmVyZW50LCBGQUxTRSBvdGhlcndpc2UuCiAgICAgKi8KICAgICBib29sX3QgICAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IENvbGxhdGlvbktleSYgc291cmNlKSBjb25zdDsKCgogICAgLyoqCiAgICAgKiBUZXN0IHRvIHNlZSBpZiB0aGUga2V5IGlzIGluIGFuIGludmFsaWQgc3RhdGUuIFRoZSBrZXkgd2lsbCBiZSBpbiBhbgogICAgICogaW52YWxpZCBzdGF0ZSBpZiBpdCBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNvbWUgb3BlcmF0aW9uLgogICAgICogQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgdGhlIGtleSBpcyBpbiBhbiBpbnZhbGlkLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgKi8KICAgICBib29sX3QgICAgICAgICAgICAgICAgICBpc0JvZ3VzKHZvaWQpIGNvbnN0OwoKICAgIC8qKiAKICAgICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb2xsYXRpb24ga2V5IHZhbHVlcy4gVGhlIHN0b3JhZ2UgaXMgb3duZWQKICAgICAqIGJ5IHRoZSBjb2xsYXRpb24ga2V5IGFuZCB0aGUgcG9pbnRlciB3aWxsIGJlY29tZSBpbnZhbGlkIGlmIHRoZSBrZXkKICAgICAqIGlzIGRlbGV0ZWQuCiAgICAgKiBAcGFyYW0gY291bnQgdGhlIG91dHB1dCBwYXJhbWV0ZXIgb2YgbnVtYmVyIG9mIGNvbGxhdGlvbiBrZXkgdmFsdWVzLAogICAgICogaW5jbHVkaW5nIGFueSB0cmFpbGluZyBudWxscy4KICAgICAqLwoJIGNvbnN0ICAgIHVpbnQ4X3QqICAgICAgICAgICAgICAgIGdldEJ5dGVBcnJheShpbnQzMl90JiBjb3VudCkgY29uc3Q7CgogICAgLyoqIAogICAgICogRXh0cmFjdHMgdGhlIGNvbGxhdGlvbiBrZXkgdmFsdWVzIGludG8gYSBuZXcgYXJyYXkuIFRoZSBjYWxsZXIgb3ducwogICAgICogdGhpcyBzdG9yYWdlIGFuZCBzaG91bGQgZnJlZSBpdC4KICAgICAqIEBwYXJhbSBjb3VudCB0aGUgb3V0cHV0IHBhcmFtZXRlciBvZiBudW1iZXIgb2YgY29sbGF0aW9uIGtleSB2YWx1ZXMsCiAgICAgKiBpbmNsdWRpbmcgYW55IHRyYWlsaW5nIG51bGxzLgogICAgICovCiAgICAgdWludDhfdCogICAgICAgICAgICAgICAgdG9CeXRlQXJyYXkoaW50MzJfdCYgY291bnQpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIGRvZXMgYSBzdHJpbmcoYml0LXdpc2UpIGNvbXBhcmlzb24gb2YgdGhlCiAgICAgKiB0d28gY29sbGF0aW9uIGtleXMuCiAgICAgKiBAcGFyYW0gc291cmNlS2V5IHNvdXJjZSBjb2xsYXRpb24ga2V5CiAgICAgKiBAcGFyYW0gdGFyZ2V0S2V5IHRhcmdldCBjb2xsYXRpb24ga2V5CiAgICAgKiBAcmV0dXJuIFJldHVybnMgQ29sbGF0b3I6OkxFU1MgaWYgc291cmNlS2V5ICZsdDsgdGFyZ2V0S2V5LCAKICAgICAqIENvbGxhdG9yOjpHUkVBVEVSIGlmIHNvdXJjZUtleSA+IHRhcmdldEtleSBhbmQgQ29sbGF0b3I6OkVRVUFMCiAgICAgKiBvdGhlcndpc2UuCiAgICAgKi8KICAgICBDb2xsYXRvcjo6RUNvbXBhcmlzb25SZXN1bHQgICAgY29tcGFyZVRvKGNvbnN0IENvbGxhdGlvbktleSYgdGFyZ2V0KSBjb25zdDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gaW50ZWdlciB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgY29sbGF0aW9uIGtleS4gIE5PVEU6IHRoaXMKICAgICAqIGlzIG5vdCB0aGUgc2FtZSBhcyBTdHJpbmcuaGFzaENvZGUuCiAgICAgKiA8cD5FeGFtcGxlIG9mIHVzZToKICAgICAqIDxwcmU+CiAgICAgKiAuICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgICogLiAgICBDb2xsYXRvciAqbXlDb2xsYXRpb24gPSBDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2UoTG9jYWxlOjpVUywgc3RhdHVzKTsKICAgICAqIC4gICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSByZXR1cm47CiAgICAgKiAuICAgIENvbGxhdGlvbktleSBrZXkxLCBrZXkyOwogICAgICogLiAgICBVRXJyb3JDb2RlIHN0YXR1czEgPSBVX1pFUk9fRVJST1IsIHN0YXR1czIgPSBVX1pFUk9fRVJST1I7CiAgICAgKiAuICAgIG15Q29sbGF0aW9uLT5nZXRDb2xsYXRpb25LZXkoImFiYyIsIGtleTEsIHN0YXR1czEpOwogICAgICogLiAgICBpZiAoVV9GQUlMVVJFKHN0YXR1czEpKSB7IGRlbGV0ZSBteUNvbGxhdGlvbjsgcmV0dXJuOyB9CiAgICAgKiAuICAgIG15Q29sbGF0aW9uLT5nZXRDb2xsYXRpb25LZXkoIkFCQyIsIGtleTIsIHN0YXR1czIpOwogICAgICogLiAgICBpZiAoVV9GQUlMVVJFKHN0YXR1czIpKSB7IGRlbGV0ZSBteUNvbGxhdGlvbjsgcmV0dXJuOyB9CiAgICAgKiAuICAgIC8vIGtleTEuaGFzaENvZGUoKSAhPSBrZXkyLmhhc2hDb2RlKCkKICAgICAqIDwvcHJlPgogICAgICogQHJldHVybiB0aGUgaGFzaCB2YWx1ZSBiYXNlZCBvbiB0aGUgc3RyaW5nJ3MgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHNlZSBVbmljb2RlU3RyaW5nI2hhc2hDb2RlCiAgICAgKi8KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBoYXNoQ29kZSh2b2lkKSBjb25zdDsKCnByaXZhdGU6CiAgICAvKioKICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY29sbGF0aW9uIGtleSB2YWx1ZXMgYXMgMTYtYml0IGludGVnZXJzLgogICAgKiBUaGUgY2FsbGVyIG93bnMgdGhlIHN0b3JhZ2UgYW5kIG11c3QgZGVsZXRlIGl0LgogICAgKiBAcGFyYW0gc2l6ZSBvdXRwdXQgcGFyYW1ldGVyIG9mIHRoZSBudW1iZXIgb2YgY29sbGF0aW9uIGtleSB2YWx1ZXMKICAgICogQHJldHVybiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMTYtYml0IGNvbGxhdGlvbiBrZXkgdmFsdWVzLgogICAgKi8KICAgICAgICAgICAgdWludDE2X3QqICAgICAgICAgICAgICAgY29weVZhbHVlcyhpbnQzMl90ICZzaXplKSBjb25zdDsKCiAgICAvKgogICAgICogQ3JlYXRlcyBhIGNvbGxhdGlvbiBrZXkgd2l0aCBhIHN0cmluZy4KICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25LZXkoY29uc3QgVW5pY29kZVN0cmluZyYgdmFsdWUpOwoKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgc3RvcmVCeXRlcyhpbnQzMl90IGN1cnNvciwgdWludDMyX3QgYnl0ZVZhbHVlKTsKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgc3RvcmVVbmljb2RlU3RyaW5nKGludDMyX3QgY3Vyc29yLCBjb25zdCBVbmljb2RlU3RyaW5nICZ2YWx1ZSk7CiAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHJldmVyc2VCeXRlcyhpbnQzMl90IGZyb20sIGludDMyX3QgdG8pOwogICAgICAgICAgICBDb2xsYXRpb25LZXkmICAgICAgICAgICBlbnN1cmVDYXBhY2l0eShpbnQzMl90IG5ld1NpemUpOwogICAgICAgICAgICBDb2xsYXRpb25LZXkmICAgICAgICAgICBjb3B5VW5pY29kZVN0cmluZyhjb25zdCBVbmljb2RlU3RyaW5nICZ2YWx1ZSk7CiAgICAgICAgICAgIENvbGxhdGlvbktleSYgICAgICAgICAgIHNldFRvQm9ndXModm9pZCk7CiAgICAgICAgICAgIENvbGxhdGlvbktleSYgICAgICAgICAgIHJlc2V0KHZvaWQpOwoKICAgIGZyaWVuZCAgY2xhc3MgICAgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3I7CgogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrSW52YWxpZEhhc2hDb2RlOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrRW1wdHlIYXNoQ29kZTsKCiAgICAgICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgIGZCb2d1czsKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgZkNvdW50OwogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBmQ2FwYWNpdHk7CiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIGZIYXNoQ29kZTsKICAgICAgICAgICAgdWludDhfdCogICAgICAgICAgICAgICAgZkJ5dGVzOwp9OwoKaW5saW5lIGJvb2xfdApDb2xsYXRpb25LZXk6Om9wZXJhdG9yIT0oY29uc3QgQ29sbGF0aW9uS2V5JiBvdGhlcikgY29uc3QKewogICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwp9CgppbmxpbmUgYm9vbF90CkNvbGxhdGlvbktleTo6aXNCb2d1cygpIGNvbnN0CnsKICAgIHJldHVybiBmQm9ndXM7Cn0KCmlubGluZSBjb25zdCB1aW50OF90KgpDb2xsYXRpb25LZXk6OmdldEJ5dGVBcnJheShpbnQzMl90ICZjb3VudCkgY29uc3QKewogICAgY291bnQgPSBmQ291bnQ7CiAgICByZXR1cm4gZkJ5dGVzOwp9CgppbmxpbmUgVVRleHRPZmZzZXQKQ29sbGF0aW9uS2V5OjpzdG9yZUJ5dGVzKFVUZXh0T2Zmc2V0IGN1cnNvciwgdWludDMyX3QgYnl0ZVZhbHVlKQp7CiAgICBmQnl0ZXNbY3Vyc29yKytdID0gKHVpbnQ4X3QpIChieXRlVmFsdWUgPj4gOCk7CiAgICBmQnl0ZXNbY3Vyc29yKytdID0gKHVpbnQ4X3QpIGJ5dGVWYWx1ZTsKCiAgICByZXR1cm4gY3Vyc29yOwp9CgojZW5kaWYK