Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
A140F75A532940A1C50B53EE72751616D60693BC1C06300DC3ABFF312EC9AA1A

Transaction overview

Status
Success
Execution completed
Block
#77253
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
1
Position in block
GAS WANTED
119,121,182
Requested gas limit
GAS USED
99,267,691
Gas consumed
FEE
119122ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CrjVBAoML3ZtLm1fYWRkcGtnEqbVBAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBL41AQKDHByb3RvY29sX2ZlZRIfZ25vLmxhbmQvci9nbm9zd2FwL3Byb3RvY29sX2ZlZRrzFgoJUkVBRE1FLm1kEuUWIyBQcm90b2NvbCBGZWUKCkZlZSBjb2xsZWN0aW9uIGFuZCBkaXN0cmlidXRpb24gZm9yIHByb3RvY29sIG9wZXJhdGlvbnMuCgojIyBPdmVydmlldwoKVGhlIHByb3RvY29sLWZlZSBjb250cmFjdCBjb2xsZWN0cyBhdXRob3JpemVkIGZlZXMgZnJvbSBwcm90b2NvbCBvcGVyYXRpb25zIGFuZApkaXN0cmlidXRlcyB0aGVtIHRvIEdvdlN0YWtlciBhbmQgRGV2T3BzIGFjY29yZGluZyB0byBjb25maWd1cmVkIHBlcmNlbnRhZ2VzLgoKIyMgR25vd2ViCgpUaGUgcm9vdCBgUmVuZGVyKCIiKWAgZGVsZWdhdGVzIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gYW5kIHNob3dzIHJlYWxtIGlkZW50aXR5LCBkaXN0cmlidXRpb24gYWxsb2NhdGlvbnMgaW4gYmFzaXMgcG9pbnRzLCByZWNpcGllbnQgYWRkcmVzc2VzLCB0aGUgYWNjcnVhbCBlcG9jaCwgYW5kIGhhbHQgZmxhZ3MuCgpSZW5kZXJpbmcgcmVhZHMgZml4ZWQgY29uZmlndXJhdGlvbiB3aXRob3V0IGFnZ3JlZ2F0aW5nIGJhbGFuY2VzIGFjcm9zcyB0b2tlbnMuIFVuc3VwcG9ydGVkIHBhdGhzIHJldHVybiBgNDA0YC4KCiMjIENvbmZpZ3VyYXRpb24KCi0gKipSb3V0ZXIgRmVlIChpbml0aWFsL2RlZmF1bHQpKio6IDAuMTUlIG9mIHRoZSBzd2FwIGFtb3VudDsgY29uZmlndXJlZCBieSB0aGUgcm91dGVyLCB3aXRoIGFuIGFkbWluLW9yLWdvdmVybmFuY2UgcmFuZ2Ugb2YgMOKAkzEwJQotICoqUG9vbCBDcmVhdGlvbiBGZWUgKGluaXRpYWwvZGVmYXVsdCkqKjogMTAwIEdOUzsgY29uZmlndXJlZCBieSB0aGUgcG9vbCBhbmQgbW9kaWZpYWJsZSB0aHJvdWdoIGdvdmVybmFuY2UKLSAqKldpdGhkcmF3YWwgRmVlIChpbml0aWFsL2RlZmF1bHQpKio6IDElIG9mIExQIGZlZXMgY2xhaW1lZDsgY29uZmlndXJlZCBieSB0aGUgcG9vbCBhbmQgbW9kaWZpYWJsZSB0aHJvdWdoIGdvdmVybmFuY2UKLSAqKlVuc3Rha2luZyBGZWUgKGluaXRpYWwvZGVmYXVsdCkqKjogMSUgb2Ygc3Rha2luZyByZXdhcmRzOyBjb25maWd1cmVkIGJ5IHRoZSBzdGFrZXIgYW5kIG1vZGlmaWFibGUgYnkgYWRtaW4gb3IgZ292ZXJuYW5jZQotICoqRGlzdHJpYnV0aW9uIChkZWZhdWx0KSoqOiAxMDAlIHRvIEdvdlN0YWtlciBhbmQgMCUgdG8gRGV2T3BzCgpUaGUgb3BlcmF0aW9uLXNwZWNpZmljIGZlZXMgYWJvdmUgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlaXIgb3duaW5nIG1vZHVsZXM7IHRoZXkKYXJlIG5vdCBwcm90b2NvbC1mZWUgZGlzdHJpYnV0aW9uIHBlcmNlbnRhZ2VzLgoKIyMgRmVlIFNvdXJjZXMKCjEuICoqU3dhcHMqKjogVGhlIHJvdXRlciBhcHBsaWVzIGl0cyBjb25maWd1cmVkIHN3YXAgZmVlICgwLjE1JSBpbml0aWFsbHkpLgoyLiAqKlBvb2wgQ3JlYXRpb24qKjogVGhlIHBvb2wgY2hhcmdlcyBpdHMgY29uZmlndXJlZCBjcmVhdGlvbiBmZWUgKDEwMCBHTlMgaW5pdGlhbGx5KS4KMy4gKipMUCBXaXRoZHJhd2FscyoqOiBUaGUgcG9vbCBjaGFyZ2VzIGl0cyBjb25maWd1cmVkIHdpdGhkcmF3YWwgZmVlICgxJSBpbml0aWFsbHkpLgo0LiAqKlN0YWtpbmcgQ2xhaW1zKio6IFRoZSBzdGFrZXIgY2hhcmdlcyBpdHMgY29uZmlndXJlZCB1bnN0YWtpbmcgZmVlICgxJSBpbml0aWFsbHkpLgoKIyMgS2V5IEZ1bmN0aW9ucwoKIyMjIGBEaXN0cmlidXRlUHJvdG9jb2xGZWVgCkRpc3RyaWJ1dGVzIGFjY3VtdWxhdGVkIGZlZXMgdG8gcmVjaXBpZW50cy4KCiMjIyBgU2V0RGV2T3BzUGN0YApTZXRzIHRoZSBEZXZPcHMgZnVuZGluZyBwZXJjZW50YWdlLgoKIyMjIGBTZXRHb3ZTdGFrZXJQY3RgClNldHMgdGhlIEdvdlN0YWtlciBmdW5kaW5nIHBlcmNlbnRhZ2UuCgojIyMgYEFkZFRvUHJvdG9jb2xGZWVgCkFkZHMgYW4gYXBwcm92ZWQgZmVlIGFtb3VudCB0byB0aGUgZGlzdHJpYnV0aW9uIHF1ZXVlLgoKIyMjIGBBZHZhbmNlQWNjcnVhbEVwb2NoYApDbG9zZXMgdGhlIGFjY3J1YWwgZXBvY2ggaW4gZm9yY2UgYW5kIHJldHVybnMgdGhlIG5ldyBvbmUuIENhbGxlZCBieSBnb3Yvc3Rha2VyIG9uIGV2ZXJ5IHN0YWtlIGNoYW5nZSwgc28gZmVlcyBhcmUgYXR0cmlidXRlZCB0byB0aGUgc3Rha2UgZGlzdHJpYnV0aW9uIGxpdmUgd2hlbiB0aGV5IGFycml2ZWQuCgojIyMgYENvbnN1bWVBY2NydWFsQnVja2V0c2AKUmV0dXJucyBhbmQgY2xlYXJzIHVwIHRvIGBsaW1pdGAgb2YgdGhlIG9sZGVzdCBwZW5kaW5nIGJ1Y2tldHMgb2Ygb25lIHRva2VuLCBhcyBwYXJhbGxlbCBlcG9jaCBhbmQgYW1vdW50IHNsaWNlcy4gQ2FsbGVkIGJ5IGdvdi9zdGFrZXIgd2hlbiB0aGF0IHRva2VuIGlzIGNvbGxlY3RlZC4KCiMjIFVzYWdlCgpgYGBnbwovLyBEaXN0cmlidXRlIGFjY3VtdWxhdGVkIGZlZXMKRGlzdHJpYnV0ZVByb3RvY29sRmVlKGNyb3NzKGN1cikpCgovLyBDb25maWd1cmUgZGlzdHJpYnV0aW9uClNldERldk9wc1BjdChjcm9zcyhjdXIpLCAyMDAwKSAgICAgLy8gMjAlIHRvIERldk9wcwpTZXRHb3ZTdGFrZXJQY3QoY3Jvc3MoY3VyKSwgODAwMCkgIC8vIDgwJSB0byBHb3ZTdGFrZXIKCi8vIFZpZXcgdG9rZW5zIHJlc2VydmVkIGZvciB0aGUgbmV4dCBkaXN0cmlidXRpb24KR2V0UmVzZXJ2ZWRUb2tlbnMoKQoKLy8gVmlldyB3aGF0IGdvdi9zdGFrZXIgaGFzIG5vdCBmb2xkZWQgeWV0CkdldEFjY3J1YWxFcG9jaCgpCkdldEFjY3J1YWxQZW5kaW5nVG9rZW5zKCkKR2V0QWNjcnVhbEJ1Y2tldHModG9rZW5QYXRoLCAwKQpgYGAKCiMjIFNlY3VyaXR5CgotIENvbmZpZ3VyYXRpb24gY2hhbmdlcyBhcmUgcmVzdHJpY3RlZCB0byBhZG1pbiBvciBnb3Zlcm5hbmNlOyBkaXN0cmlidXRpb24gaXMgcmVzdHJpY3RlZCB0byBhZG1pbiBvciBnb3Yvc3Rha2VyCi0gQXV0b21hdGljIGZlZSBhY2N1bXVsYXRpb24KLSBNdWx0aS10b2tlbiBzdXBwb3J0Ci0gVHJhbnNwYXJlbnQgZGlzdHJpYnV0aW9uIHRyYWNraW5nChqNCQoHZG9jLmdubxKBCS8vIFBhY2thZ2UgcHJvdG9jb2xfZmVlIG1hbmFnZXMgZmVlIGNvbGxlY3Rpb24gYW5kIGRpc3RyaWJ1dGlvbiBmb3IgR25vU3dhcCBwcm90b2NvbCBvcGVyYXRpb25zLgovLwovLyBUaGlzIGNvbnRyYWN0IGNvbGxlY3RzIGF1dGhvcml6ZWQgZmVlcyBmcm9tIHByb3RvY29sIG9wZXJhdGlvbnMgc3VjaCBhcyBzd2FwcywKLy8gcG9vbCBjcmVhdGlvbiwgd2l0aGRyYXdhbHMsIGFuZCBzdGFraW5nIGNsYWltcywgdGhlbiBhY2NvdW50cyBmb3IgdGhlaXIKLy8gZGlzdHJpYnV0aW9uIHRvIERldk9wcyBhbmQgR292U3Rha2VyIGFjY29yZGluZyB0byBjb25maWd1cmFibGUgcGVyY2VudGFnZXMuCi8vCi8vIERpc3RyaWJ1dGlvbiBUYXJnZXRzOgovLyAgIC0gRGV2T3BzOiBEZXZlbG9wbWVudCBhbmQgb3BlcmF0aW9ucyBmdW5kIChkZWZhdWx0IDAlKQovLyAgIC0gR292U3Rha2VyOiBHb3Zlcm5hbmNlLXN0YWtlciBkZXN0aW5hdGlvbiAoZGVmYXVsdCAxMDAlKQovLwovLyBBY2NvdW50aW5nOgovLyAgIC0gcmVzZXJ2ZWRUb2tlbnMgdHJhY2tzIHRva2VuIHBhdGhzIHdpdGggY29sbGVjdGVkIGZlZXMgYXdhaXRpbmcgZGlzdHJpYnV0aW9uLgovLyAgIC0gUGVyLXRva2VuIGFsbG9jYXRpb24gYWNjdW11bGF0b3JzIGFuZCBkaXN0cmlidXRpb24taGlzdG9yeSB0cmVlcyBkaXN0aW5ndWlzaAovLyAgICAgYW1vdW50cyBhbGxvY2F0ZWQgZnJvbSBhbW91bnRzIGFjdHVhbGx5IHRyYW5zZmVycmVkLgovLyAgIC0gR292U3Rha2VyIGFsbG9jYXRpb25zIGFyZSBidWNrZXRlZCBieSB0b2tlbiBwYXRoIGFuZCBhY2NydWFsIGVwb2NoLgovLwovLyBLZXkgRnVuY3Rpb25zOgovLyAgIC0gRGlzdHJpYnV0ZVByb3RvY29sRmVlOiBEaXN0cmlidXRlcyBhY2N1bXVsYXRlZCBmZWVzIHRvIHJlY2lwaWVudHMKLy8gICAtIFNldERldk9wc1BjdC9TZXRHb3ZTdGFrZXJQY3Q6IENvbmZpZ3VyZSBkaXN0cmlidXRpb24gcGVyY2VudGFnZXMKLy8gICAtIEFkZFRvUHJvdG9jb2xGZWU6IFB1bGxzIGFuIGFwcHJvdmVkIGZlZSBpbnRvIHRoZSBkaXN0cmlidXRpb24gcXVldWUKLy8KLy8gVGhlIGNvbnRyYWN0IHVzZXMgYSB2ZXJzaW9uIG1hbmFnZXIgcGF0dGVybiBmb3IgdXBncmFkZWFibGUgaW1wbGVtZW50YXRpb25zLgpwYWNrYWdlIHByb3RvY29sX2ZlZQoazAMKCmdldHRlci5nbm8SvQNwYWNrYWdlIHByb3RvY29sX2ZlZQoKLy8gR2V0RG9tYWluUGF0aCByZXR1cm5zIHRoZSBkb21haW4gcGF0aCBvZiB0aGUgcHJvdG9jb2wgZmVlIGNvbnRyYWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZG9tYWluUGF0aDogcHJvdG9jb2wgZmVlIGNvbnRyYWN0IGRvbWFpbiBwYXRoCmZ1bmMgR2V0RG9tYWluUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gZG9tYWluUGF0aAp9CgovLyBHZXRWZXJzaW9uUGFja2FnZVBhdGggcmV0dXJucyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBwYWNrYWdlIHBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwYWNrYWdlUGF0aDogY3VycmVudCBpbXBsZW1lbnRhdGlvbiBwYWNrYWdlIHBhdGgKZnVuYyBHZXRWZXJzaW9uUGFja2FnZVBhdGgoKSBzdHJpbmcgewoJcmV0dXJuIHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRQYWNrYWdlUGF0aCgpCn0KGpoEChBnZXR0ZXJfdXRpbHMuZ25vEoUEcGFja2FnZSBwcm90b2NvbF9mZWUKCmZ1bmMgY2xvbmVTdHJpbmdJbnQ2NE1hcChzcmMgbWFwW3N0cmluZ11pbnQ2NCkgbWFwW3N0cmluZ11pbnQ2NCB7CglpZiBzcmMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJZHN0IDo9IG1ha2UobWFwW3N0cmluZ11pbnQ2NCwgbGVuKHNyYykpCglmb3Iga2V5LCB2YWx1ZSA6PSByYW5nZSBzcmMgewoJCWRzdFtrZXldID0gdmFsdWUKCX0KCglyZXR1cm4gZHN0Cn0KCmZ1bmMgY2xvbmVTdHJpbmdTbGljZShzcmMgW11zdHJpbmcpIFtdc3RyaW5nIHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglkc3QgOj0gbWFrZShbXXN0cmluZywgbGVuKHNyYykpCgljb3B5KGRzdCwgc3JjKQoJcmV0dXJuIGRzdAp9CgpmdW5jIGNsb25lSW50NjRTbGljZShzcmMgW11pbnQ2NCkgW11pbnQ2NCB7CglpZiBzcmMgPT0gbmlsIHsKCQlyZXR1cm4gbmlsCgl9CgoJZHN0IDo9IG1ha2UoW11pbnQ2NCwgbGVuKHNyYykpCgljb3B5KGRzdCwgc3JjKQoJcmV0dXJuIGRzdAp9ChpGCgtnbm9tb2QudG9tbBI3bW9kdWxlID0gImduby5sYW5kL3IvZ25vc3dhcC9wcm90b2NvbF9mZWUiCmdubyA9ICIwLjkiChqARgoJcHJveHkuZ25vEvJFcGFja2FnZSBwcm90b2NvbF9mZWUKCi8vIERpc3RyaWJ1dGVQcm90b2NvbEZlZSBkaXN0cmlidXRlcyBhY2N1bXVsYXRlZCBwcm90b2NvbCBmZWVzIHRvIERldk9wcyBhbmQKLy8gR292U3Rha2VyLCBzdWJqZWN0IHRvIHRoZSBpbXBsZW1lbnRhdGlvbidzIGNhbGxlciBhdXRob3JpemF0aW9uIGFuZCBoYWx0IGNoZWNrcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLwovLyBIYWx0IGNoZWNrOiByZXR1cm5zIHdpdGhvdXQgZGlzdHJpYnV0aW5nIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBEaXN0cmlidXRlUHJvdG9jb2xGZWUoY3VyIHJlYWxtKSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLkRpc3RyaWJ1dGVQcm90b2NvbEZlZSgwLCBjdXIpCn0KCi8vIERpc3RyaWJ1dGVQcm90b2NvbEZlZUJ5VG9rZW5QYXRoIGRpc3RyaWJ1dGVzIGFjY3VtdWxhdGVkIHByb3RvY29sIGZlZXMgcmVzZXJ2ZWQKLy8gZm9yIG9uZSB0b2tlbiBwYXRoOyBhbiB1bnJlc2VydmVkIHBhdGggaGFzIG5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHJlc2VydmVkIGZlZSBiYWxhbmNlIHNob3VsZCBiZSBkaXN0cmlidXRlZAovLwovLyBIYWx0IGNoZWNrOiByZXR1cm5zIHdpdGhvdXQgZGlzdHJpYnV0aW5nIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBEaXN0cmlidXRlUHJvdG9jb2xGZWVCeVRva2VuUGF0aChjdXIgcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuRGlzdHJpYnV0ZVByb3RvY29sRmVlQnlUb2tlblBhdGgoMCwgY3VyLCB0b2tlblBhdGgpCn0KCi8vIFNldERldk9wc1BjdCBzZXRzIHRoZSBzaGFyZSBvZiBwcm90b2NvbCBmZWVzIGFsbG9jYXRlZCB0byBEZXZPcHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHBjdDogRGV2T3BzIGFsbG9jYXRpb24gaW4gYmFzaXMtcG9pbnQgdW5pdHMsIGZyb20gMCB0aHJvdWdoIDEwMDAwIGluY2x1c2l2ZSAoMTAwMDAgPSAxMDAlKQovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBQcm90b2NvbEZlZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBTZXREZXZPcHNQY3QoY3VyIHJlYWxtLCBwY3QgaW50NjQpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuU2V0RGV2T3BzUGN0KDAsIGN1ciwgcGN0KQp9CgovLyBTZXRHb3ZTdGFrZXJQY3Qgc2V0cyB0aGUgc2hhcmUgb2YgcHJvdG9jb2wgZmVlcyBhbGxvY2F0ZWQgdG8gR292U3Rha2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwY3Q6IEdvdlN0YWtlciBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzLCBmcm9tIDAgdGhyb3VnaCAxMDAwMCBpbmNsdXNpdmUgKDEwMDAwID0gMTAwJSkKLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgUHJvdG9jb2xGZWUgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgU2V0R292U3Rha2VyUGN0KGN1ciByZWFsbSwgcGN0IGludDY0KSB7CglnZXRJbXBsZW1lbnRhdGlvbigpLlNldEdvdlN0YWtlclBjdCgwLCBjdXIsIHBjdCkKfQoKLy8gQWRkVG9Qcm90b2NvbEZlZSBwdWxscyBhbiBhcHByb3ZlZCBmZWUgYW1vdW50IGZyb20gYW4gYXV0aG9yaXplZCBwcm90b2NvbCBjYWxsZXIKLy8gaW50byBwcm90b2NvbC1mZWUgYWNjb3VudGluZy4gQXV0aG9yaXplZCBjYWxsZXJzIGFyZSBwb29sLCBwb3NpdGlvbiwgcm91dGVyLAovLyBhbmQgc3Rha2VyIHJlYWxtczsgZGlyZWN0IHRyYW5zZmVycyB0byB0aGlzIGFkZHJlc3MgZG8gbm90IHJlZ2lzdGVyIGEgZmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgZmVlIGlzIGJlaW5nIGNvbGxlY3RlZAovLyAgIC0gYW1vdW50OiBub24tbmVnYXRpdmUgZmVlIGFtb3VudCBpbiB0aGUgdG9rZW4ncyBiYXNlIHVuaXRzOyB6ZXJvIHBlcmZvcm1zIG5vIHRyYW5zZmVyCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCBvbiBzdWNjZXNzOyBlcnJTcG9vZmVkUmVhbG0gZm9yIGEgc3Bvb2ZlZC1yZWFsbSBjYWxsOyBlcnJQcm90b2NvbEZlZUhhbHRlZCB3aGVuIHByb3RvY29sLWZlZSBjb2xsZWN0aW9uIGlzIGhhbHRlZAovLwovLyBIYWx0IGNoZWNrOiByZXR1cm5zIGVyclByb3RvY29sRmVlSGFsdGVkIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHdoaWxlIHRoZSBQcm90b2NvbEZlZSBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBBZGRUb1Byb3RvY29sRmVlKGN1ciByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5BZGRUb1Byb3RvY29sRmVlKDAsIGN1ciwgdG9rZW5QYXRoLCBhbW91bnQpCn0KCi8vIEFkdmFuY2VBY2NydWFsRXBvY2ggY2xvc2VzIHRoZSBjdXJyZW50IGFjY3J1YWwgZXBvY2ggYW5kIHJldHVybnMgdGhlIG5ldyBvbmUuIEZlZXMKLy8gYXJyaXZpbmcgZnJvbSBub3cgb24gYXJlIGJ1Y2tldGVkIHVuZGVyIHRoZSByZXR1cm5lZCBlcG9jaC4gT25seSBnb3Yvc3Rha2VyIG1heSBjYWxsCi8vIGl0LCBvbiBldmVyeSBzdGFrZSBjaGFuZ2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVwb2NoOiBuZXdseSBhY3RpdmUgbm9uLW5lZ2F0aXZlIGFjY3J1YWwgZXBvY2ggdXNlZCBmb3Igc3Vic2VxdWVudGx5IGNvbGxlY3RlZCBHb3ZTdGFrZXIgZmVlcwpmdW5jIEFkdmFuY2VBY2NydWFsRXBvY2goY3VyIHJlYWxtKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5BZHZhbmNlQWNjcnVhbEVwb2NoKDAsIGN1cikKfQoKLy8gQ29uc3VtZUFjY3J1YWxCdWNrZXRzIHJldHVybnMgYW5kIGNsZWFycyB1cCB0byBsaW1pdCBvZiB0aGUgb2xkZXN0IHBlbmRpbmcgYnVja2V0cwovLyBvZiB0b2tlblBhdGggYXMgcGFyYWxsZWwgZXBvY2ggYW5kIGFtb3VudCBzbGljZXMuIEEgbGltaXQgb2YgemVybyBvciBsZXNzIGNvbnN1bWVzCi8vIGV2ZXJ5IHBlbmRpbmcgYnVja2V0LiBPbmx5IGdvdi9zdGFrZXIgbWF5IGNhbGwgaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBwZW5kaW5nIEdvdlN0YWtlciBhY2NydWFsIGJ1Y2tldHMgYXJlIGNvbnN1bWVkCi8vICAgLSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2Ygb2xkZXN0IGJ1Y2tldHMgdG8gY29uc3VtZTsgemVybyBvciBuZWdhdGl2ZSBjb25zdW1lcyBhbGwgcGVuZGluZyBidWNrZXRzCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcG9jaHM6IGNvbnN1bWVkIGFjY3J1YWwgZXBvY2ggbnVtYmVycyBpbiBhc2NlbmRpbmcgZXBvY2ggb3JkZXIKLy8gICAtIGFtb3VudHM6IEdvdlN0YWtlciBmZWUgYW1vdW50cyBjb3JyZXNwb25kaW5nIHBvc2l0aW9uYWxseSB0byBlcG9jaHMsIGluIHRva2VuIGJhc2UgdW5pdHMKZnVuYyBDb25zdW1lQWNjcnVhbEJ1Y2tldHMoY3VyIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBsaW1pdCBpbnQpIChbXWludDY0LCBbXWludDY0KSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5Db25zdW1lQWNjcnVhbEJ1Y2tldHMoMCwgY3VyLCB0b2tlblBhdGgsIGxpbWl0KQp9CgovLyBHZXREZXZPcHNQY3QgcmV0dXJucyB0aGUgRGV2T3BzIGZlZSBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGN0OiBjb25maWd1cmVkIERldk9wcyBhbGxvY2F0aW9uIGZyb20gMCB0aHJvdWdoIDEwMDAwICgxMDAwMCA9IDEwMCUpCmZ1bmMgR2V0RGV2T3BzUGN0KCkgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGV2T3BzUGN0KCkKfQoKLy8gR2V0R292U3Rha2VyUGN0IHJldHVybnMgdGhlIEdvdlN0YWtlciBmZWUgYWxsb2NhdGlvbiBpbiBiYXNpcy1wb2ludCB1bml0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBjdDogY29uZmlndXJlZCBHb3ZTdGFrZXIgYWxsb2NhdGlvbiBmcm9tIDAgdGhyb3VnaCAxMDAwMCAoMTAwMDAgPSAxMDAlKQpmdW5jIEdldEdvdlN0YWtlclBjdCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEdvdlN0YWtlclBjdCgpCn0KCi8vIEdldEFjY3J1YWxFcG9jaCByZXR1cm5zIHRoZSBhY2NydWFsIGVwb2NoIGZlZXMgYXJlIGN1cnJlbnRseSBidWNrZXRlZCB1bmRlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVwb2NoOiBjdXJyZW50IG5vbi1uZWdhdGl2ZSBhY2NydWFsIGVwb2NoIGFzc2lnbmVkIHRvIG5ld2x5IGNvbGxlY3RlZCBHb3ZTdGFrZXIgZmVlcwpmdW5jIEdldEFjY3J1YWxFcG9jaCgpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEFjY3J1YWxFcG9jaCgpCn0KCi8vIEdldEFjY3J1YWxQZW5kaW5nVG9rZW5zIHJldHVybnMgdGhlIHRva2VuIHBhdGhzIHRoYXQgc3RpbGwgb3duIHBlbmRpbmcgYWNjcnVhbCBidWNrZXRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5QYXRoczogdG9rZW4gY29udHJhY3QgcGF0aHMgd2l0aCBhdCBsZWFzdCBvbmUgcGVuZGluZyBHb3ZTdGFrZXIgYWNjcnVhbCBidWNrZXQKZnVuYyBHZXRBY2NydWFsUGVuZGluZ1Rva2VucygpIFtdc3RyaW5nIHsKCXJldHVybiBjbG9uZVN0cmluZ1NsaWNlKGdldEltcGxlbWVudGF0aW9uKCkuR2V0QWNjcnVhbFBlbmRpbmdUb2tlbnMoKSkKfQoKLy8gR2V0QWNjcnVhbEJ1Y2tldHMgcmV0dXJucyB1cCB0byBsaW1pdCBvZiB0aGUgb2xkZXN0IHBlbmRpbmcgYnVja2V0cyBvZiB0b2tlblBhdGgKLy8gd2l0aG91dCBjbGVhcmluZyB0aGVtLiBBIGxpbWl0IG9mIHplcm8gb3IgbGVzcyByZXR1cm5zIGV2ZXJ5IHBlbmRpbmcgYnVja2V0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIHBlbmRpbmcgR292U3Rha2VyIGFjY3J1YWwgYnVja2V0cyBhcmUgcXVlcmllZAovLyAgIC0gbGltaXQ6IG1heGltdW0gbnVtYmVyIG9mIG9sZGVzdCBidWNrZXRzIHRvIHJldHVybjsgemVybyBvciBuZWdhdGl2ZSByZXR1cm5zIGFsbCBwZW5kaW5nIGJ1Y2tldHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGVwb2Noczogc2VsZWN0ZWQgYWNjcnVhbCBlcG9jaCBudW1iZXJzIGluIGFzY2VuZGluZyBlcG9jaCBvcmRlcgovLyAgIC0gYW1vdW50czogR292U3Rha2VyIGZlZSBhbW91bnRzIGNvcnJlc3BvbmRpbmcgcG9zaXRpb25hbGx5IHRvIGVwb2NocywgaW4gdG9rZW4gYmFzZSB1bml0cwpmdW5jIEdldEFjY3J1YWxCdWNrZXRzKHRva2VuUGF0aCBzdHJpbmcsIGxpbWl0IGludCkgKFtdaW50NjQsIFtdaW50NjQpIHsKCWVwb2NocywgYW1vdW50cyA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEFjY3J1YWxCdWNrZXRzKHRva2VuUGF0aCwgbGltaXQpCglyZXR1cm4gY2xvbmVJbnQ2NFNsaWNlKGVwb2NocyksIGNsb25lSW50NjRTbGljZShhbW91bnRzKQp9CgovLyBHZXRSZXNlcnZlZFRva2VucyByZXR1cm5zIHRva2VuIHBhdGhzIHJlc2VydmVkIGZvciBkaXN0cmlidXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGhzOiB0b2tlbiBwYXRocyByZXNlcnZlZCBmb3IgZGlzdHJpYnV0aW9uCmZ1bmMgR2V0UmVzZXJ2ZWRUb2tlbnMoKSBbXXN0cmluZyB7CglyZXR1cm4gY2xvbmVTdHJpbmdTbGljZShnZXRJbXBsZW1lbnRhdGlvbigpLkdldFJlc2VydmVkVG9rZW5zKCkpCn0KCi8vIEdldEFjY3VUcmFuc2ZlcnNUb0dvdlN0YWtlciByZXR1cm5zIGFjY3VtdWxhdGVkIHRyYW5zZmVycyB0byBHb3ZTdGFrZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmFuc2ZlcnM6IG1hcCBvZiB0b2tlbiBwYXRocyB0byBhY2N1bXVsYXRlZCBhbW91bnRzCmZ1bmMgR2V0QWNjdVRyYW5zZmVyc1RvR292U3Rha2VyKCkgbWFwW3N0cmluZ11pbnQ2NCB7CglyZXR1cm4gY2xvbmVTdHJpbmdJbnQ2NE1hcChnZXRJbXBsZW1lbnRhdGlvbigpLkdldEFjY3VUcmFuc2ZlcnNUb0dvdlN0YWtlcigpKQp9CgovLyBHZXRBY2N1VHJhbnNmZXJzVG9EZXZPcHMgcmV0dXJucyBhY2N1bXVsYXRlZCB0cmFuc2ZlcnMgdG8gRGV2T3BzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJhbnNmZXJzOiBtYXAgb2YgdG9rZW4gcGF0aHMgdG8gYWNjdW11bGF0ZWQgYW1vdW50cwpmdW5jIEdldEFjY3VUcmFuc2ZlcnNUb0Rldk9wcygpIG1hcFtzdHJpbmddaW50NjQgewoJcmV0dXJuIGNsb25lU3RyaW5nSW50NjRNYXAoZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRBY2N1VHJhbnNmZXJzVG9EZXZPcHMoKSkKfQoKLy8gR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCByZXR1cm5zIGFjY3VtdWxhdGVkIEdvdlN0YWtlciB0cmFuc2ZlciBmb3IgYSB0b2tlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogcGF0aCBvZiB0aGUgdG9rZW4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogYWNjdW11bGF0ZWQgdHJhbnNmZXIgYW1vdW50CmZ1bmMgR2V0QWNjdVRyYW5zZmVyVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRBY2N1VHJhbnNmZXJUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHRva2VuUGF0aCkKfQoKLy8gR2V0QWNjdVRyYW5zZmVyVG9EZXZPcHNCeVRva2VuUGF0aCByZXR1cm5zIGFjY3VtdWxhdGVkIERldk9wcyB0cmFuc2ZlciBmb3IgYSB0b2tlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogcGF0aCBvZiB0aGUgdG9rZW4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogYWNjdW11bGF0ZWQgdHJhbnNmZXIgYW1vdW50CmZ1bmMgR2V0QWNjdVRyYW5zZmVyVG9EZXZPcHNCeVRva2VuUGF0aCh0b2tlblBhdGggc3RyaW5nKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRBY2N1VHJhbnNmZXJUb0Rldk9wc0J5VG9rZW5QYXRoKHRva2VuUGF0aCkKfQoKLy8gR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlciByZXR1cm5zIGFjdHVhbCB0cmFuc2ZlcnMgY29tcGxldGVkIHRvIEdvdlN0YWtlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyYW5zZmVyczogbWFwIG9mIHRva2VuIHBhdGhzIHRvIGFjdHVhbCBkaXN0cmlidXRlZCBhbW91bnRzCmZ1bmMgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigpIG1hcFtzdHJpbmddaW50NjQgewoJcmV0dXJuIGNsb25lU3RyaW5nSW50NjRNYXAoZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyKCkpCn0KCi8vIEdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHMgcmV0dXJucyBhY3R1YWwgdHJhbnNmZXJzIGNvbXBsZXRlZCB0byBEZXZPcHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmFuc2ZlcnM6IG1hcCBvZiB0b2tlbiBwYXRocyB0byBhY3R1YWwgZGlzdHJpYnV0ZWQgYW1vdW50cwpmdW5jIEdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHMoKSBtYXBbc3RyaW5nXWludDY0IHsKCXJldHVybiBjbG9uZVN0cmluZ0ludDY0TWFwKGdldEltcGxlbWVudGF0aW9uKCkuR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wcygpKQp9CgovLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyQnlUb2tlblBhdGggcmV0dXJucyBhY3R1YWwgR292U3Rha2VyIHRyYW5zZmVyIGZvciBhIHRva2VuLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBwYXRoIG9mIHRoZSB0b2tlbgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBhY3R1YWwgZGlzdHJpYnV0ZWQgYW1vdW50IGZvciB0aGUgdG9rZW4KZnVuYyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvR292U3Rha2VyQnlUb2tlblBhdGgodG9rZW5QYXRoIHN0cmluZykgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHRva2VuUGF0aCkKfQoKLy8gR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wc0J5VG9rZW5QYXRoIHJldHVybnMgYWN0dWFsIERldk9wcyB0cmFuc2ZlciBmb3IgYSB0b2tlbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogcGF0aCBvZiB0aGUgdG9rZW4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogYWN0dWFsIGRpc3RyaWJ1dGVkIGFtb3VudCBmb3IgdGhlIHRva2VuCmZ1bmMgR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0Rldk9wc0J5VG9rZW5QYXRoKHRva2VuUGF0aCBzdHJpbmcpIGludDY0IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldEFjdHVhbERpc3RyaWJ1dGVkVG9EZXZPcHNCeVRva2VuUGF0aCh0b2tlblBhdGgpCn0KGrIBCgpyZW5kZXIuZ25vEqMBcGFja2FnZSBwcm90b2NvbF9mZWUKCi8vIFJlbmRlciBkZWxlZ2F0ZXMgd2ViIHJlbmRlcmluZyB0byB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLlJlbmRlcihwYXRoKQp9ChqpCgoJc3RhdGUuZ25vEpsKcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCgkiZXJyb3JzIgoKCV8gImduby5sYW5kL3IvZ25vc3dhcC9yYmFjL3YxIiAvLyBpbml0aWFsaXplIHJlYWRhYmxlIGNvbnRyYWN0IHJvbGUocykKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC92ZXJzaW9uX21hbmFnZXIvdjEiCikKCnZhciAoCgljdXJyZW50QWRkcmVzcyBhZGRyZXNzCglkb21haW5QYXRoICAgICBzdHJpbmcKCglrdlN0b3JlIHN0b3JlLktWU3RvcmUKCgl2ZXJzaW9uTWFuYWdlciB2ZXJzaW9uX21hbmFnZXIuVmVyc2lvbk1hbmFnZXIKCWltcGxlbWVudGF0aW9uIElQcm90b2NvbEZlZQopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CgljdXJyZW50QWRkcmVzcyA9IGN1ci5BZGRyZXNzKCkKCWRvbWFpblBhdGggPSBjdXIuUGtnUGF0aCgpCgoJLy8gQ3JlYXRlIGEgbmV3IEtWIHN0b3JlIGluc3RhbmNlIGZvciB0aGlzIGRvbWFpbgoJa3ZTdG9yZSA9IHN0b3JlLk5ld0tWU3RvcmUoY3VycmVudEFkZHJlc3MpCgoJLy8gSW5pdGlhbGl6ZSB0aGUgaW5pdGlhbGl6ZXJzIG1hcCB0byBzdG9yZSBpbXBsZW1lbnRhdGlvbiByZWdpc3RyYXRpb24gZnVuY3Rpb25zCgl2ZXJzaW9uTWFuYWdlciA9IHZlcnNpb25fbWFuYWdlci5OZXdWZXJzaW9uTWFuYWdlcigKCQlkb21haW5QYXRoLAoJCWt2U3RvcmUsCgkJaW5pdGlhbGl6ZURvbWFpblN0b3JlLAoJKQoKCWltcGxlbWVudGF0aW9uID0gbmlsCn0KCmZ1bmMgaW5pdGlhbGl6ZURvbWFpblN0b3JlKF8gaW50LCBybG0gcmVhbG0sIGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgYW55IHsKCXJldHVybiBOZXdQcm90b2NvbEZlZVN0b3JlKGt2U3RvcmUpCn0KCmZ1bmMgZ2V0SW1wbGVtZW50YXRpb24oKSBJUHJvdG9jb2xGZWUgewoJaWYgaW1wbGVtZW50YXRpb24gPT0gbmlsIHsKCQlwYW5pYygiaW1wbGVtZW50YXRpb24gaXMgbm90IGluaXRpYWxpemVkIikKCX0KCglyZXR1cm4gaW1wbGVtZW50YXRpb24KfQoKZnVuYyB1cGRhdGVJbXBsZW1lbnRhdGlvbigpIGVycm9yIHsKCXJlc3VsdCA6PSB2ZXJzaW9uTWFuYWdlci5HZXRDdXJyZW50SW1wbGVtZW50YXRpb24oKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGxlbWVudGF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCIpCgl9CgoJaW1wbCwgb2sgOj0gcmVzdWx0LihJUHJvdG9jb2xGZWUpCglpZiAhb2sgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsIGlzIG5vdCBhbiBJUHJvdG9jb2xGZWUiKQoJfQoKCWltcGxlbWVudGF0aW9uID0gaW1wbAoKCXJldHVybiBuaWwKfQoap4MCCglzdG9yZS5nbm8SmIMCcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCgkiZXJyb3JzIgoKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC9zdG9yZS92MSIKCSJnbm8ubGFuZC9wL2dub3N3YXAvdXRpbHMvdjEiCikKCnR5cGUgU3RvcmVLZXkgc3RyaW5nCgovLyBTdHJpbmcgcmV0dXJucyB0aGUgdGV4dHVhbCBzdG9yZS1rZXkgdmFsdWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBrZXk6IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFN0b3JlS2V5LgpmdW5jIChzIFN0b3JlS2V5KSBTdHJpbmcoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZyhzKQp9Cgpjb25zdCAoCgkvLyBCeSBkZWZhdWx0LCBkZXZPcHMgd2lsbCBnZXQgMCUgb2YgdGhlIHByb3RvY29sIGZlZSAod2hpY2ggbWVhbnMgZ292L3N0YWtlciB3aWxsIGdldCAxMDAlIG9mIHRoZSBwcm90b2NvbCBmZWUpCgkvLyBUaGlzIHBlcmNlbnRhZ2UgY2FuIGJlIG1vZGlmaWVkIHRocm91Z2ggZ292ZXJuYW5jZS4KCVN0b3JlS2V5RGV2T3BzUGN0IFN0b3JlS2V5ID0gImRldk9wc1BjdCIKCgkvLyBhY2N1VG9Hb3ZTdGFrZXIgdHJhY2tzIHRoZSBjdW11bGF0aXZlIGFtb3VudCBhbGxvY2F0ZWQgdG8gR292U3Rha2VyLAoJLy8gaW5jbHVkaW5nIGFsbG9jYXRpb25zIHRoYXQgYXJlIHN0aWxsIHBlbmRpbmcgZGlzdHJpYnV0aW9uLgoJU3RvcmVLZXlBY2N1VG9Hb3ZTdGFrZXIgU3RvcmVLZXkgPSAiYWNjdVRvR292U3Rha2VyIiAvLyB0b2tlblBhdGggLT4gYW1vdW50CgkvLyBhY2N1VG9EZXZPcHMgdHJhY2tzIHRoZSBjdW11bGF0aXZlIGFtb3VudCBhbGxvY2F0ZWQgdG8gRGV2T3BzLAoJLy8gaW5jbHVkaW5nIGFsbG9jYXRpb25zIHRoYXQgYXJlIHN0aWxsIHBlbmRpbmcgZGlzdHJpYnV0aW9uLgoJU3RvcmVLZXlBY2N1VG9EZXZPcHMgU3RvcmVLZXkgPSAiYWNjdVRvRGV2T3BzIiAvLyB0b2tlblBhdGggLT4gYW1vdW50CgoJLy8gRGlzdHJpYnV0aW9uLWhpc3RvcnkgdHJlZXMgdHJhY2sgY3VtdWxhdGl2ZSBhbW91bnRzIGFjdHVhbGx5IHRyYW5zZmVycmVkLgoJU3RvcmVLZXlEaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSBTdG9yZUtleSA9ICJkaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSIgLy8gdG9rZW5QYXRoIC0+IGFtb3VudAoJU3RvcmVLZXlEaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeSAgICBTdG9yZUtleSA9ICJkaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeSIgICAgLy8gdG9rZW5QYXRoIC0+IGFtb3VudAoKCS8vIHJlc2VydmVkVG9rZW5zIHRyYWNrcyB0b2tlbiBwYXRocyBjb2xsZWN0ZWQgYnV0IG5vdCB5ZXQgZGlzdHJpYnV0ZWQuCglTdG9yZUtleVJlc2VydmVkVG9rZW5zIFN0b3JlS2V5ID0gInJlc2VydmVkVG9rZW5zIgoKCS8vIGFjY3J1YWxFcG9jaCwgYWNjcnVhbEJ1Y2tldHMgYW5kIGFjY3J1YWxQZW5kaW5nVG9rZW5zIHRyYWNrIHRoZSBnb3Yvc3Rha2VyIHNoYXJlCgkvLyBwZXIgdG9rZW4gcGF0aCBhbmQgYWNjcnVhbCBlcG9jaCB1bnRpbCBnb3Yvc3Rha2VyIGZvbGRzIGl0IGludG8gaXRzIGFjY3VtdWxhdG9yLgoJU3RvcmVLZXlBY2NydWFsRXBvY2ggICAgICAgICBTdG9yZUtleSA9ICJhY2NydWFsRXBvY2giCglTdG9yZUtleUFjY3J1YWxCdWNrZXRzICAgICAgIFN0b3JlS2V5ID0gImFjY3J1YWxCdWNrZXRzIiAgICAgICAvLyB0b2tlblBhdGggLT4gKGVwb2NoIC0+IGFtb3VudCkKCVN0b3JlS2V5QWNjcnVhbFBlbmRpbmdUb2tlbnMgU3RvcmVLZXkgPSAiYWNjcnVhbFBlbmRpbmdUb2tlbnMiIC8vIHRva2VuUGF0aCAtPiB0cnVlCikKCmNvbnN0ICgKCWRlZmF1bHREZXZPcHNQY3QgPSBpbnQ2NCgwKQoJZXJyU3Bvb2ZlZFJlYWxtICA9ICJybG0gZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgY3Jvc3NpbmcgZnJhbWUiCikKCi8vIE5ld0JQVHJlZU4gYWxsb2NhdGVzIGEgQlAtdHJlZSB1bmRlciAvci9nbm9zd2FwL3Byb3RvY29sX2ZlZSdzIHJlYWxtIGNvbnRleHQKLy8gc28gdHJlZS5TZXQgbGVhZi1zbG90IHdyaXRlcyBjbGVhciB0aGUgcmVhZG9ubHktdGFpbnQgZ2F0ZSByZWdhcmRsZXNzIG9mCi8vIHdoaWNoIHJlYWxtIChwcm90b2NvbF9mZWUvdjEsIG1vY2ssIHRlc3RzKSBjYWxscyBTZXQuIENhbGxlcnMgbXVzdCBhbGxvY2F0ZQovLyBwcm90b2NvbF9mZWUgdHJlZXMgdGhyb3VnaCBoZXJlIHJhdGhlciB0aGFuIGJwdHJlZS5OZXdCUFRyZWVOIGRpcmVjdGx5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmFub3V0OiBCcmFuY2hpbmcgZmFjdG9yIHBhc3NlZCB0byB0aGUgQlAtdHJlZSBjb25zdHJ1Y3Rvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IEEgbmV3IEJQLXRyZWUgY29uZmlndXJlZCB3aXRoIGZhbm91dCBhbmQgYWxsb2NhdGVkIGluIHRoZSBwcm90b2NvbC1mZWUgcmVhbG0gY29udGV4dC4KZnVuYyBOZXdCUFRyZWVOKGZhbm91dCBpbnQpICpicHRyZWUuQlBUcmVlIHsKCXJldHVybiBicHRyZWUuTmV3QlBUcmVlTihmYW5vdXQpCn0KCnR5cGUgcHJvdG9jb2xGZWVTdG9yZSBzdHJ1Y3QgewoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCn0KCi8vIGhhbmRsZSBkZXZPcHNQY3Qgc3RvcmUgZGF0YQovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIERldk9wcyBwZXJjZW50YWdlIHN0b3JlIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSGFzRGV2T3BzUGN0U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RGV2T3BzUGN0LlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplRGV2T3BzUGN0IGNyZWF0ZXMgdGhlIERldk9wcyBhbGxvY2F0aW9uIHBlcmNlbnRhZ2UgZW50cnkgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIGtleSBpcyBpbml0aWFsaXplZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBJbml0aWFsaXplRGV2T3BzUGN0KF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGV2T3BzUGN0LlN0cmluZygpLCBkZWZhdWx0RGV2T3BzUGN0KQp9CgovLyBHZXREZXZPcHNQY3QgcmVhZHMgdGhlIHBlcnNpc3RlZCBEZXZPcHMgYWxsb2NhdGlvbiBwZXJjZW50YWdlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGN0OiBUaGUgc3RvcmVkIERldk9wcyBhbGxvY2F0aW9uIHBlcmNlbnRhZ2UgaW4gYmFzaXMgcG9pbnRzOyB0aGUgbWV0aG9kIHBhbmljcyBpZiB0aGUga2V5IGlzIG1pc3Npbmcgb3IgY2Fubm90IGJlIGRlY29kZWQgYXMgaW50NjQuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEdldERldk9wc1BjdCgpIGludDY0IHsKCWRldk9wc1BjdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXRJbnQ2NChTdG9yZUtleURldk9wc1BjdC5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXR1cm4gZGV2T3BzUGN0Cn0KCi8vIFNldERldk9wc1BjdCBwZXJzaXN0cyB0aGUgRGV2T3BzIGFsbG9jYXRpb24gcGVyY2VudGFnZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIHBjdDogRGV2T3BzIHNoYXJlIG9mIHByb3RvY29sIGZlZXMgaW4gYmFzaXMgcG9pbnRzOyB0aGUgc3RhdGUgbGF5ZXIgY29uc3RyYWlucyB0aGlzIHZhbHVlIHRvIDAgdGhyb3VnaCAxMDAwMCBiZWZvcmUgY2FsbGluZyB0aGUgc3RvcmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBwZXJjZW50YWdlIGlzIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBTZXREZXZPcHNQY3QoXyBpbnQsIHJsbSByZWFsbSwgcGN0IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleURldk9wc1BjdC5TdHJpbmcoKSwgcGN0KQp9CgovLyBoYW5kbGUgYWNjdVRvR292U3Rha2VyIHN0b3JlIGRhdGEKLy8KLy8gUmV0dXJuczoKLy8gICAtIGV4aXN0czogVHJ1ZSB3aGVuIHRoZSBjdW11bGF0aXZlIEdvdi9TdGFrZXIgYWxsb2NhdGlvbiB0cmVlIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSGFzQWNjdVRvR292U3Rha2VyU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5QWNjdVRvR292U3Rha2VyLlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplQWNjdVRvR292U3Rha2VyIGNyZWF0ZXMgdGhlIGN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSB0cmVlIGlzIGluaXRpYWxpemVkOyBvdGhlcndpc2UgdGhlIGN1cnJlbnQtcmVhbG0gb3IgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEluaXRpYWxpemVBY2N1VG9Hb3ZTdGFrZXIoXyBpbnQsIHJsbSByZWFsbSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlBY2N1VG9Hb3ZTdGFrZXIuU3RyaW5nKCksIE5ld0JQVHJlZU4oMTYpKQp9CgovLyBHZXRBY2N1VG9Hb3ZTdGFrZXIgcmVhZHMgdGhlIGN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBUaGUgQlAtdHJlZSBtYXBwaW5nIHRva2VuIHBhdGhzIHRvIGN1bXVsYXRpdmUgYW1vdW50czsgdGhlIG1ldGhvZCBwYW5pY3MgaWYgdGhlIHN0b3JlIHZhbHVlIGlzIGFic2VudCBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEdldEFjY3VUb0dvdlN0YWtlcigpICpicHRyZWUuQlBUcmVlIHsKCWFjY3VUb0dvdlN0YWtlciwgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlBY2N1VG9Hb3ZTdGFrZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcmV0dXJuIGFjY3VUb0dvdlN0YWtlcgp9CgovLyBHZXRBY2N1VG9Hb3ZTdGFrZXJJdGVtIHJlYWRzIG9uZSB0b2tlbidzIGN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgYWxsb2NhdGlvbiBzaG91bGQgYmUgbG9va2VkIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBUaGUgc3RvcmVkIGN1bXVsYXRpdmUgYWxsb2NhdGlvbiBmb3IgdG9rZW5QYXRoLCBvciB6ZXJvIHdoZW4gbm8gZW50cnkgZXhpc3RzLgovLyAgIC0gZm91bmQ6IFRydWUgd2hlbiB0b2tlblBhdGggaGFzIGFuIGVudHJ5IGluIHRoZSBhbGxvY2F0aW9uIHRyZWU7IGZhbHNlIHdoZW4gaXQgaXMgYWJzZW50LgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXRBY2N1VG9Hb3ZTdGFrZXJJdGVtKHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJYWNjdVRvR292U3Rha2VyLCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleUFjY3VUb0dvdlN0YWtlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXN1bHQgOj0gYWNjdVRvR292U3Rha2VyLkdldCh0b2tlblBhdGgpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCglhbW91bnQsIG9rIDo9IHJlc3VsdC4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuRXJyb3JmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gYW1vdW50LCB0cnVlCn0KCi8vIFNldEFjY3VUb0dvdlN0YWtlckl0ZW0gdXBkYXRlcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIEdvdi9TdGFrZXIgYWxsb2NhdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBjdW11bGF0aXZlIGFsbG9jYXRpb24gaXMgcmVwbGFjZWQuCi8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgR292L1N0YWtlciBhbGxvY2F0aW9uIHRvIHN0b3JlIGZvciB0b2tlblBhdGguCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBhbGxvY2F0aW9uIHRyZWUgaXMgcGVyc2lzdGVkOyBvdGhlcndpc2UgdGhlIGN1cnJlbnQtcmVhbG0sIHRyZWUtcmVhZCwgb3IgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIFNldEFjY3VUb0dvdlN0YWtlckl0ZW0oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJYWNjdVRvR292U3Rha2VyLCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleUFjY3VUb0dvdlN0YWtlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglhY2N1VG9Hb3ZTdGFrZXIuU2V0KHRva2VuUGF0aCwgYW1vdW50KQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlBY2N1VG9Hb3ZTdGFrZXIuU3RyaW5nKCksIGFjY3VUb0dvdlN0YWtlcikKfQoKLy8gaGFuZGxlIGFjY3VUb0Rldk9wcyBzdG9yZSBkYXRhCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiB0cmVlIGtleSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZS4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSGFzQWNjdVRvRGV2T3BzU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5QWNjdVRvRGV2T3BzLlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplQWNjdVRvRGV2T3BzIGNyZWF0ZXMgdGhlIGN1bXVsYXRpdmUgRGV2T3BzIGFsbG9jYXRpb24gdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIHRyZWUgaXMgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSW5pdGlhbGl6ZUFjY3VUb0Rldk9wcyhfIGludCwgcmxtIHJlYWxtKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFjY3VUb0Rldk9wcy5TdHJpbmcoKSwgTmV3QlBUcmVlTigxNikpCn0KCi8vIEdldEFjY3VUb0Rldk9wcyByZWFkcyB0aGUgY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdHJlZTogVGhlIEJQLXRyZWUgbWFwcGluZyB0b2tlbiBwYXRocyB0byBjdW11bGF0aXZlIGFtb3VudHM7IHRoZSBtZXRob2QgcGFuaWNzIGlmIHRoZSBzdG9yZSB2YWx1ZSBpcyBhYnNlbnQgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXRBY2N1VG9EZXZPcHMoKSAqYnB0cmVlLkJQVHJlZSB7CglhY2N1VG9EZXZPcHMsIGVyciA6PSBzLmt2U3RvcmUuR2V0QlBUcmVlKFN0b3JlS2V5QWNjdVRvRGV2T3BzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiBhY2N1VG9EZXZPcHMKfQoKLy8gR2V0QWNjdVRvRGV2T3BzSXRlbSByZWFkcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIERldk9wcyBhbGxvY2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgYWxsb2NhdGlvbiBzaG91bGQgYmUgbG9va2VkIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBUaGUgc3RvcmVkIGN1bXVsYXRpdmUgYWxsb2NhdGlvbiBmb3IgdG9rZW5QYXRoLCBvciB6ZXJvIHdoZW4gbm8gZW50cnkgZXhpc3RzLgovLyAgIC0gZm91bmQ6IFRydWUgd2hlbiB0b2tlblBhdGggaGFzIGFuIGVudHJ5IGluIHRoZSBhbGxvY2F0aW9uIHRyZWU7IGZhbHNlIHdoZW4gaXQgaXMgYWJzZW50LgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXRBY2N1VG9EZXZPcHNJdGVtKHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJYWNjdVRvRGV2T3BzLCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleUFjY3VUb0Rldk9wcy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXN1bHQgOj0gYWNjdVRvRGV2T3BzLkdldCh0b2tlblBhdGgpCglpZiByZXN1bHQgPT0gbmlsIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCglhbW91bnQsIG9rIDo9IHJlc3VsdC4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuRXJyb3JmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gYW1vdW50LCB0cnVlCn0KCi8vIFNldEFjY3VUb0Rldk9wc0l0ZW0gdXBkYXRlcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIERldk9wcyBhbGxvY2F0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogQ3Jvc3NpbmcgZGlzY3JpbWluYXRvciBmb3IgdGhlIHN0b3JlIG9wZXJhdGlvbjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoaXMgc3RvcmUgd3JpdGU7IGl0IG11c3QgYmUgY3VycmVudCAoYHJsbS5Jc0N1cnJlbnQoKWApLgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGN1bXVsYXRpdmUgYWxsb2NhdGlvbiBpcyByZXBsYWNlZC4KLy8gICAtIGFtb3VudDogQ3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiB0byBzdG9yZSBmb3IgdG9rZW5QYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiB0aGUgYWxsb2NhdGlvbiB0cmVlIGlzIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtLCB0cmVlLXJlYWQsIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBTZXRBY2N1VG9EZXZPcHNJdGVtKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWFjY3VUb0Rldk9wcywgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlBY2N1VG9EZXZPcHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJYWNjdVRvRGV2T3BzLlNldCh0b2tlblBhdGgsIGFtb3VudCkKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWNjdVRvRGV2T3BzLlN0cmluZygpLCBhY2N1VG9EZXZPcHMpCn0KCi8vIGhhbmRsZSBkaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSBzdG9yZSBkYXRhCi8vIEhhc0Rpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBHb3YvU3Rha2VyIGRpc3RyaWJ1dGlvbi1oaXN0b3J5IHRyZWUgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIEdvdi9TdGFrZXIgZGlzdHJpYnV0aW9uLWhpc3RvcnkgdHJlZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEhhc0Rpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5U3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkuU3RyaW5nKCkpCn0KCi8vIEluaXRpYWxpemVEaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSBjcmVhdGVzIHRoZSBHb3YvU3Rha2VyIGRpc3RyaWJ1dGlvbi1oaXN0b3J5IHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBoaXN0b3J5IHRyZWUgaXMgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5KF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkuU3RyaW5nKCksIE5ld0JQVHJlZU4oMTYpKQp9CgovLyBHZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSByZWFkcyB0aGUgY3VtdWxhdGl2ZSBHb3YvU3Rha2VyIGRpc3RyaWJ1dGlvbi1oaXN0b3J5IHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0cmVlOiBUaGUgQlAtdHJlZSBtYXBwaW5nIHRva2VuIHBhdGhzIHRvIGFtb3VudHMgYWN0dWFsbHkgZGlzdHJpYnV0ZWQgdG8gR292L1N0YWtlcjsgdGhlIG1ldGhvZCBwYW5pY3MgaWYgdGhlIHN0b3JlZCB2YWx1ZSBpcyBhYnNlbnQgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSgpICpicHRyZWUuQlBUcmVlIHsKCWRpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5LCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5LlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiBkaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeQp9CgovLyBHZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeUl0ZW0gcmVhZHMgb25lIHRva2VuJ3MgY3VtdWxhdGl2ZSBHb3YvU3Rha2VyIGRpc3RyaWJ1dGlvbiBoaXN0b3J5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGRpc3RyaWJ1dGVkIGFtb3VudCBzaG91bGQgYmUgbG9va2VkIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBUaGUgc3RvcmVkIGN1bXVsYXRpdmUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIEdvdi9TdGFrZXIgZm9yIHRva2VuUGF0aCwgb3IgemVybyB3aGVuIG5vIGVudHJ5IGV4aXN0cy4KLy8gICAtIGZvdW5kOiBUcnVlIHdoZW4gdG9rZW5QYXRoIGhhcyBhIGhpc3RvcnkgZW50cnk7IGZhbHNlIHdoZW4gaXQgaXMgYWJzZW50LgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeUl0ZW0odG9rZW5QYXRoIHN0cmluZykgKGludDY0LCBib29sKSB7CglkaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeSwgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlEaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeS5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXN1bHQgOj0gZGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkuR2V0KHRva2VuUGF0aCkKCWlmIHJlc3VsdCA9PSBuaWwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoKCWFtb3VudCwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5FcnJvcmYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBpbnQ2NDogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBhbW91bnQsIHRydWUKfQoKLy8gU2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnlJdGVtIHVwZGF0ZXMgb25lIHRva2VuJ3MgY3VtdWxhdGl2ZSBHb3YvU3Rha2VyIGRpc3RyaWJ1dGlvbiBoaXN0b3J5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogQ3Jvc3NpbmcgZGlzY3JpbWluYXRvciBmb3IgdGhlIHN0b3JlIG9wZXJhdGlvbjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoaXMgc3RvcmUgd3JpdGU7IGl0IG11c3QgYmUgY3VycmVudCAoYHJsbS5Jc0N1cnJlbnQoKWApLgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGRpc3RyaWJ1dGVkIGFtb3VudCBpcyByZXBsYWNlZC4KLy8gICAtIGFtb3VudDogQ3VtdWxhdGl2ZSBhbW91bnQgYWN0dWFsbHkgZGlzdHJpYnV0ZWQgdG8gR292L1N0YWtlciB0byBzdG9yZSBmb3IgdG9rZW5QYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiB0aGUgaGlzdG9yeSB0cmVlIGlzIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtLCB0cmVlLXJlYWQsIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBTZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeUl0ZW0oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJZGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnksIGVyciA6PSBzLmt2U3RvcmUuR2V0QlBUcmVlKFN0b3JlS2V5RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJZGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkuU2V0KHRva2VuUGF0aCwgYW1vdW50KQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlEaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeS5TdHJpbmcoKSwgZGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkpCn0KCi8vIEhhc0Rpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5U3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBEZXZPcHMgZGlzdHJpYnV0aW9uLWhpc3RvcnkgdHJlZSBleGlzdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgRGV2T3BzIGRpc3RyaWJ1dGlvbi1oaXN0b3J5IHRyZWUga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgovLwovLyBoYW5kbGUgZGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3Rvcnkgc3RvcmUgZGF0YQpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBIYXNEaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeVN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5LlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplRGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkgY3JlYXRlcyB0aGUgRGV2T3BzIGRpc3RyaWJ1dGlvbi1oaXN0b3J5IHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBoaXN0b3J5IHRyZWUgaXMgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5KF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkuU3RyaW5nKCksIE5ld0JQVHJlZU4oMTYpKQp9CgovLyBHZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeSByZWFkcyB0aGUgY3VtdWxhdGl2ZSBEZXZPcHMgZGlzdHJpYnV0aW9uLWhpc3RvcnkgdHJlZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IFRoZSBCUC10cmVlIG1hcHBpbmcgdG9rZW4gcGF0aHMgdG8gYW1vdW50cyBhY3R1YWxseSBkaXN0cmlidXRlZCB0byBEZXZPcHM7IHRoZSBtZXRob2QgcGFuaWNzIGlmIHRoZSBzdG9yZWQgdmFsdWUgaXMgYWJzZW50IG9yIGhhcyB0aGUgd3JvbmcgdHlwZS4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgR2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkoKSAqYnB0cmVlLkJQVHJlZSB7CglkaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeSwgZXJyIDo9IHMua3ZTdG9yZS5HZXRCUFRyZWUoU3RvcmVLZXlEaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeS5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXR1cm4gZGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkKfQoKLy8gR2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnlJdGVtIHJlYWRzIG9uZSB0b2tlbidzIGN1bXVsYXRpdmUgRGV2T3BzIGRpc3RyaWJ1dGlvbiBoaXN0b3J5LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIGRpc3RyaWJ1dGVkIGFtb3VudCBzaG91bGQgYmUgbG9va2VkIHVwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBUaGUgc3RvcmVkIGN1bXVsYXRpdmUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIERldk9wcyBmb3IgdG9rZW5QYXRoLCBvciB6ZXJvIHdoZW4gbm8gZW50cnkgZXhpc3RzLgovLyAgIC0gZm91bmQ6IFRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgaGlzdG9yeSBlbnRyeTsgZmFsc2Ugd2hlbiBpdCBpcyBhYnNlbnQuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEdldERpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5SXRlbSh0b2tlblBhdGggc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCWRpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5LCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5LlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJlc3VsdCA6PSBkaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeS5HZXQodG9rZW5QYXRoKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CgoJYW1vdW50LCBvayA6PSByZXN1bHQuKGludDY0KQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LkVycm9yZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvIGludDY0OiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGFtb3VudCwgdHJ1ZQp9CgovLyBTZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeUl0ZW0gdXBkYXRlcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIERldk9wcyBkaXN0cmlidXRpb24gaGlzdG9yeS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB3aG9zZSBkaXN0cmlidXRlZCBhbW91bnQgaXMgcmVwbGFjZWQuCi8vICAgLSBhbW91bnQ6IEN1bXVsYXRpdmUgYW1vdW50IGFjdHVhbGx5IGRpc3RyaWJ1dGVkIHRvIERldk9wcyB0byBzdG9yZSBmb3IgdG9rZW5QYXRoLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiB0aGUgaGlzdG9yeSB0cmVlIGlzIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtLCB0cmVlLXJlYWQsIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBTZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeUl0ZW0oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJZGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnksIGVyciA6PSBzLmt2U3RvcmUuR2V0QlBUcmVlKFN0b3JlS2V5RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJZGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkuU2V0KHRva2VuUGF0aCwgYW1vdW50KQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlEaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeS5TdHJpbmcoKSwgZGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkpCn0KCi8vIGhhbmRsZSByZXNlcnZlZFRva2VucyBzdG9yZSBkYXRhCi8vCi8vIHJlc2VydmVkVG9rZW5zIGlzIHRoZSBzZXQgb2YgdG9rZW4gcGF0aHMgdGhhdCBjb2xsZWN0ZWQgYSBmZWUgbm90IHlldCB0cmFuc2ZlcnJlZCBvdXQKLy8gYnkgRGlzdHJpYnV0ZVByb3RvY29sRmVlLiBJdCBpcyBrZXB0IGFzIGEgdHJlZSBzbyB0aGF0IGEgc2luZ2xlIHRva2VuIGNhbiBiZSBhZGRlZCBvcgovLyBzZXR0bGVkIHdpdGhvdXQgcmV3cml0aW5nIHRoZSB3aG9sZSBzZXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcmVzZXJ2ZWQtdG9rZW4gaW5kZXgga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBIYXNSZXNlcnZlZFRva2Vuc1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVJlc2VydmVkVG9rZW5zLlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplUmVzZXJ2ZWRUb2tlbnMgY3JlYXRlcyB0aGUgcmVzZXJ2ZWQtdG9rZW4gaW5kZXggdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIGluZGV4IHRyZWUgaXMgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSW5pdGlhbGl6ZVJlc2VydmVkVG9rZW5zKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UmVzZXJ2ZWRUb2tlbnMuU3RyaW5nKCksIE5ld0JQVHJlZU4oMTYpKQp9CgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBnZXRSZXNlcnZlZFRva2VuVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCXJlc2VydmVkVG9rZW5zLCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleVJlc2VydmVkVG9rZW5zLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiByZXNlcnZlZFRva2Vucwp9CgovLyBHZXRSZXNlcnZlZFRva2VucyByZXR1cm5zIGFsbCB0b2tlbiBwYXRocyBjdXJyZW50bHkgcmVzZXJ2ZWQgZm9yIGRpc3RyaWJ1dGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuUGF0aHM6IFRva2VuIHBhdGhzIHByZXNlbnQgaW4gdGhlIHJlc2VydmVkLXRva2VuIGluZGV4LCBpbiBCUC10cmVlIGl0ZXJhdGlvbiBvcmRlci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgR2V0UmVzZXJ2ZWRUb2tlbnMoKSBbXXN0cmluZyB7CglyZXR1cm4gY29sbGVjdFRyZWVLZXlzKHMuZ2V0UmVzZXJ2ZWRUb2tlblRyZWUoKSkKfQoKLy8gSGFzUmVzZXJ2ZWRUb2tlbiByZXBvcnRzIHdoZXRoZXIgdG9rZW5QYXRoIGlzIGN1cnJlbnRseSByZXNlcnZlZCBmb3IgZGlzdHJpYnV0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHRvIGxvb2sgdXAgaW4gdGhlIHJlc2VydmVkLXRva2VuIGluZGV4LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdG9rZW5QYXRoIGlzIGluIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleDsgZmFsc2Ugb3RoZXJ3aXNlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBIYXNSZXNlcnZlZFRva2VuKHRva2VuUGF0aCBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIHMuZ2V0UmVzZXJ2ZWRUb2tlblRyZWUoKS5IYXModG9rZW5QYXRoKQp9CgovLyBBZGRSZXNlcnZlZFRva2VuIGFkZHMgdG9rZW5QYXRoIHRvIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCBjb2xsZWN0ZWQgZm9yIHByb3RvY29sLWZlZSBkaXN0cmlidXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRva2VuUGF0aCBpcyBhbHJlYWR5IHByZXNlbnQgb3IgaGFzIGJlZW4gYWRkZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgQWRkUmVzZXJ2ZWRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmVzZXJ2ZWRUb2tlbnMgOj0gcy5nZXRSZXNlcnZlZFRva2VuVHJlZSgpCglpZiByZXNlcnZlZFRva2Vucy5IYXModG9rZW5QYXRoKSB7CgkJcmV0dXJuIG5pbAoJfQoKCXJlc2VydmVkVG9rZW5zLlNldCh0b2tlblBhdGgsIHRydWUpCgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVJlc2VydmVkVG9rZW5zLlN0cmluZygpLCByZXNlcnZlZFRva2VucykKfQoKLy8gUmVtb3ZlUmVzZXJ2ZWRUb2tlbiByZW1vdmVzIG9uZSB0b2tlblBhdGggZnJvbSB0aGUgcmVzZXJ2ZWQtdG9rZW4gc2V0IHdoZW4gcHJlc2VudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIHRva2VuUGF0aDogVG9rZW4gcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVzZXJ2ZWQtdG9rZW4gc2V0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiB0b2tlblBhdGggaXMgYWJzZW50IG9yIGhhcyBiZWVuIHJlbW92ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgUmVtb3ZlUmVzZXJ2ZWRUb2tlbihfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmVzZXJ2ZWRUb2tlbnMgOj0gcy5nZXRSZXNlcnZlZFRva2VuVHJlZSgpCglpZiBfLCByZW1vdmVkIDo9IHJlc2VydmVkVG9rZW5zLlJlbW92ZSh0b2tlblBhdGgpOyAhcmVtb3ZlZCB7CgkJcmV0dXJuIG5pbAoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlSZXNlcnZlZFRva2Vucy5TdHJpbmcoKSwgcmVzZXJ2ZWRUb2tlbnMpCn0KCi8vIGhhbmRsZSBhY2NydWFsRXBvY2ggc3RvcmUgZGF0YQovLwovLyBhY2NydWFsRXBvY2ggbnVtYmVycyB0aGUgaW50ZXJ2YWxzIGJldHdlZW4gZ292L3N0YWtlciBzdGFrZSBjaGFuZ2VzLiBnb3Yvc3Rha2VyCi8vIGFkdmFuY2VzIGl0IG9uIGV2ZXJ5IHN0YWtlIGNoYW5nZSwgc28gZXZlcnkgZmVlIHRoYXQgYXJyaXZlcyBpcyBhdHRyaWJ1dGVkIHRvIHRoZQovLyBzdGFrZSBkaXN0cmlidXRpb24gaW4gZm9yY2Ugd2hlbiBpdCBhcnJpdmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiBUcnVlIHdoZW4gdGhlIGFjY3J1YWwtZXBvY2ggc3RvcmUga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBIYXNBY2NydWFsRXBvY2hTdG9yZUtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlBY2NydWFsRXBvY2guU3RyaW5nKCkpCn0KCi8vIEluaXRpYWxpemVBY2NydWFsRXBvY2ggaW5pdGlhbGl6ZXMgdGhlIGN1cnJlbnQgZmVlLWFjY3J1YWwgZXBvY2ggdG8gemVyby4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIGVwb2NoIGtleSBpcyBpbml0aWFsaXplZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBJbml0aWFsaXplQWNjcnVhbEVwb2NoKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWNjcnVhbEVwb2NoLlN0cmluZygpLCBpbnQ2NCgwKSkKfQoKLy8gR2V0QWNjcnVhbEVwb2NoIHJlYWRzIHRoZSBlcG9jaCB1bmRlciB3aGljaCBuZXcgR292L1N0YWtlciBhY2NydWFsIGJ1Y2tldHMgYXJlIHJlY29yZGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXBvY2g6IFRoZSBwZXJzaXN0ZWQgY3VycmVudCBhY2NydWFsIGVwb2NoOyB0aGUgbWV0aG9kIHBhbmljcyBpZiB0aGUga2V5IGlzIG1pc3Npbmcgb3IgY2Fubm90IGJlIGRlY29kZWQgYXMgaW50NjQuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEdldEFjY3J1YWxFcG9jaCgpIGludDY0IHsKCWFjY3J1YWxFcG9jaCwgZXJyIDo9IHMua3ZTdG9yZS5HZXRJbnQ2NChTdG9yZUtleUFjY3J1YWxFcG9jaC5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZXR1cm4gYWNjcnVhbEVwb2NoCn0KCi8vIFNldEFjY3J1YWxFcG9jaCBwZXJzaXN0cyB0aGUgY3VycmVudCBmZWUtYWNjcnVhbCBlcG9jaC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8gICAtIGFjY3J1YWxFcG9jaDogRXBvY2ggbnVtYmVyIGFzc2lnbmVkIHRvIG5ld2x5IGNvbGxlY3RlZCBHb3YvU3Rha2VyIGFjY3J1YWwgYnVja2V0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIGVwb2NoIGlzIHBlcnNpc3RlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBTZXRBY2NydWFsRXBvY2goXyBpbnQsIHJsbSByZWFsbSwgYWNjcnVhbEVwb2NoIGludDY0KSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhlcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFjY3J1YWxFcG9jaC5TdHJpbmcoKSwgYWNjcnVhbEVwb2NoKQp9CgovLyBoYW5kbGUgYWNjcnVhbEJ1Y2tldHMgc3RvcmUgZGF0YQovLwovLyBhY2NydWFsQnVja2V0cyBob2xkcywgcGVyIHRva2VuIHBhdGgsIHRoZSBnb3Yvc3Rha2VyIHNoYXJlIGNvbGxlY3RlZCBkdXJpbmcgZWFjaAovLyBhY2NydWFsIGVwb2NoIHRoYXQgZ292L3N0YWtlciBoYXMgbm90IGZvbGRlZCBpbnRvIGl0cyBhY2N1bXVsYXRvciB5ZXQuIEZvbGRpbmcKLy8gY29uc3VtZXMgdGhlIG9sZGVzdCBidWNrZXRzIGZpcnN0LCBzbyBhIHRva2VuIGlzIHNldHRsZWQgaW4gZXBvY2ggb3JkZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgYWNjcnVhbC1idWNrZXQgc3RvcmUga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBIYXNBY2NydWFsQnVja2V0c1N0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleUFjY3J1YWxCdWNrZXRzLlN0cmluZygpKQp9CgovLyBJbml0aWFsaXplQWNjcnVhbEJ1Y2tldHMgY3JlYXRlcyB0aGUgbmVzdGVkIGFjY3J1YWwtYnVja2V0IHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IE5pbCB3aGVuIHRoZSBidWNrZXQgdHJlZSBpcyBpbml0aWFsaXplZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBJbml0aWFsaXplQWNjcnVhbEJ1Y2tldHMoXyBpbnQsIHJsbSByZWFsbSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlBY2NydWFsQnVja2V0cy5TdHJpbmcoKSwgTmV3QlBUcmVlTigxNikpCn0KCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIGdldEFjY3J1YWxCdWNrZXRUcmVlKCkgKmJwdHJlZS5CUFRyZWUgewoJYWNjcnVhbEJ1Y2tldHMsIGVyciA6PSBzLmt2U3RvcmUuR2V0QlBUcmVlKFN0b3JlS2V5QWNjcnVhbEJ1Y2tldHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJcmV0dXJuIGFjY3J1YWxCdWNrZXRzCn0KCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIGdldFRva2VuQWNjcnVhbEJ1Y2tldFRyZWUoYWNjcnVhbEJ1Y2tldHMgKmJwdHJlZS5CUFRyZWUsIHRva2VuUGF0aCBzdHJpbmcpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCA6PSBhY2NydWFsQnVja2V0cy5HZXQodG9rZW5QYXRoKQoJaWYgcmVzdWx0ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoKCXRva2VuQnVja2V0cywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5FcnJvcmYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiB0b2tlbkJ1Y2tldHMKfQoKLy8gR2V0QWNjcnVhbEJ1Y2tldHMgcmV0dXJucyB1cCB0byBsaW1pdCBvZiB0aGUgb2xkZXN0IHBlbmRpbmcgYnVja2V0cyBvZiB0b2tlblBhdGggaW4KLy8gZXBvY2ggb3JkZXIuIEEgbGltaXQgb2YgemVybyBvciBsZXNzIHJldHVybnMgZXZlcnkgcGVuZGluZyBidWNrZXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggd2hvc2UgcGVuZGluZyBHb3YvU3Rha2VyIGFjY3J1YWwgYnVja2V0cyBzaG91bGQgYmUgcmVhZC4KLy8gICAtIGxpbWl0OiBNYXhpbXVtIG51bWJlciBvZiBidWNrZXRzIHRvIHJldHVybjsgemVybyBvciBhIG5lZ2F0aXZlIHZhbHVlIHJldHVybnMgYWxsIHBlbmRpbmcgYnVja2V0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVwb2NoczogRXBvY2ggbnVtYmVycyBmb3IgdGhlIHJldHVybmVkIGJ1Y2tldHMsIGluIGFzY2VuZGluZyBCUC10cmVlIGl0ZXJhdGlvbiBvcmRlci4KLy8gICAtIGFtb3VudHM6IEdvdi9TdGFrZXIgYW1vdW50cyBmb3IgdGhlIHJldHVybmVkIGVwb2NoczsgYW1vdW50c1tpXSBjb3JyZXNwb25kcyB0byBlcG9jaHNbaV0uCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEdldEFjY3J1YWxCdWNrZXRzKHRva2VuUGF0aCBzdHJpbmcsIGxpbWl0IGludCkgKFtdaW50NjQsIFtdaW50NjQpIHsKCWVwb2NocyA6PSBbXWludDY0e30KCWFtb3VudHMgOj0gW11pbnQ2NHt9CgoJdG9rZW5CdWNrZXRzIDo9IHMuZ2V0VG9rZW5BY2NydWFsQnVja2V0VHJlZShzLmdldEFjY3J1YWxCdWNrZXRUcmVlKCksIHRva2VuUGF0aCkKCWlmIHRva2VuQnVja2V0cyA9PSBuaWwgewoJCXJldHVybiBlcG9jaHMsIGFtb3VudHMKCX0KCgl0b2tlbkJ1Y2tldHMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlpZiBsaW1pdCA+IDAgJiYgbGVuKGVwb2NocykgPj0gbGltaXQgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCgkJYW1vdW50LCBvayA6PSB2YWx1ZS4oaW50NjQpCgkJaWYgIW9rIHsKCQkJcGFuaWModWZtdC5FcnJvcmYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBpbnQ2NDogJVQiLCB2YWx1ZSkpCgkJfQoKCQllcG9jaHMgPSBhcHBlbmQoZXBvY2hzLCBkZWNvZGVFcG9jaEtleShrZXkpKQoJCWFtb3VudHMgPSBhcHBlbmQoYW1vdW50cywgYW1vdW50KQoKCQlyZXR1cm4gZmFsc2UKCX0pCgoJcmV0dXJuIGVwb2NocywgYW1vdW50cwp9CgovLyBBZGRBY2NydWFsQnVja2V0IGFkZHMgYW1vdW50IHRvIHRoZSBidWNrZXQgb2YgdG9rZW5QYXRoIGF0IGVwb2NoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogQ3Jvc3NpbmcgZGlzY3JpbWluYXRvciBmb3IgdGhlIHN0b3JlIG9wZXJhdGlvbjsgcGFzcyAwLgovLyAgIC0gcmxtOiBQcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQgZm9yIHRoaXMgc3RvcmUgd3JpdGU7IGl0IG11c3QgYmUgY3VycmVudCAoYHJsbS5Jc0N1cnJlbnQoKWApLgovLyAgIC0gdG9rZW5QYXRoOiBUb2tlbiBwYXRoIHdob3NlIEdvdi9TdGFrZXIgYWNjcnVhbCBidWNrZXQgaXMgdXBkYXRlZC4KLy8gICAtIGVwb2NoOiBOb24tbmVnYXRpdmUgYWNjcnVhbCBlcG9jaCBpZGVudGlmeWluZyB0aGUgYnVja2V0OyBuZWdhdGl2ZSBlcG9jaHMgcGFuaWMgZHVyaW5nIGtleSBlbmNvZGluZy4KLy8gICAtIGFtb3VudDogQW1vdW50IHRvIGFkZCB0byB0aGUgZXhpc3RpbmcgYnVja2V0IHZhbHVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiB0aGUgYnVja2V0IHRyZWUgaXMgcGVyc2lzdGVkOyBvdGhlcndpc2UgdGhlIGN1cnJlbnQtcmVhbG0gb3IgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEFkZEFjY3J1YWxCdWNrZXQoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgZXBvY2ggaW50NjQsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWFjY3J1YWxCdWNrZXRzIDo9IHMuZ2V0QWNjcnVhbEJ1Y2tldFRyZWUoKQoJdG9rZW5CdWNrZXRzIDo9IHMuZ2V0VG9rZW5BY2NydWFsQnVja2V0VHJlZShhY2NydWFsQnVja2V0cywgdG9rZW5QYXRoKQoJaWYgdG9rZW5CdWNrZXRzID09IG5pbCB7CgkJdG9rZW5CdWNrZXRzID0gTmV3QlBUcmVlTigxNikKCQlhY2NydWFsQnVja2V0cy5TZXQodG9rZW5QYXRoLCB0b2tlbkJ1Y2tldHMpCgl9CgoJa2V5IDo9IGVuY29kZUVwb2NoS2V5KGVwb2NoKQoJZXhpc3RpbmcgOj0gaW50NjQoMCkKCWlmIHJlc3VsdCA6PSB0b2tlbkJ1Y2tldHMuR2V0KGtleSk7IHJlc3VsdCAhPSBuaWwgewoJCWN1cnJlbnQsIG9rIDo9IHJlc3VsdC4oaW50NjQpCgkJaWYgIW9rIHsKCQkJcGFuaWModWZtdC5FcnJvcmYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBpbnQ2NDogJVQiLCByZXN1bHQpKQoJCX0KCQlleGlzdGluZyA9IGN1cnJlbnQKCX0KCgl0b2tlbkJ1Y2tldHMuU2V0KGtleSwgZ25zbWF0aC5TYWZlQWRkSW50NjQoZXhpc3RpbmcsIGFtb3VudCkpCgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFjY3J1YWxCdWNrZXRzLlN0cmluZygpLCBhY2NydWFsQnVja2V0cykKfQoKLy8gUmVtb3ZlQWNjcnVhbEJ1Y2tldHMgZHJvcHMgdGhlIGJ1Y2tldHMgb2YgdG9rZW5QYXRoIGF0IHRoZSBnaXZlbiBlcG9jaHMuIFRoZSB0b2tlbidzCi8vIHRyZWUgaXMgZHJvcHBlZCBhcyB3ZWxsIG9uY2Ugbm8gYnVja2V0IHJlbWFpbnMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggd2hvc2Ugc2VsZWN0ZWQgYWNjcnVhbCBidWNrZXRzIGFyZSByZW1vdmVkLgovLyAgIC0gZXBvY2hzOiBFcG9jaCBudW1iZXJzIHdob3NlIGJ1Y2tldHMgc2hvdWxkIGJlIGRlbGV0ZWQ7IGFuIGFic2VudCB0b2tlbiBvciBlcG9jaCBpcyBpZ25vcmVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBOaWwgd2hlbiByZW1vdmFscyBhcmUgYXBwbGllZCAoaW5jbHVkaW5nIGFuIGFic2VudCB0b2tlbik7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgUmVtb3ZlQWNjcnVhbEJ1Y2tldHMoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgZXBvY2hzIFtdaW50NjQpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglhY2NydWFsQnVja2V0cyA6PSBzLmdldEFjY3J1YWxCdWNrZXRUcmVlKCkKCXRva2VuQnVja2V0cyA6PSBzLmdldFRva2VuQWNjcnVhbEJ1Y2tldFRyZWUoYWNjcnVhbEJ1Y2tldHMsIHRva2VuUGF0aCkKCWlmIHRva2VuQnVja2V0cyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglmb3IgXywgZXBvY2ggOj0gcmFuZ2UgZXBvY2hzIHsKCQl0b2tlbkJ1Y2tldHMuUmVtb3ZlKGVuY29kZUVwb2NoS2V5KGVwb2NoKSkKCX0KCglpZiB0b2tlbkJ1Y2tldHMuU2l6ZSgpID09IDAgewoJCWFjY3J1YWxCdWNrZXRzLlJlbW92ZSh0b2tlblBhdGgpCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleUFjY3J1YWxCdWNrZXRzLlN0cmluZygpLCBhY2NydWFsQnVja2V0cykKfQoKLy8gaGFuZGxlIGFjY3J1YWxQZW5kaW5nVG9rZW5zIHN0b3JlIGRhdGEKLy8KLy8gYWNjcnVhbFBlbmRpbmdUb2tlbnMgaXMgdGhlIHNldCBvZiB0b2tlbiBwYXRocyB0aGF0IHN0aWxsIG93biBhdCBsZWFzdCBvbmUgYWNjcnVhbAovLyBidWNrZXQsIHNvIGdvdi9zdGFrZXIgY2FuIGVudW1lcmF0ZSB3aGF0IGl0IGhhcyB0byBmb2xkIHdpdGhvdXQgc2Nhbm5pbmcgZXZlcnkgdG9rZW4uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IFRydWUgd2hlbiB0aGUgcGVuZGluZy10b2tlbiBpbmRleCBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIEhhc0FjY3J1YWxQZW5kaW5nVG9rZW5zU3RvcmVLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5QWNjcnVhbFBlbmRpbmdUb2tlbnMuU3RyaW5nKCkpCn0KCi8vIEluaXRpYWxpemVBY2NydWFsUGVuZGluZ1Rva2VucyBjcmVhdGVzIHRoZSBpbmRleCBvZiB0b2tlbnMgd2l0aCBwZW5kaW5nIGFjY3J1YWwgYnVja2V0cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IENyb3NzaW5nIGRpc2NyaW1pbmF0b3IgZm9yIHRoZSBzdG9yZSBvcGVyYXRpb247IHBhc3MgMC4KLy8gICAtIHJsbTogUHJvcGFnYXRlZCByZWFsbSBjb250ZXh0IGZvciB0aGlzIHN0b3JlIHdyaXRlOyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdGhlIHBlbmRpbmctdG9rZW4gaW5kZXggaXMgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSB0aGUgY3VycmVudC1yZWFsbSBvciBLVi1zdG9yZSB3cml0ZSBlcnJvci4KZnVuYyAocyAqcHJvdG9jb2xGZWVTdG9yZSkgSW5pdGlhbGl6ZUFjY3J1YWxQZW5kaW5nVG9rZW5zKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWNjcnVhbFBlbmRpbmdUb2tlbnMuU3RyaW5nKCksIE5ld0JQVHJlZU4oMTYpKQp9CgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBnZXRBY2NydWFsUGVuZGluZ1Rva2VuVHJlZSgpICpicHRyZWUuQlBUcmVlIHsKCWFjY3J1YWxQZW5kaW5nVG9rZW5zLCBlcnIgOj0gcy5rdlN0b3JlLkdldEJQVHJlZShTdG9yZUtleUFjY3J1YWxQZW5kaW5nVG9rZW5zLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCXJldHVybiBhY2NydWFsUGVuZGluZ1Rva2Vucwp9CgovLyBHZXRBY2NydWFsUGVuZGluZ1Rva2VucyByZXR1cm5zIHRva2VuIHBhdGhzIHRoYXQgc3RpbGwgb3duIGFjY3J1YWwgYnVja2V0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRva2VuUGF0aHM6IFRva2VuIHBhdGhzIGluIHRoZSBwZW5kaW5nLWFjY3J1YWwgaW5kZXgsIGluIEJQLXRyZWUgaXRlcmF0aW9uIG9yZGVyLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBHZXRBY2NydWFsUGVuZGluZ1Rva2VucygpIFtdc3RyaW5nIHsKCXJldHVybiBjb2xsZWN0VHJlZUtleXMocy5nZXRBY2NydWFsUGVuZGluZ1Rva2VuVHJlZSgpKQp9CgovLyBBZGRBY2NydWFsUGVuZGluZ1Rva2VuIGFkZHMgdG9rZW5QYXRoIHRvIHRoZSBwZW5kaW5nLWFjY3J1YWwgaW5kZXguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggd2l0aCBhdCBsZWFzdCBvbmUgYWNjcnVhbCBidWNrZXQgcGVuZGluZy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdG9rZW5QYXRoIGlzIGFscmVhZHkgcHJlc2VudCBvciBoYXMgYmVlbiBhZGRlZDsgb3RoZXJ3aXNlIHRoZSBjdXJyZW50LXJlYWxtIG9yIEtWLXN0b3JlIHdyaXRlIGVycm9yLgpmdW5jIChzICpwcm90b2NvbEZlZVN0b3JlKSBBZGRBY2NydWFsUGVuZGluZ1Rva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KGVyclNwb29mZWRSZWFsbSkKCX0KCglhY2NydWFsUGVuZGluZ1Rva2VucyA6PSBzLmdldEFjY3J1YWxQZW5kaW5nVG9rZW5UcmVlKCkKCWlmIGFjY3J1YWxQZW5kaW5nVG9rZW5zLkhhcyh0b2tlblBhdGgpIHsKCQlyZXR1cm4gbmlsCgl9CgoJYWNjcnVhbFBlbmRpbmdUb2tlbnMuU2V0KHRva2VuUGF0aCwgdHJ1ZSkKCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWNjcnVhbFBlbmRpbmdUb2tlbnMuU3RyaW5nKCksIGFjY3J1YWxQZW5kaW5nVG9rZW5zKQp9CgovLyBSZW1vdmVBY2NydWFsUGVuZGluZ1Rva2VuIGRyb3BzIG9uZSB0b2tlbiBmcm9tIHRoZSBzZXQuIEl0IHdyaXRlcyBvbmx5IHdoZW4gdGhlCi8vIHRva2VuIHdhcyBsaXN0ZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBDcm9zc2luZyBkaXNjcmltaW5hdG9yIGZvciB0aGUgc3RvcmUgb3BlcmF0aW9uOyBwYXNzIDAuCi8vICAgLSBybG06IFByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dCBmb3IgdGhpcyBzdG9yZSB3cml0ZTsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCkuCi8vICAgLSB0b2tlblBhdGg6IFRva2VuIHBhdGggdG8gcmVtb3ZlIGZyb20gdGhlIHBlbmRpbmctYWNjcnVhbCBpbmRleC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogTmlsIHdoZW4gdG9rZW5QYXRoIGlzIGFic2VudCBvciBoYXMgYmVlbiByZW1vdmVkOyBvdGhlcndpc2UgdGhlIGN1cnJlbnQtcmVhbG0gb3IgS1Ytc3RvcmUgd3JpdGUgZXJyb3IuCmZ1bmMgKHMgKnByb3RvY29sRmVlU3RvcmUpIFJlbW92ZUFjY3J1YWxQZW5kaW5nVG9rZW4oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoZXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCWFjY3J1YWxQZW5kaW5nVG9rZW5zIDo9IHMuZ2V0QWNjcnVhbFBlbmRpbmdUb2tlblRyZWUoKQoJaWYgXywgcmVtb3ZlZCA6PSBhY2NydWFsUGVuZGluZ1Rva2Vucy5SZW1vdmUodG9rZW5QYXRoKTsgIXJlbW92ZWQgewoJCXJldHVybiBuaWwKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5QWNjcnVhbFBlbmRpbmdUb2tlbnMuU3RyaW5nKCksIGFjY3J1YWxQZW5kaW5nVG9rZW5zKQp9CgpmdW5jIGNvbGxlY3RUcmVlS2V5cyh0cmVlICpicHRyZWUuQlBUcmVlKSBbXXN0cmluZyB7CglrZXlzIDo9IG1ha2UoW11zdHJpbmcsIDAsIHRyZWUuU2l6ZSgpKQoJdHJlZS5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJa2V5cyA9IGFwcGVuZChrZXlzLCBrZXkpCgkJcmV0dXJuIGZhbHNlCgl9KQoKCXJldHVybiBrZXlzCn0KCmZ1bmMgZW5jb2RlRXBvY2hLZXkoZXBvY2ggaW50NjQpIHN0cmluZyB7CglpZiBlcG9jaCA8IDAgewoJCXBhbmljKHVmbXQuU3ByaW50ZigibmVnYXRpdmUgZXBvY2ggbm90IHN1cHBvcnRlZDogJWQiLCBlcG9jaCkpCgl9CgoJcmV0dXJuIHV0aWxzLkVuY29kZVVpbnQ2NCh1aW50NjQoZXBvY2gpKQp9CgpmdW5jIGRlY29kZUVwb2NoS2V5KGtleSBzdHJpbmcpIGludDY0IHsKCXJldHVybiBnbnNtYXRoLlNhZmVVaW50NjRUb0ludDY0KHV0aWxzLkRlY29kZVVpbnQ2NChrZXkpKQp9CgovLyBOZXdQcm90b2NvbEZlZVN0b3JlIGNyZWF0ZXMgYSBwcm90b2NvbC1mZWUgc3RvcmUgYmFja2VkIGJ5IHRoZSBwcm92aWRlZCBLViBzdG9yZS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSB1cGdyYWRlIHN5c3RlbSB0byBjcmVhdGUgc3RvcmFnZSBpbnN0YW5jZXMgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrdlN0b3JlOiBEb21haW4gS1Ygc3RvcmUgdXNlZCB0byBwZXJzaXN0IHByb3RvY29sLWZlZSBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb3RvY29sRmVlU3RvcmU6IEFuIElQcm90b2NvbEZlZVN0b3JlIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBrdlN0b3JlLgpmdW5jIE5ld1Byb3RvY29sRmVlU3RvcmUoa3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBJUHJvdG9jb2xGZWVTdG9yZSB7CglyZXR1cm4gJnByb3RvY29sRmVlU3RvcmV7CgkJa3ZTdG9yZToga3ZTdG9yZSwKCX0KfQoapL4BCgl0eXBlcy5nbm8Slb4BcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCBicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoKdHlwZSBJUHJvdG9jb2xGZWUgaW50ZXJmYWNlIHsKCUlQcm90b2NvbEZlZU1hbmFnZXIKCUlQcm90b2NvbEZlZUdldHRlcgoJUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcKfQoKdHlwZSBJUHJvdG9jb2xGZWVNYW5hZ2VyIGludGVyZmFjZSB7CgkvLyBNdXRhdGluZyBtZXRob2RzIHRha2UgYF8gaW50LCBybG0gcmVhbG1gIHNvIGEgbGVhZGluZyBpbnRlZ2VyIGRpc2NyaW1pbmF0b3IKCS8vIChjYWxsZXJzIHBhc3MgMCkgYW5kIHRoZSBjdXJyZW50IHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IGFyZSB0aHJlYWRlZAoJLy8gZnJvbSBwcm94eSBlbnRyeSBwb2ludHMgZG93biB0byBjcm9zcy1yZWFsbSB0b2tlbiB0cmFuc2ZlcnMgYW5kIHN0b3JlIHdyaXRlcwoJLy8gcGVyZm9ybWVkIGluc2lkZSBlYWNoIGltcGxlbWVudGF0aW9uLiBUaGUgZGlzY3JpbWluYXRvciBpcyBleHBsaWNpdCBhdCBldmVyeQoJLy8gY2FsbCBzaXRlLCBtYWtpbmcgdGhlIHJlYWxtIHRocmVhZGluZyB2aXNpYmxlIHRvIHJlYWRlcnMuCgkvLyBEaXN0cmlidXRlUHJvdG9jb2xGZWUgZGlzdHJpYnV0ZXMgYWxsIHJlc2VydmVkIHByb3RvY29sIGZlZXMgdG8gRGV2T3BzIGFuZAoJLy8gR292U3Rha2VyIGFjY29yZGluZyB0byB0aGUgY29uZmlndXJlZCBhbGxvY2F0aW9uIHBlcmNlbnRhZ2VzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQKCURpc3RyaWJ1dGVQcm90b2NvbEZlZShfIGludCwgcmxtIHJlYWxtKQoKCS8vIERpc3RyaWJ1dGVQcm90b2NvbEZlZUJ5VG9rZW5QYXRoIGRpc3RyaWJ1dGVzIHRoZSByZXNlcnZlZCBmZWUgZm9yIG9uZSB0b2tlbiBwYXRoLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgcmVzZXJ2ZWQgZmVlIHNob3VsZCBiZSBkaXN0cmlidXRlZAoJRGlzdHJpYnV0ZVByb3RvY29sRmVlQnlUb2tlblBhdGgoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykKCgkvLyBTZXREZXZPcHNQY3QgdXBkYXRlcyB0aGUgRGV2T3BzIHNoYXJlOyB0aGUgR292U3Rha2VyIHNoYXJlIGJlY29tZXMgMTAwMDAgbWludXMgcGN0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQKCS8vICAgLSBwY3Q6IERldk9wcyBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzLCBmcm9tIDAgdGhyb3VnaCAxMDAwMCBpbmNsdXNpdmUKCVNldERldk9wc1BjdChfIGludCwgcmxtIHJlYWxtLCBwY3QgaW50NjQpCgoJLy8gU2V0R292U3Rha2VyUGN0IHVwZGF0ZXMgdGhlIEdvdlN0YWtlciBzaGFyZTsgdGhlIERldk9wcyBzaGFyZSBiZWNvbWVzIDEwMDAwIG1pbnVzIHBjdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQ7IGltcGxlbWVudGF0aW9uIHZhbGlkYXRlcyBpdCBhcyBjdXJyZW50CgkvLyAgIC0gcGN0OiBHb3ZTdGFrZXIgYWxsb2NhdGlvbiBpbiBiYXNpcy1wb2ludCB1bml0cywgZnJvbSAwIHRocm91Z2ggMTAwMDAgaW5jbHVzaXZlCglTZXRHb3ZTdGFrZXJQY3QoXyBpbnQsIHJsbSByZWFsbSwgcGN0IGludDY0KQoKCS8vIEFkZFRvUHJvdG9jb2xGZWUgcmVjb3JkcyBhbmQgcHVsbHMgYW4gYXBwcm92ZWQgZmVlIGZyb20gYW4gYXV0aG9yaXplZCBwcm90b2NvbCBjYWxsZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbiByZWplY3RzIGEgbm9uLWN1cnJlbnQgdmFsdWUKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggZnJvbSB3aGljaCB0aGUgYXBwcm92ZWQgZmVlIGlzIHB1bGxlZAoJLy8gICAtIGFtb3VudDogbm9uLW5lZ2F0aXZlIGZlZSBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0czsgemVybyBpcyBhIHN1Y2Nlc3NmdWwgbm8tb3AKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIGFmdGVyIGFjY291bnRpbmcgYW5kIHRyYW5zZmVyIHN1Y2NlZWQ7IGFuIGVycm9yIHdoZW4gcmVhbG0gdmFsaWRhdGlvbiwgaGFsdCBjaGVja3MsIG9yIHN0b3JhZ2UvdHJhbnNmZXIgb3BlcmF0aW9ucyBmYWlsCglBZGRUb1Byb3RvY29sRmVlKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGFtb3VudCBpbnQ2NCkgZXJyb3IKCgkvLyBBZHZhbmNlQWNjcnVhbEVwb2NoIGNsb3NlcyB0aGUgY3VycmVudCBlcG9jaCBhbmQgc2VsZWN0cyB0aGUgbmV4dCBlcG9jaCBmb3IgbmV3IGZlZXMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0OyBpbXBsZW1lbnRhdGlvbiB2YWxpZGF0ZXMgaXQgYXMgY3VycmVudAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXBvY2g6IG5ld2x5IHN0b3JlZCBub24tbmVnYXRpdmUgYWNjcnVhbCBlcG9jaAoJQWR2YW5jZUFjY3J1YWxFcG9jaChfIGludCwgcmxtIHJlYWxtKSBpbnQ2NAoKCS8vIENvbnN1bWVBY2NydWFsQnVja2V0cyByZW1vdmVzIHBlbmRpbmcgYnVja2V0cyBmb3Igb25lIHRva2VuIGluIGVwb2NoIG9yZGVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dDsgaW1wbGVtZW50YXRpb24gdmFsaWRhdGVzIGl0IGFzIGN1cnJlbnQKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgcGVuZGluZyBHb3ZTdGFrZXIgYnVja2V0cyBhcmUgY29uc3VtZWQKCS8vICAgLSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2Ygb2xkZXN0IGJ1Y2tldHM7IHplcm8gb3IgbmVnYXRpdmUgY29uc3VtZXMgYWxsIHBlbmRpbmcgYnVja2V0cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXBvY2hzOiBjb25zdW1lZCBlcG9jaCBudW1iZXJzIGluIGFzY2VuZGluZyBvcmRlcgoJLy8gICAtIGFtb3VudHM6IGZlZSBhbW91bnRzIGNvcnJlc3BvbmRpbmcgcG9zaXRpb25hbGx5IHRvIGVwb2NocywgaW4gdG9rZW4gYmFzZSB1bml0cwoJQ29uc3VtZUFjY3J1YWxCdWNrZXRzKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGxpbWl0IGludCkgKFtdaW50NjQsIFtdaW50NjQpCn0KCnR5cGUgSVByb3RvY29sRmVlR2V0dGVyIGludGVyZmFjZSB7CgkvLyBHZXREZXZPcHNQY3QgcmV0dXJucyB0aGUgY29uZmlndXJlZCBEZXZPcHMgYWxsb2NhdGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBjdDogRGV2T3BzIGZlZSBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzLCBmcm9tIDAgdGhyb3VnaCAxMDAwMAoJR2V0RGV2T3BzUGN0KCkgaW50NjQKCgkvLyBHZXRHb3ZTdGFrZXJQY3QgcmV0dXJucyB0aGUgY29uZmlndXJlZCBHb3ZTdGFrZXIgYWxsb2NhdGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHBjdDogR292U3Rha2VyIGZlZSBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzLCBmcm9tIDAgdGhyb3VnaCAxMDAwMAoJR2V0R292U3Rha2VyUGN0KCkgaW50NjQKCgkvLyBHZXRSZXNlcnZlZFRva2VucyByZXR1cm5zIHRva2VuIHBhdGhzIHdob3NlIGNvbGxlY3RlZCBmZWVzIGF3YWl0IGRpc3RyaWJ1dGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2VuUGF0aHM6IHRva2VuIGNvbnRyYWN0IHBhdGhzIGluIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleAoJR2V0UmVzZXJ2ZWRUb2tlbnMoKSBbXXN0cmluZwoKCS8vIEdldEFjY3VUcmFuc2ZlcnNUb0dvdlN0YWtlciByZXR1cm5zIGN1bXVsYXRpdmUgYWxsb2NhdGlvbnMgYXNzaWduZWQgdG8gR292U3Rha2VyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdHJhbnNmZXJzOiBtYXAgZnJvbSB0b2tlbiBjb250cmFjdCBwYXRoIHRvIGN1bXVsYXRpdmUgYWxsb2NhdGVkIGFtb3VudCBpbiBiYXNlIHVuaXRzCglHZXRBY2N1VHJhbnNmZXJzVG9Hb3ZTdGFrZXIoKSBtYXBbc3RyaW5nXWludDY0CgoJLy8gR2V0QWNjdVRyYW5zZmVyc1RvRGV2T3BzIHJldHVybnMgY3VtdWxhdGl2ZSBhbGxvY2F0aW9ucyBhc3NpZ25lZCB0byBEZXZPcHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0cmFuc2ZlcnM6IG1hcCBmcm9tIHRva2VuIGNvbnRyYWN0IHBhdGggdG8gY3VtdWxhdGl2ZSBhbGxvY2F0ZWQgYW1vdW50IGluIGJhc2UgdW5pdHMKCUdldEFjY3VUcmFuc2ZlcnNUb0Rldk9wcygpIG1hcFtzdHJpbmddaW50NjQKCgkvLyBHZXRBY2N1VHJhbnNmZXJUb0dvdlN0YWtlckJ5VG9rZW5QYXRoIHJldHVybnMgdGhlIEdvdlN0YWtlciBhbGxvY2F0aW9uIGZvciBvbmUgdG9rZW4uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIGN1bXVsYXRpdmUgR292U3Rha2VyIGFsbG9jYXRpb24gaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIEdvdlN0YWtlciBhbGxvY2F0aW9uIGZvciBwYXRoIGluIHRva2VuIGJhc2UgdW5pdHMsIG9yIHplcm8gaWYgYWJzZW50CglHZXRBY2N1VHJhbnNmZXJUb0dvdlN0YWtlckJ5VG9rZW5QYXRoKHBhdGggc3RyaW5nKSBpbnQ2NAoKCS8vIEdldEFjY3VUcmFuc2ZlclRvRGV2T3BzQnlUb2tlblBhdGggcmV0dXJucyB0aGUgRGV2T3BzIGFsbG9jYXRpb24gZm9yIG9uZSB0b2tlbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiBpcyBxdWVyaWVkCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IGN1bXVsYXRpdmUgRGV2T3BzIGFsbG9jYXRpb24gZm9yIHBhdGggaW4gdG9rZW4gYmFzZSB1bml0cywgb3IgemVybyBpZiBhYnNlbnQKCUdldEFjY3VUcmFuc2ZlclRvRGV2T3BzQnlUb2tlblBhdGgocGF0aCBzdHJpbmcpIGludDY0CgoJLy8gR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlciByZXR1cm5zIGN1bXVsYXRpdmUgYW1vdW50cyB0cmFuc2ZlcnJlZCB0byBHb3ZTdGFrZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0cmFuc2ZlcnM6IG1hcCBmcm9tIHRva2VuIGNvbnRyYWN0IHBhdGggdG8gY3VtdWxhdGl2ZSBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgaW4gYmFzZSB1bml0cwoJR2V0QWN0dWFsRGlzdHJpYnV0ZWRUb0dvdlN0YWtlcigpIG1hcFtzdHJpbmddaW50NjQKCgkvLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzIHJldHVybnMgY3VtdWxhdGl2ZSBhbW91bnRzIHRyYW5zZmVycmVkIHRvIERldk9wcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRyYW5zZmVyczogbWFwIGZyb20gdG9rZW4gY29udHJhY3QgcGF0aCB0byBjdW11bGF0aXZlIGFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCBpbiBiYXNlIHVuaXRzCglHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzKCkgbWFwW3N0cmluZ11pbnQ2NAoKCS8vIEdldEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aCByZXR1cm5zIHRoZSBjb21wbGV0ZWQgR292U3Rha2VyIHRyYW5zZmVyIGZvciBvbmUgdG9rZW4uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIGNvbXBsZXRlZCBHb3ZTdGFrZXIgdHJhbnNmZXIgaXMgcXVlcmllZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIEdvdlN0YWtlciBhbW91bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgZm9yIHBhdGggaW4gYmFzZSB1bml0cywgb3IgemVybyBpZiBhYnNlbnQKCUdldEFjdHVhbERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJCeVRva2VuUGF0aChwYXRoIHN0cmluZykgaW50NjQKCgkvLyBHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzQnlUb2tlblBhdGggcmV0dXJucyB0aGUgY29tcGxldGVkIERldk9wcyB0cmFuc2ZlciBmb3Igb25lIHRva2VuLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBjb21wbGV0ZWQgRGV2T3BzIHRyYW5zZmVyIGlzIHF1ZXJpZWQKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBEZXZPcHMgYW1vdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkIGZvciBwYXRoIGluIGJhc2UgdW5pdHMsIG9yIHplcm8gaWYgYWJzZW50CglHZXRBY3R1YWxEaXN0cmlidXRlZFRvRGV2T3BzQnlUb2tlblBhdGgocGF0aCBzdHJpbmcpIGludDY0CgoJLy8gR2V0QWNjcnVhbEVwb2NoIHJldHVybnMgdGhlIGVwb2NoIGFzc2lnbmVkIHRvIG5ld2x5IGNvbGxlY3RlZCBHb3ZTdGFrZXIgZmVlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVwb2NoOiBjdXJyZW50IG5vbi1uZWdhdGl2ZSBhY2NydWFsIGVwb2NoCglHZXRBY2NydWFsRXBvY2goKSBpbnQ2NAoKCS8vIEdldEFjY3J1YWxQZW5kaW5nVG9rZW5zIHJldHVybnMgdG9rZW4gcGF0aHMgdGhhdCBzdGlsbCBoYXZlIHBlbmRpbmcgYWNjcnVhbCBidWNrZXRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdG9rZW5QYXRoczogdG9rZW4gY29udHJhY3QgcGF0aHMgd2l0aCBhdCBsZWFzdCBvbmUgcGVuZGluZyBHb3ZTdGFrZXIgYWNjcnVhbCBidWNrZXQKCUdldEFjY3J1YWxQZW5kaW5nVG9rZW5zKCkgW11zdHJpbmcKCgkvLyBHZXRBY2NydWFsQnVja2V0cyByZWFkcyBwZW5kaW5nIHRva2VuIGJ1Y2tldHMgd2l0aG91dCByZW1vdmluZyB0aGVtLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHdob3NlIEdvdlN0YWtlciBhY2NydWFsIGJ1Y2tldHMgYXJlIHF1ZXJpZWQKCS8vICAgLSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2Ygb2xkZXN0IGJ1Y2tldHM7IHplcm8gb3IgbmVnYXRpdmUgcmV0dXJucyBhbGwgcGVuZGluZyBidWNrZXRzCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcG9jaHM6IHNlbGVjdGVkIGFjY3J1YWwgZXBvY2ggbnVtYmVycyBpbiBhc2NlbmRpbmcgb3JkZXIKCS8vICAgLSBhbW91bnRzOiBmZWUgYW1vdW50cyBjb3JyZXNwb25kaW5nIHBvc2l0aW9uYWxseSB0byBlcG9jaHMsIGluIHRva2VuIGJhc2UgdW5pdHMKCUdldEFjY3J1YWxCdWNrZXRzKHRva2VuUGF0aCBzdHJpbmcsIGxpbWl0IGludCkgKFtdaW50NjQsIFtdaW50NjQpCn0KCnR5cGUgSVByb3RvY29sRmVlU3RvcmUgaW50ZXJmYWNlIHsKCS8vIEhhc0Rldk9wc1BjdFN0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcGVyc2lzdGVkIERldk9wcyBwZXJjZW50YWdlIGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgRGV2T3BzIHBlcmNlbnRhZ2Uga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlCglIYXNEZXZPcHNQY3RTdG9yZUtleSgpIGJvb2wKCgkvLyBJbml0aWFsaXplRGV2T3BzUGN0IGNyZWF0ZXMgdGhlIERldk9wcyBwZXJjZW50YWdlIGtleSB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZURldk9wc1BjdChfIGludCwgcmxtIHJlYWxtKSBlcnJvcgoKCS8vIEdldERldk9wc1BjdCByZWFkcyB0aGUgcGVyc2lzdGVkIERldk9wcyBwZXJjZW50YWdlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcGN0OiBzdG9yZWQgRGV2T3BzIGFsbG9jYXRpb24gaW4gYmFzaXMtcG9pbnQgdW5pdHMKCUdldERldk9wc1BjdCgpIGludDY0CgoJLy8gU2V0RGV2T3BzUGN0IHBlcnNpc3RzIGEgbmV3IERldk9wcyBwZXJjZW50YWdlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vICAgLSBwY3Q6IERldk9wcyBhbGxvY2F0aW9uIGluIGJhc2lzLXBvaW50IHVuaXRzCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSB2YWx1ZSBpcyBzdG9yZWQ7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJU2V0RGV2T3BzUGN0KF8gaW50LCBybG0gcmVhbG0sIHBjdCBpbnQ2NCkgZXJyb3IKCgkvLyBIYXNBY2N1VG9Hb3ZTdGFrZXJTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIEdvdlN0YWtlciBhbGxvY2F0aW9uIHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBjdW11bGF0aXZlIEdvdlN0YWtlciBhbGxvY2F0aW9uIHRyZWUgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUKCUhhc0FjY3VUb0dvdlN0YWtlclN0b3JlS2V5KCkgYm9vbAoKCS8vIEluaXRpYWxpemVBY2N1VG9Hb3ZTdGFrZXIgY3JlYXRlcyB0aGUgY3VtdWxhdGl2ZSBHb3ZTdGFrZXIgYWxsb2NhdGlvbiB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZUFjY3VUb0dvdlN0YWtlcihfIGludCwgcmxtIHJlYWxtKSBlcnJvcgoKCS8vIEdldEFjY3VUb0dvdlN0YWtlciByZXR1cm5zIHRoZSB0cmVlIG9mIGN1bXVsYXRpdmUgR292U3Rha2VyIGFsbG9jYXRpb25zIGJ5IHRva2VuLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdHJlZTogcGVyc2lzdGVudCBCUFRyZWUga2V5ZWQgYnkgdG9rZW4gcGF0aCB3aXRoIGludDY0IGFsbG9jYXRpb24gdmFsdWVzCglHZXRBY2N1VG9Hb3ZTdGFrZXIoKSAqYnB0cmVlLkJQVHJlZQoKCS8vIEdldEFjY3VUb0dvdlN0YWtlckl0ZW0gcmVhZHMgb25lIHRva2VuJ3MgY3VtdWxhdGl2ZSBHb3ZTdGFrZXIgYWxsb2NhdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBhbGxvY2F0aW9uLXRyZWUga2V5CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IHN0b3JlZCBhbGxvY2F0aW9uIGluIHRva2VuIGJhc2UgdW5pdHMsIG9yIHplcm8gd2hlbiB0b2tlblBhdGggaXMgYWJzZW50CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdG9rZW5QYXRoIGhhcyBhIHN0b3JlZCBhbGxvY2F0aW9uOyBmYWxzZSB3aGVuIGFic2VudAoJR2V0QWNjdVRvR292U3Rha2VySXRlbSh0b2tlblBhdGggc3RyaW5nKSAoaW50NjQsIGJvb2wpCgoJLy8gU2V0QWNjdVRvR292U3Rha2VySXRlbSBzdG9yZXMgb25lIHRva2VuJ3MgY3VtdWxhdGl2ZSBHb3ZTdGFrZXIgYWxsb2NhdGlvbi4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JlIHdyaXRlCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHVzZWQgYXMgdGhlIGFsbG9jYXRpb24tdHJlZSBrZXkKCS8vICAgLSBhbW91bnQ6IGN1bXVsYXRpdmUgR292U3Rha2VyIGFsbG9jYXRpb24gaW4gdG9rZW4gYmFzZSB1bml0cyB0byBzdG9yZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdmFsdWUgaXMgc3RvcmVkOyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0LCBtaXNzaW5nIHRyZWUsIG9yIEtWLXN0b3JlIGZhaWx1cmUKCVNldEFjY3VUb0dvdlN0YWtlckl0ZW0oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZywgYW1vdW50IGludDY0KSBlcnJvcgoKCS8vIEhhc0FjY3VUb0Rldk9wc1N0b3JlS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgRGV2T3BzIGFsbG9jYXRpb24gdHJlZSBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIGN1bXVsYXRpdmUgRGV2T3BzIGFsbG9jYXRpb24gdHJlZSBpcyBwcmVzZW50IGluIHRoZSBLViBzdG9yZQoJSGFzQWNjdVRvRGV2T3BzU3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZUFjY3VUb0Rldk9wcyBjcmVhdGVzIHRoZSBjdW11bGF0aXZlIERldk9wcyBhbGxvY2F0aW9uIHRyZWUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiBpbml0aWFsaXphdGlvbiBzdWNjZWVkczsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglJbml0aWFsaXplQWNjdVRvRGV2T3BzKF8gaW50LCBybG0gcmVhbG0pIGVycm9yCgoJLy8gR2V0QWNjdVRvRGV2T3BzIHJldHVybnMgdGhlIHRyZWUgb2YgY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbnMgYnkgdG9rZW4uCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0cmVlOiBwZXJzaXN0ZW50IEJQVHJlZSBrZXllZCBieSB0b2tlbiBwYXRoIHdpdGggaW50NjQgYWxsb2NhdGlvbiB2YWx1ZXMKCUdldEFjY3VUb0Rldk9wcygpICpicHRyZWUuQlBUcmVlCgoJLy8gR2V0QWNjdVRvRGV2T3BzSXRlbSByZWFkcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIERldk9wcyBhbGxvY2F0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHVzZWQgYXMgdGhlIGFsbG9jYXRpb24tdHJlZSBrZXkKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogc3RvcmVkIGFsbG9jYXRpb24gaW4gdG9rZW4gYmFzZSB1bml0cywgb3IgemVybyB3aGVuIHRva2VuUGF0aCBpcyBhYnNlbnQKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgc3RvcmVkIGFsbG9jYXRpb247IGZhbHNlIHdoZW4gYWJzZW50CglHZXRBY2N1VG9EZXZPcHNJdGVtKHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkKCgkvLyBTZXRBY2N1VG9EZXZPcHNJdGVtIHN0b3JlcyBvbmUgdG9rZW4ncyBjdW11bGF0aXZlIERldk9wcyBhbGxvY2F0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggdXNlZCBhcyB0aGUgYWxsb2NhdGlvbi10cmVlIGtleQoJLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBEZXZPcHMgYWxsb2NhdGlvbiBpbiB0b2tlbiBiYXNlIHVuaXRzIHRvIHN0b3JlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSB2YWx1ZSBpcyBzdG9yZWQ7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQsIG1pc3NpbmcgdHJlZSwgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJU2V0QWNjdVRvRGV2T3BzSXRlbShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gSGFzRGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnlTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIEdvdlN0YWtlciBoaXN0b3J5IHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBjdW11bGF0aXZlIEdvdlN0YWtlciBkaXN0cmlidXRpb24taGlzdG9yeSB0cmVlIGlzIHByZXNlbnQKCUhhc0Rpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5U3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5IGNyZWF0ZXMgdGhlIEdvdlN0YWtlciBkaXN0cmlidXRpb24taGlzdG9yeSB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5KF8gaW50LCBybG0gcmVhbG0pIGVycm9yCgoJLy8gR2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnkgcmV0dXJucyBjdW11bGF0aXZlIGFjdHVhbCBHb3ZTdGFrZXIgdHJhbnNmZXJzIGJ5IHRva2VuLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdHJlZTogcGVyc2lzdGVudCBCUFRyZWUga2V5ZWQgYnkgdG9rZW4gcGF0aCB3aXRoIGludDY0IHRyYW5zZmVycmVkIGFtb3VudHMKCUdldERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5KCkgKmJwdHJlZS5CUFRyZWUKCgkvLyBHZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeUl0ZW0gcmVhZHMgb25lIHRva2VuJ3MgYWN0dWFsIEdvdlN0YWtlciB0cmFuc2Zlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBoaXN0b3J5LXRyZWUga2V5CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IHN0b3JlZCB0cmFuc2ZlcnJlZCBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0cywgb3IgemVybyB3aGVuIHRva2VuUGF0aCBpcyBhYnNlbnQKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgc3RvcmVkIGhpc3RvcnkgYW1vdW50OyBmYWxzZSB3aGVuIGFic2VudAoJR2V0RGlzdHJpYnV0ZWRUb0dvdlN0YWtlckhpc3RvcnlJdGVtKHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkKCgkvLyBTZXREaXN0cmlidXRlZFRvR292U3Rha2VySGlzdG9yeUl0ZW0gc3RvcmVzIG9uZSB0b2tlbidzIGFjdHVhbCBHb3ZTdGFrZXIgdHJhbnNmZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBoaXN0b3J5LXRyZWUga2V5CgkvLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIGFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCB0byBHb3ZTdGFrZXIgaW4gdG9rZW4gYmFzZSB1bml0cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdmFsdWUgaXMgc3RvcmVkOyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0LCBtaXNzaW5nIHRyZWUsIG9yIEtWLXN0b3JlIGZhaWx1cmUKCVNldERpc3RyaWJ1dGVkVG9Hb3ZTdGFrZXJIaXN0b3J5SXRlbShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gSGFzRGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnlTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIERldk9wcyBoaXN0b3J5IHRyZWUga2V5IGV4aXN0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBjdW11bGF0aXZlIERldk9wcyBkaXN0cmlidXRpb24taGlzdG9yeSB0cmVlIGlzIHByZXNlbnQKCUhhc0Rpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5U3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5IGNyZWF0ZXMgdGhlIERldk9wcyBkaXN0cmlidXRpb24taGlzdG9yeSB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZURpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5KF8gaW50LCBybG0gcmVhbG0pIGVycm9yCgoJLy8gR2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnkgcmV0dXJucyBjdW11bGF0aXZlIGFjdHVhbCBEZXZPcHMgdHJhbnNmZXJzIGJ5IHRva2VuLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdHJlZTogcGVyc2lzdGVudCBCUFRyZWUga2V5ZWQgYnkgdG9rZW4gcGF0aCB3aXRoIGludDY0IHRyYW5zZmVycmVkIGFtb3VudHMKCUdldERpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5KCkgKmJwdHJlZS5CUFRyZWUKCgkvLyBHZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeUl0ZW0gcmVhZHMgb25lIHRva2VuJ3MgYWN0dWFsIERldk9wcyB0cmFuc2Zlci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBoaXN0b3J5LXRyZWUga2V5CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IHN0b3JlZCB0cmFuc2ZlcnJlZCBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0cywgb3IgemVybyB3aGVuIHRva2VuUGF0aCBpcyBhYnNlbnQKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0b2tlblBhdGggaGFzIGEgc3RvcmVkIGhpc3RvcnkgYW1vdW50OyBmYWxzZSB3aGVuIGFic2VudAoJR2V0RGlzdHJpYnV0ZWRUb0Rldk9wc0hpc3RvcnlJdGVtKHRva2VuUGF0aCBzdHJpbmcpIChpbnQ2NCwgYm9vbCkKCgkvLyBTZXREaXN0cmlidXRlZFRvRGV2T3BzSGlzdG9yeUl0ZW0gc3RvcmVzIG9uZSB0b2tlbidzIGFjdHVhbCBEZXZPcHMgdHJhbnNmZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB1c2VkIGFzIHRoZSBoaXN0b3J5LXRyZWUga2V5CgkvLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIGFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCB0byBEZXZPcHMgaW4gdG9rZW4gYmFzZSB1bml0cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdmFsdWUgaXMgc3RvcmVkOyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0LCBtaXNzaW5nIHRyZWUsIG9yIEtWLXN0b3JlIGZhaWx1cmUKCVNldERpc3RyaWJ1dGVkVG9EZXZPcHNIaXN0b3J5SXRlbShfIGludCwgcmxtIHJlYWxtLCB0b2tlblBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gSGFzUmVzZXJ2ZWRUb2tlbnNTdG9yZUtleSByZXBvcnRzIHdoZXRoZXIgdGhlIHJlc2VydmVkLXRva2VuIGluZGV4IGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcmVzZXJ2ZWQtdG9rZW4gaW5kZXggaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUKCUhhc1Jlc2VydmVkVG9rZW5zU3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZVJlc2VydmVkVG9rZW5zIGNyZWF0ZXMgdGhlIGVtcHR5IHJlc2VydmVkLXRva2VuIGluZGV4LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZVJlc2VydmVkVG9rZW5zKF8gaW50LCBybG0gcmVhbG0pIGVycm9yCgoJLy8gR2V0UmVzZXJ2ZWRUb2tlbnMgcmV0dXJucyB0b2tlbiBwYXRocyBjdXJyZW50bHkgbWFya2VkIGFzIGF3YWl0aW5nIGRpc3RyaWJ1dGlvbi4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2VuUGF0aHM6IGtleXMgaW4gdGhlIHJlc2VydmVkLXRva2VuIGluZGV4CglHZXRSZXNlcnZlZFRva2VucygpIFtdc3RyaW5nCgoJLy8gSGFzUmVzZXJ2ZWRUb2tlbiByZXBvcnRzIHdoZXRoZXIgdG9rZW5QYXRoIGlzIGluIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB0byBsb29rIHVwIGluIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdG9rZW5QYXRoIGlzIHJlc2VydmVkIGZvciBkaXN0cmlidXRpb24KCUhhc1Jlc2VydmVkVG9rZW4odG9rZW5QYXRoIHN0cmluZykgYm9vbAoKCS8vIEFkZFJlc2VydmVkVG9rZW4gbWFya3MgdG9rZW5QYXRoIGFzIGF3YWl0aW5nIGZlZSBkaXN0cmlidXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB0byBhZGQgdG8gdGhlIHJlc2VydmVkLXRva2VuIGluZGV4CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIGFkZGVkIG9yIGFscmVhZHkgcHJlc2VudDsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglBZGRSZXNlcnZlZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCgoJLy8gUmVtb3ZlUmVzZXJ2ZWRUb2tlbiByZW1vdmVzIHRva2VuUGF0aCBmcm9tIHRoZSByZXNlcnZlZC10b2tlbiBpbmRleCB3aGVuIHByZXNlbnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVzZXJ2ZWQtdG9rZW4gaW5kZXgKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gcmVtb3ZlZCBvciBhbHJlYWR5IGFic2VudDsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglSZW1vdmVSZXNlcnZlZFRva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCgoJLy8gSGFzQWNjcnVhbEVwb2NoU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBhY2NydWFsLWVwb2NoIGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgY3VycmVudCBhY2NydWFsIGVwb2NoIGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlCglIYXNBY2NydWFsRXBvY2hTdG9yZUtleSgpIGJvb2wKCgkvLyBJbml0aWFsaXplQWNjcnVhbEVwb2NoIGNyZWF0ZXMgdGhlIGFjY3J1YWwtZXBvY2gga2V5IHdpdGggZXBvY2ggemVyby4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JlIHdyaXRlCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRzOyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0IG9yIEtWLXN0b3JlIGZhaWx1cmUKCUluaXRpYWxpemVBY2NydWFsRXBvY2goXyBpbnQsIHJsbSByZWFsbSkgZXJyb3IKCgkvLyBHZXRBY2NydWFsRXBvY2ggcmVhZHMgdGhlIGVwb2NoIGN1cnJlbnRseSBhc3NpZ25lZCB0byBuZXdseSBjb2xsZWN0ZWQgZmVlcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVwb2NoOiBjdXJyZW50IG5vbi1uZWdhdGl2ZSBhY2NydWFsIGVwb2NoCglHZXRBY2NydWFsRXBvY2goKSBpbnQ2NAoKCS8vIFNldEFjY3J1YWxFcG9jaCBwZXJzaXN0cyBhIG5ldyBjdXJyZW50IGFjY3J1YWwgZXBvY2guCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8gICAtIGFjY3J1YWxFcG9jaDogZXBvY2ggbnVtYmVyIHRvIHN0b3JlIGZvciBzdWJzZXF1ZW50bHkgY29sbGVjdGVkIGZlZXMKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gdGhlIGVwb2NoIGlzIHN0b3JlZDsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglTZXRBY2NydWFsRXBvY2goXyBpbnQsIHJsbSByZWFsbSwgYWNjcnVhbEVwb2NoIGludDY0KSBlcnJvcgoKCS8vIEhhc0FjY3J1YWxCdWNrZXRzU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBhY2NydWFsLWJ1Y2tldHMgdHJlZSBrZXkgZXhpc3RzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHBlci10b2tlbiBhY2NydWFsLWJ1Y2tldCB0cmVlIGlzIHByZXNlbnQKCUhhc0FjY3J1YWxCdWNrZXRzU3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZUFjY3J1YWxCdWNrZXRzIGNyZWF0ZXMgdGhlIGVtcHR5IHBlci10b2tlbiBhY2NydWFsLWJ1Y2tldCB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbmlsIHdoZW4gaW5pdGlhbGl6YXRpb24gc3VjY2VlZHM7IGFuIGVycm9yIGZvciBpbnZhbGlkIHJlYWxtIGNvbnRleHQgb3IgS1Ytc3RvcmUgZmFpbHVyZQoJSW5pdGlhbGl6ZUFjY3J1YWxCdWNrZXRzKF8gaW50LCBybG0gcmVhbG0pIGVycm9yCgoJLy8gR2V0QWNjcnVhbEJ1Y2tldHMgcmVhZHMgdGhlIG9sZGVzdCBwZW5kaW5nIGJ1Y2tldHMgZm9yIG9uZSB0b2tlbiB3aXRob3V0IHJlbW92aW5nIHRoZW0uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgYWNjcnVhbCBidWNrZXRzIGFyZSBxdWVyaWVkCgkvLyAgIC0gbGltaXQ6IG1heGltdW0gbnVtYmVyIG9mIG9sZGVzdCBidWNrZXRzOyB6ZXJvIG9yIG5lZ2F0aXZlIHJldHVybnMgYWxsIHBlbmRpbmcgYnVja2V0cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXBvY2hzOiBzZWxlY3RlZCBhY2NydWFsIGVwb2NoIG51bWJlcnMgaW4gYXNjZW5kaW5nIG9yZGVyCgkvLyAgIC0gYW1vdW50czogYnVja2V0IGFtb3VudHMgY29ycmVzcG9uZGluZyBwb3NpdGlvbmFsbHkgdG8gZXBvY2hzLCBpbiB0b2tlbiBiYXNlIHVuaXRzCglHZXRBY2NydWFsQnVja2V0cyh0b2tlblBhdGggc3RyaW5nLCBsaW1pdCBpbnQpIChbXWludDY0LCBbXWludDY0KQoKCS8vIEFkZEFjY3J1YWxCdWNrZXQgYWRkcyBhbW91bnQgdG8gb25lIHRva2VuJ3MgYnVja2V0IGZvciBhbiBhY2NydWFsIGVwb2NoLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgYWNjcnVhbCBidWNrZXQgaXMgdXBkYXRlZAoJLy8gICAtIGVwb2NoOiBhY2NydWFsIGVwb2NoIHJlY2VpdmluZyB0aGUgZmVlIGFtb3VudAoJLy8gICAtIGFtb3VudDogZmVlIGFtb3VudCBpbiB0b2tlbiBiYXNlIHVuaXRzIHRvIGFkZCB0byB0aGF0IGVwb2NoIGJ1Y2tldAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgYnVja2V0IGlzIHN0b3JlZDsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglBZGRBY2NydWFsQnVja2V0KF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGVwb2NoIGludDY0LCBhbW91bnQgaW50NjQpIGVycm9yCgoJLy8gUmVtb3ZlQWNjcnVhbEJ1Y2tldHMgcmVtb3ZlcyBzcGVjaWZpZWQgZXBvY2ggYnVja2V0cyBmb3Igb25lIHRva2VuLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggd2hvc2UgYnVja2V0cyBhcmUgcmVtb3ZlZAoJLy8gICAtIGVwb2NoczogYWNjcnVhbCBlcG9jaCBudW1iZXJzIHRvIHJlbW92ZTsgYW4gZW1wdHkgcmVzdWx0IHJlbW92ZXMgbm8gYnVja2V0cwoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiByZW1vdmFsIHN1Y2NlZWRzOyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0IG9yIEtWLXN0b3JlIGZhaWx1cmUKCVJlbW92ZUFjY3J1YWxCdWNrZXRzKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcsIGVwb2NocyBbXWludDY0KSBlcnJvcgoKCS8vIEhhc0FjY3J1YWxQZW5kaW5nVG9rZW5zU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwZW5kaW5nLXRva2VuIGluZGV4IGtleSBleGlzdHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgaW5kZXggb2YgdG9rZW5zIHdpdGggcGVuZGluZyBidWNrZXRzIGlzIHByZXNlbnQKCUhhc0FjY3J1YWxQZW5kaW5nVG9rZW5zU3RvcmVLZXkoKSBib29sCgoJLy8gSW5pdGlhbGl6ZUFjY3J1YWxQZW5kaW5nVG9rZW5zIGNyZWF0ZXMgdGhlIGVtcHR5IHBlbmRpbmctdG9rZW4gaW5kZXguCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwCgkvLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHByb3RvY29sX2ZlZSByZWFsbSBjb250ZXh0IHJlcXVpcmVkIGZvciB0aGUgYXV0aG9yaXplZCBzdG9yZSB3cml0ZQoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiBpbml0aWFsaXphdGlvbiBzdWNjZWVkczsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglJbml0aWFsaXplQWNjcnVhbFBlbmRpbmdUb2tlbnMoXyBpbnQsIHJsbSByZWFsbSkgZXJyb3IKCgkvLyBHZXRBY2NydWFsUGVuZGluZ1Rva2VucyByZXR1cm5zIHRva2VuIHBhdGhzIGluZGV4ZWQgYXMgb3duaW5nIHBlbmRpbmcgYnVja2V0cy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRva2VuUGF0aHM6IHRva2VuIGNvbnRyYWN0IHBhdGhzIHByZXNlbnQgaW4gdGhlIHBlbmRpbmctdG9rZW4gaW5kZXgKCUdldEFjY3J1YWxQZW5kaW5nVG9rZW5zKCkgW11zdHJpbmcKCgkvLyBBZGRBY2NydWFsUGVuZGluZ1Rva2VuIG1hcmtzIGEgdG9rZW4gcGF0aCBhcyBvd25pbmcgYXQgbGVhc3Qgb25lIHBlbmRpbmcgYnVja2V0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMAoJLy8gICAtIHJsbTogcHJvcGFnYXRlZCBwcm90b2NvbF9mZWUgcmVhbG0gY29udGV4dCByZXF1aXJlZCBmb3IgdGhlIGF1dGhvcml6ZWQgc3RvcmUgd3JpdGUKCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIGNvbnRyYWN0IHBhdGggdG8gYWRkIHRvIHRoZSBwZW5kaW5nLXRva2VuIGluZGV4CgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5pbCB3aGVuIGFkZGVkIG9yIGFscmVhZHkgcHJlc2VudDsgYW4gZXJyb3IgZm9yIGludmFsaWQgcmVhbG0gY29udGV4dCBvciBLVi1zdG9yZSBmYWlsdXJlCglBZGRBY2NydWFsUGVuZGluZ1Rva2VuKF8gaW50LCBybG0gcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIGVycm9yCgoJLy8gUmVtb3ZlQWNjcnVhbFBlbmRpbmdUb2tlbiByZW1vdmVzIGEgdG9rZW4gcGF0aCBmcm9tIHRoZSBwZW5kaW5nLXRva2VuIGluZGV4IHdoZW4gcHJlc2VudC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAKCS8vICAgLSBybG06IHByb3BhZ2F0ZWQgcHJvdG9jb2xfZmVlIHJlYWxtIGNvbnRleHQgcmVxdWlyZWQgZm9yIHRoZSBhdXRob3JpemVkIHN0b3JlIHdyaXRlCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHRvIHJlbW92ZSBhZnRlciBpdHMgcGVuZGluZyBidWNrZXRzIGFyZSBjb25zdW1lZAoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBuaWwgd2hlbiByZW1vdmVkIG9yIGFscmVhZHkgYWJzZW50OyBhbiBlcnJvciBmb3IgaW52YWxpZCByZWFsbSBjb250ZXh0IG9yIEtWLXN0b3JlIGZhaWx1cmUKCVJlbW92ZUFjY3J1YWxQZW5kaW5nVG9rZW4oXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykgZXJyb3IKfQoasRgKC3VwZ3JhZGUuZ25vEqEYcGFja2FnZSBwcm90b2NvbF9mZWUKCmltcG9ydCAoCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKKQoKLy8gUmVnaXN0ZXJJbml0aWFsaXplciByZWdpc3RlcnMgYSBuZXcgcHJvdG9jb2wgZmVlIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGVhY2ggdmVyc2lvbiAodjEsIHYyLCBldGMuKSBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLy8gdG8gcmVnaXN0ZXIgdGhlaXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgcHJveHkgc3lzdGVtLgovLwovLyBUaGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaW1wbGVtZW50YXRpb24KLy8gdXNpbmcgdGhlIHByb3ZpZGVkIHByb3RvY29sRmVlU3RvcmUgaW50ZXJmYWNlLiBJdCByZWNlaXZlcyBhIHJlYWxtIHZhbHVlCi8vIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb3RvY29sX2ZlZSBwcm94eSByZWFsbSDigJQgdGhlIG9ubHkgYWRkcmVzcyB3aXRoCi8vIHdyaXRlIHBlcm1pc3Npb24gb24gdGhlIHNoYXJlZCBLViBzdG9yZSDigJQgc28gYW55IHBlci12ZXJzaW9uIHN0b3JlCi8vIGJvb3RzdHJhcHBpbmcgcGVyZm9ybWVkIGluc2lkZSB0aGUgaW5pdGlhbGl6ZXIgcGFzc2VzIHRoZSBwcm94eSdzCi8vIGF1dGhvcml6YXRpb24gY2hlY2suCi8vCi8vIFNlY3VyaXR5OiBPbmx5IGNvbnRyYWN0cyB3aXRoaW4gdGhlIGRvbWFpbiBwYXRoIGNhbiByZWdpc3RlciBpbml0aWFsaXplcnMuCi8vIEVhY2ggcGFja2FnZSBwYXRoIGNhbiBvbmx5IHJlZ2lzdGVyIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gaW5pdGlhbGl6ZXI6IGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIHByb3h5IHJlYWxtIGNvbnRleHQgYW5kIHByb3RvY29sLWZlZSBzdG9yZSwgaW5pdGlhbGl6ZXMgdmVyc2lvbi1zcGVjaWZpYyBzdGF0ZSwgYW5kIHJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIGluc3RhbmNlCmZ1bmMgUmVnaXN0ZXJJbml0aWFsaXplcihjdXIgcmVhbG0sIGluaXRpYWxpemVyIGZ1bmMoXyBpbnQsIHJsbSByZWFsbSwgcHJvdG9jb2xGZWVTdG9yZSBJUHJvdG9jb2xGZWVTdG9yZSkgSVByb3RvY29sRmVlKSB7CgkvLyBgY3VyYCBjYXB0dXJlZCBoZXJlIGlzIHRoZSBwcm90b2NvbF9mZWUgY3Jvc3NpbmcgZnJhbWUuIFRoZSB3cmFwcGluZwoJLy8gY2xvc3VyZSBmb3J3YXJkcyBpdCB0byB0aGUgdjEgaW5pdGlhbGl6ZXIgc28gYW55IHN0b3JlIHdyaXRlcyB0aGUKCS8vIGluaXRpYWxpemVyIHBlcmZvcm1zIHJ1biB1bmRlciB0aGUgcHJveHkncyBpZGVudGl0eSByYXRoZXIgdGhhbiB0aGUKCS8vIHZlcnNpb24gcGFja2FnZSdzLCB3aGljaCB3b3VsZCBmYWlsIHRoZSBrdlN0b3JlIEFDTC4KCWluaXRpYWxpemVyRnVuYyA6PSBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGRvbWFpblN0b3JlIGFueSkgYW55IHsKCQlhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgkJY3VycmVudFByb3RvY29sRmVlU3RvcmUsIG9rIDo9IGRvbWFpblN0b3JlLihJUHJvdG9jb2xGZWVTdG9yZSkKCQlpZiAhb2sgewoJCQlwYW5pYygiZG9tYWluU3RvcmUgaXMgbm90IGFuIElQcm90b2NvbEZlZVN0b3JlIikKCQl9CgoJCXJldHVybiBpbml0aWFsaXplcigwLCBybG0sIGN1cnJlbnRQcm90b2NvbEZlZVN0b3JlKQoJfQoKCWVyciA6PSB2ZXJzaW9uTWFuYWdlci5SZWdpc3RlckluaXRpYWxpemVyKDAsIGN1ciwgaW5pdGlhbGl6ZXJGdW5jKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWVyciA9IHVwZGF0ZUltcGxlbWVudGF0aW9uKCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQoKLy8gVXBncmFkZUltcGwgc3dpdGNoZXMgdGhlIGFjdGl2ZSBwcm90b2NvbCBmZWUgaW1wbGVtZW50YXRpb24gdG8gYSBkaWZmZXJlbnQgdmVyc2lvbi4KLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3Mgc2VhbWxlc3MgdXBncmFkZXMgZnJvbSBvbmUgdmVyc2lvbiB0byBhbm90aGVyIHdpdGhvdXQKLy8gZGF0YSBtaWdyYXRpb24gb3IgZG93bnRpbWUuCi8vCi8vIFNlY3VyaXR5OiBPbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMuCi8vIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBSZWdpc3RlckluaXRpYWxpemVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwYWNrYWdlUGF0aDogcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbiBwYWNrYWdlIHBhdGggdG8gYWN0aXZhdGUKZnVuYyBVcGdyYWRlSW1wbChjdXIgcmVhbG0sIHBhY2thZ2VQYXRoIHN0cmluZykgewoJLy8gRW5zdXJlIG9ubHkgYWRtaW4gb3IgZ292ZXJuYW5jZSBjYW4gcGVyZm9ybSB1cGdyYWRlcwoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJYWNjZXNzLkFzc2VydElzQWRtaW5PckdvdmVybmFuY2UocHJldi5BZGRyZXNzKCkpCgoJZXJyIDo9IHZlcnNpb25NYW5hZ2VyLkNoYW5nZUltcGxlbWVudGF0aW9uKDAsIGN1ciwgcGFja2FnZVBhdGgpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZXJyID0gdXBkYXRlSW1wbGVtZW50YXRpb24oKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CgovLyBHZXRJbXBsZW1lbnRhdGlvblBhY2thZ2VQYXRoIHJldHVybnMgdGhlIHBhY2thZ2UgcGF0aCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHBhY2thZ2VQYXRoOiBwYWNrYWdlIHBhdGggb2YgdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbgpmdW5jIEdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGgoKSBzdHJpbmcgewoJcmV0dXJuIHZlcnNpb25NYW5hZ2VyLkdldEN1cnJlbnRQYWNrYWdlUGF0aCgpCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhIIvJTNcRILMTE5MTIydWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQM5PaWFM5QMGzioRtViDs0r5GpvL8o0E8Pm9l7CBAJiEc7FjPE2BAhdxkfkj73tvSwzx8wCXNkj2Oe7kgqcCN5YaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data