Transaction executed successfully

Transaction Details

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

Transaction hash
F4716FDFE4F2A7683CE5DBAA11337D0144E067F61C977BADAD0DF0E3E895E9C4

Transaction overview

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

Execution summary

TX INDEX
0
Position in block
GAS WANTED
111,783,320
Requested gas limit
GAS USED
55,891,700
Gas consumed
FEE
111784ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1ftls0ctrrj0y96sr9dq906j7gdqhg9exgcvaey

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CoWzAgoML3ZtLm1fYWRkcGtnEvOyAgooZzFmdGxzMGN0cnJqMHk5NnNyOWRxOTA2ajdnZHFoZzlleGdjdmFleRLFsgIKCWVxdWlwbWVudBIhZ25vLmxhbmQvci9ha2thZGlhL2JldGEvZXF1aXBtZW50GsgNCgpjb25maWcuZ25vErkNcGFja2FnZSBlcXVpcG1lbnQKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9hY2Nlc3Njb250cm9sIgoJImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJImduby5sYW5kL3IvYWtrYWRpYS9iZXRhL2FkbWluIgopCgpjb25zdCAoCglTZXRMaXN0TGltaXRFdmVudCAgICAgPSAiU2V0TGlzdExpbWl0IgoJU2V0TWludGVyUmVhbG1FdmVudCAgID0gIlNldE1pbnRlclJlYWxtIgoJVW5zZXRNaW50ZXJSZWFsbUV2ZW50ID0gIlVuc2V0TWludGVyUmVhbG0iCikKCnZhciAoCglsaXN0TGltaXQgICAgaW50ID0gMTAwIC8vIE1heCBpdGVtcyBwZXIgTGlzdEJ5T3duZXIgcGFnZQoJbWludGVyUmVhbG1zICpicHRyZWUuQlBUcmVlCikKCmZ1bmMgU2V0TGlzdExpbWl0KGN1ciByZWFsbSwgbGltaXQgaW50KSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJaWYgbGltaXQgPCAxIHsKCQlwYW5pYygibGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxIikKCX0KCglvbGRMaW1pdCA6PSBsaXN0TGltaXQKCWxpc3RMaW1pdCA9IGxpbWl0CgoJY2hhaW4uRW1pdCgKCQlTZXRMaXN0TGltaXRFdmVudCwKCQkib2xkTGltaXQiLCBzdHJjb252Lkl0b2Eob2xkTGltaXQpLAoJCSJuZXdMaW1pdCIsIHN0cmNvbnYuSXRvYShsaW1pdCksCgkpCn0KCmZ1bmMgR2V0TGlzdExpbWl0KCkgaW50IHsKCXJldHVybiBsaXN0TGltaXQKfQoKZnVuYyBTZXRNaW50ZXJSZWFsbShjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CglhY2Nlc3Njb250cm9sLkFzc2VydElzQWRtaW4oMCwgY3VyLCBhZG1pbi5Jc0FkbWluKQoJYWRkciA6PSBtaW50ZXJSZWFsbUFkZHJlc3MocGtnUGF0aCkKCW1pbnRlclJlYWxtcy5TZXQoYWRkci5TdHJpbmcoKSwgdHJ1ZSkKCWNoYWluLkVtaXQoCgkJU2V0TWludGVyUmVhbG1FdmVudCwKCQkicGtnUGF0aCIsIHBrZ1BhdGgsCgkJImFkZHJlc3MiLCBhZGRyLlN0cmluZygpLAoJKQp9CgpmdW5jIFVuc2V0TWludGVyUmVhbG0oY3VyIHJlYWxtLCBwa2dQYXRoIHN0cmluZykgewoJYWNjZXNzY29udHJvbC5Bc3NlcnRJc0FkbWluKDAsIGN1ciwgYWRtaW4uSXNBZG1pbikKCWFkZHIgOj0gbWludGVyUmVhbG1BZGRyZXNzKHBrZ1BhdGgpCglpZiAhbWludGVyUmVhbG1zLkhhcyhhZGRyLlN0cmluZygpKSB7CgkJcGFuaWMoInBhY2thZ2UgcGF0aCBpcyBub3QgYSBtaW50ZXIgcmVhbG0iKQoJfQoJbWludGVyUmVhbG1zLlJlbW92ZShhZGRyLlN0cmluZygpKQoJY2hhaW4uRW1pdCgKCQlVbnNldE1pbnRlclJlYWxtRXZlbnQsCgkJInBrZ1BhdGgiLCBwa2dQYXRoLAoJCSJhZGRyZXNzIiwgYWRkci5TdHJpbmcoKSwKCSkKfQoKZnVuYyBJc01pbnRlclJlYWxtKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gbWludGVyUmVhbG1zLkhhcyhhZGRyLlN0cmluZygpKQp9CgpmdW5jIG1pbnRlclJlYWxtQWRkcmVzcyhwa2dQYXRoIHN0cmluZykgYWRkcmVzcyB7CglpZiBwa2dQYXRoID09ICIiIHsKCQlwYW5pYygicGFja2FnZSBwYXRoIGlzIHJlcXVpcmVkIikKCX0KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChwa2dQYXRoLCAiZ25vLmxhbmQvci8iKSB8fCBwa2dQYXRoID09ICJnbm8ubGFuZC9yLyIgewoJCXBhbmljKCJpbnZhbGlkIHBhY2thZ2UgcGF0aCIpCgl9CglyZXR1cm4gY2hhaW4uUGFja2FnZUFkZHJlc3MocGtnUGF0aCkKfQoa01QKDWVxdWlwbWVudC5nbm8SwVRwYWNrYWdlIGVxdWlwbWVudAoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJuZXQvdXJsIgoJInN0cmNvbnYiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvYWNjZXNzY29udHJvbCIKCSJnbm8ubGFuZC9wL2Fra2FkaWEvYmV0YS9ncmM3MjEiCgkiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW4iCikKCmNvbnN0ICgKCWRlZmluaXRpb25JREtleSAgICAgICAgICAgID0gImRlZmluaXRpb25JZCIKCXRva2VuSURLZXkgICAgICAgICAgICAgICAgID0gInRva2VuSWQiCgljcmVhdGVkQXRLZXkgICAgICAgICAgICAgICA9ICJjcmVhdGVkX2F0IgoJbWF4RXF1aXBtZW50VG9rZW5JRCB1aW50NjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNQopCgp2YXIgKAoJZXF1aXBtZW50VG9rZW4gICAgPSBncmM3MjEuTmV3QmFzaWNORlQoIkFra2FkaWEgRXF1aXBtZW50IiwgIkFFUVAiKQoJZXF1aXBtZW50TWV0YWRhdGEgKmJwdHJlZS5CUFRyZWUKCW93bmVyVG9rZW5JRHMgICAgICpicHRyZWUuQlBUcmVlCglsYXRlc3RUb2tlbklEICAgICB1aW50NjQKKQoKZnVuYyBpbml0KCkgeyByZXNldEVxdWlwbWVudFN0YXRlKCkgfQoKZnVuYyByZXNldEVxdWlwbWVudFN0YXRlKCkgewoJZXF1aXBtZW50VG9rZW4gPSBncmM3MjEuTmV3QmFzaWNORlQoIkFra2FkaWEgRXF1aXBtZW50IiwgIkFFUVAiKQoJZXF1aXBtZW50TWV0YWRhdGEgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJb3duZXJUb2tlbklEcyA9IGJwdHJlZS5OZXdCUFRyZWUzMigpCgltaW50ZXJSZWFsbXMgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJbGlzdExpbWl0ID0gMTAwCglsYXRlc3RUb2tlbklEID0gMAp9CgpmdW5jIE1pbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcywgZGVmaW5pdGlvbklEIHVpbnQzMiwgYXR0cktleXMsIGF0dHJWYWx1ZXMgc3RyaW5nKSB1aW50NjQgewoJYWNjZXNzY29udHJvbC5NdXN0R2V0QWRtaW5Pck9wZXJhdG9yQ2FsbGVyKDAsIGN1ciwgYWRtaW4uSXNBZG1pbiwgYWRtaW4uSXNPcGVyYXRvcikKCWFzc2VydEVxdWlwbWVudE5vQ29pbnMoKQoJcmV0dXJuIG1pbnRFcXVpcG1lbnQoY3Jvc3MoY3VyKSwgcmVjaXBpZW50LCBkZWZpbml0aW9uSUQsIGF0dHJLZXlzLCBhdHRyVmFsdWVzKQp9CgpmdW5jIE1pbnRGcm9tUmVhbG0oY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcywgZGVmaW5pdGlvbklEIHVpbnQzMiwgYXR0cktleXMsIGF0dHJWYWx1ZXMgc3RyaW5nKSB1aW50NjQgewoJbXVzdEdldE1pbnRlclJlYWxtQ2FsbGVyKDAsIGN1cikKCWlmIHVuc2FmZS5PcmlnaW5DYWxsZXIoKSAhPSByZWNpcGllbnQgewoJCXBhbmljKCJlcXVpcG1lbnQgcmVjaXBpZW50IG11c3QgYmUgb3JpZ2luIGNhbGxlciIpCgl9CglyZXR1cm4gbWludEVxdWlwbWVudChjcm9zcyhjdXIpLCByZWNpcGllbnQsIGRlZmluaXRpb25JRCwgYXR0cktleXMsIGF0dHJWYWx1ZXMpCn0KCmZ1bmMgR2V0TWV0YWRhdGEodG9rZW5JRCB1aW50NjQpIG1hcFtzdHJpbmddc3RyaW5nIHsKCXJldHVybiBjb3B5U3RyaW5nTWFwKG11c3RHZXRFcXVpcG1lbnRNZXRhZGF0YSh0b2tlbklEKSkKfQoKZnVuYyBTZXRNZXRhZGF0YShjdXIgcmVhbG0sIHRva2VuSUQgdWludDY0LCBhdHRyS2V5cywgYXR0clZhbHVlcyBzdHJpbmcpIHsKCWFjY2Vzc2NvbnRyb2wuTXVzdEdldEFkbWluT3JPcGVyYXRvckNhbGxlcigwLCBjdXIsIGFkbWluLklzQWRtaW4sIGFkbWluLklzT3BlcmF0b3IpCglhc3NlcnRFcXVpcG1lbnROb0NvaW5zKCkKCXNldEVxdWlwbWVudE1ldGFkYXRhKHRva2VuSUQsIGF0dHJLZXlzLCBhdHRyVmFsdWVzKQp9CgpmdW5jIFNldE1ldGFkYXRhRnJvbVJlYWxtKGN1ciByZWFsbSwgdG9rZW5JRCB1aW50NjQsIGF0dHJLZXlzLCBhdHRyVmFsdWVzIHN0cmluZykgewoJbXVzdEdldE1pbnRlclJlYWxtQ2FsbGVyKDAsIGN1cikKCWlmIHVuc2FmZS5PcmlnaW5DYWxsZXIoKSAhPSBPd25lck9mKHRva2VuSUQpIHsKCQlwYW5pYygiZXF1aXBtZW50IG93bmVyIG11c3QgYmUgb3JpZ2luIGNhbGxlciIpCgl9CglzZXRFcXVpcG1lbnRNZXRhZGF0YSh0b2tlbklELCBhdHRyS2V5cywgYXR0clZhbHVlcykKfQoKZnVuYyBHZXRPd25lZENvdW50KG93bmVyIGFkZHJlc3MpIGludCB7CglpZiAhb3duZXIuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBlcXVpcG1lbnQgb3duZXIiKQoJfQoJaWRzLCBmb3VuZCA6PSBnZXRPd25lclRva2VuSURzKG93bmVyKQoJaWYgIWZvdW5kIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGlkcy5TaXplKCkKfQoKZnVuYyBMaXN0QnlPd25lcihvd25lciBhZGRyZXNzLCBwYWdlLCBjb3VudCBpbnQpIFtdbWFwW3N0cmluZ11zdHJpbmcgewoJaWYgIW93bmVyLklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgZXF1aXBtZW50IG93bmVyIikKCX0KCWFzc2VydEVxdWlwbWVudExpc3RQYWdlQ291bnQocGFnZSwgY291bnQpCglpZHMsIGZvdW5kIDo9IGdldE93bmVyVG9rZW5JRHMob3duZXIpCglpZiAhZm91bmQgewoJCXJldHVybiBbXW1hcFtzdHJpbmddc3RyaW5ne30KCX0KCXJlc3VsdCA6PSBbXW1hcFtzdHJpbmddc3RyaW5ne30KCWlkcy5JdGVyYXRlQnlPZmZzZXQoKHBhZ2UtMSkqY291bnQsIGNvdW50LCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQl0b2tlbklEIDo9IHBhcnNlVWludDY0S2V5KGtleSkKCQlyb3cgOj0gR2V0TWV0YWRhdGEodG9rZW5JRCkKCQlyb3dbdG9rZW5JREtleV0gPSBzdHJjb252LkZvcm1hdFVpbnQodG9rZW5JRCwgMTApCgkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcm93KQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiByZXN1bHQKfQoKZnVuYyBOYW1lKCkgc3RyaW5nICAgeyByZXR1cm4gZXF1aXBtZW50VG9rZW4uTmFtZSgpIH0KZnVuYyBTeW1ib2woKSBzdHJpbmcgeyByZXR1cm4gZXF1aXBtZW50VG9rZW4uU3ltYm9sKCkgfQoKZnVuYyBPd25lck9mKHRva2VuSUQgdWludDY0KSBhZGRyZXNzIHsKCW93bmVyLCBlcnIgOj0gZXF1aXBtZW50VG9rZW4uT3duZXJPZihlcXVpcG1lbnRUb2tlbklEKHRva2VuSUQpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImVxdWlwbWVudCBvd25lciBxdWVyeSBmYWlsZWQ6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBvd25lcgp9CgpmdW5jIEhhcyh0b2tlbklEIHVpbnQ2NCkgYm9vbCB7CglfLCBlcnIgOj0gZXF1aXBtZW50VG9rZW4uT3duZXJPZihlcXVpcG1lbnRUb2tlbklEKHRva2VuSUQpKQoJcmV0dXJuIGVyciA9PSBuaWwKfQoKZnVuYyBHZXRMYXRlc3RUb2tlbklEKCkgdWludDY0IHsKCXJldHVybiBsYXRlc3RUb2tlbklECn0KCmZ1bmMgQmFsYW5jZU9mKG93bmVyIGFkZHJlc3MpIGludDY0IHsKCWlmICFvd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIGVxdWlwbWVudCBvd25lciIpCgl9CgliYWxhbmNlLCBlcnIgOj0gZXF1aXBtZW50VG9rZW4uQmFsYW5jZU9mKG93bmVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImVxdWlwbWVudCBiYWxhbmNlIHF1ZXJ5IGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIGJhbGFuY2UKfQoKZnVuYyBHZXRBcHByb3ZlZCh0b2tlbklEIHVpbnQ2NCkgYWRkcmVzcyB7CglhcHByb3ZlZCwgZXJyIDo9IGVxdWlwbWVudFRva2VuLkdldEFwcHJvdmVkKGVxdWlwbWVudFRva2VuSUQodG9rZW5JRCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiZXF1aXBtZW50IGFwcHJvdmFsIHF1ZXJ5IGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIGFwcHJvdmVkCn0KCmZ1bmMgSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gZXF1aXBtZW50VG9rZW4uSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IpCn0KCmZ1bmMgQXBwcm92ZShjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MsIHRva2VuSUQgdWludDY0KSB7CgljYWxsZXIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglhc3NlcnRFcXVpcG1lbnROb0NvaW5zKCkKCWlmIGVyciA6PSBlcXVpcG1lbnRUb2tlbi5BcHByb3ZlKGNhbGxlciwgb3BlcmF0b3IsIGVxdWlwbWVudFRva2VuSUQodG9rZW5JRCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiZXF1aXBtZW50IGFwcHJvdmFsIGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQp9CgpmdW5jIFNldEFwcHJvdmFsRm9yQWxsKGN1ciByZWFsbSwgb3BlcmF0b3IgYWRkcmVzcywgYXBwcm92ZWQgYm9vbCkgewoJY2FsbGVyIDo9IGFjY2Vzc2NvbnRyb2wuTXVzdEdldFVzZXJDYWxsZXIoMCwgY3VyKQoJYXNzZXJ0RXF1aXBtZW50Tm9Db2lucygpCglpZiBlcnIgOj0gZXF1aXBtZW50VG9rZW4uU2V0QXBwcm92YWxGb3JBbGwoY2FsbGVyLCBvcGVyYXRvciwgYXBwcm92ZWQpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiZXF1aXBtZW50IG9wZXJhdG9yIGFwcHJvdmFsIGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQp9CgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRva2VuSUQgdWludDY0KSB7CgljYWxsZXIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglhc3NlcnRFcXVpcG1lbnROb0NvaW5zKCkKCWlmIGVyciA6PSBlcXVpcG1lbnRUb2tlbi5UcmFuc2ZlckZyb20oY2FsbGVyLCBmcm9tLCB0bywgZXF1aXBtZW50VG9rZW5JRCh0b2tlbklEKSk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJlcXVpcG1lbnQgdHJhbnNmZXIgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9CglpZiBmcm9tICE9IHRvIHsKCQlyZW1vdmVPd25lclRva2VuSUQoZnJvbSwgdG9rZW5JRCkKCQlhZGRPd25lclRva2VuSUQodG8sIHRva2VuSUQpCgl9Cn0KCmZ1bmMgQnVybihjdXIgcmVhbG0sIHRva2VuSUQgdWludDY0KSB7CgljYWxsZXIgOj0gYWNjZXNzY29udHJvbC5NdXN0R2V0VXNlckNhbGxlcigwLCBjdXIpCglhc3NlcnRFcXVpcG1lbnROb0NvaW5zKCkKCW93bmVyIDo9IE93bmVyT2YodG9rZW5JRCkKCWFwcHJvdmVkLCBlcnIgOj0gZXF1aXBtZW50VG9rZW4uR2V0QXBwcm92ZWQoZXF1aXBtZW50VG9rZW5JRCh0b2tlbklEKSkKCWlmIGNhbGxlciAhPSBvd25lciAmJiAhZXF1aXBtZW50VG9rZW4uSXNBcHByb3ZlZEZvckFsbChvd25lciwgY2FsbGVyKSAmJiAoZXJyICE9IG5pbCB8fCBhcHByb3ZlZCAhPSBjYWxsZXIpIHsKCQlwYW5pYygiZXF1aXBtZW50IG93bmVyIG9yIGFwcHJvdmVkIG9wZXJhdG9yIHJlcXVpcmVkIikKCX0KCWJ1cm5FcXVpcG1lbnQodG9rZW5JRCwgb3duZXIpCn0KCmZ1bmMgQnVybkZyb21SZWFsbShjdXIgcmVhbG0sIHRva2VuSUQgdWludDY0KSB7CgltdXN0R2V0TWludGVyUmVhbG1DYWxsZXIoMCwgY3VyKQoJb3duZXIgOj0gT3duZXJPZih0b2tlbklEKQoJaWYgdW5zYWZlLk9yaWdpbkNhbGxlcigpICE9IG93bmVyIHsKCQlwYW5pYygiZXF1aXBtZW50IG93bmVyIG11c3QgYmUgb3JpZ2luIGNhbGxlciIpCgl9CglidXJuRXF1aXBtZW50KHRva2VuSUQsIG93bmVyKQp9CgpmdW5jIG1pbnRFcXVpcG1lbnQoY3VyIHJlYWxtLCByZWNpcGllbnQgYWRkcmVzcywgZGVmaW5pdGlvbklEIHVpbnQzMiwgYXR0cktleXMsIGF0dHJWYWx1ZXMgc3RyaW5nKSB1aW50NjQgewoJaWYgIXJlY2lwaWVudC5Jc1ZhbGlkKCkgfHwgcmVjaXBpZW50ID09IGN1ci5BZGRyZXNzKCkgewoJCXBhbmljKCJpbnZhbGlkIGVxdWlwbWVudCByZWNpcGllbnQiKQoJfQoJYXR0cnMgOj0gcGFyc2VFcXVpcG1lbnRBdHRyaWJ1dGVzKGF0dHJLZXlzLCBhdHRyVmFsdWVzKQoJdG9rZW5JRCA6PSBhbGxvY2F0ZVRva2VuSUQoKQoJaWYgZXJyIDo9IGVxdWlwbWVudFRva2VuLk1pbnQocmVjaXBpZW50LCBlcXVpcG1lbnRUb2tlbklEKHRva2VuSUQpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImVxdWlwbWVudCBtaW50IGZhaWxlZDogIiArIGVyci5FcnJvcigpKQoJfQoJYXR0cnNbZGVmaW5pdGlvbklES2V5XSA9IHN0cmNvbnYuRm9ybWF0VWludCh1aW50NjQoZGVmaW5pdGlvbklEKSwgMTApCglhdHRyc1tjcmVhdGVkQXRLZXldID0gc3RyY29udi5Gb3JtYXRJbnQodGltZS5Ob3coKS5Vbml4KCksIDEwKQoJZXF1aXBtZW50TWV0YWRhdGEuU2V0KHVpbnQ2NEtleSh0b2tlbklEKSwgYXR0cnMpCglhZGRPd25lclRva2VuSUQocmVjaXBpZW50LCB0b2tlbklEKQoJcmV0dXJuIHRva2VuSUQKfQoKZnVuYyBhbGxvY2F0ZVRva2VuSUQoKSB1aW50NjQgewoJaWYgbGF0ZXN0VG9rZW5JRCA9PSBtYXhFcXVpcG1lbnRUb2tlbklEIHsKCQlwYW5pYygiZXF1aXBtZW50IHRva2VuIGlkIGV4aGF1c3RlZCIpCgl9CglsYXRlc3RUb2tlbklEKysKCXJldHVybiBsYXRlc3RUb2tlbklECn0KCmZ1bmMgbXVzdEdldEVxdWlwbWVudE1ldGFkYXRhKHRva2VuSUQgdWludDY0KSBtYXBbc3RyaW5nXXN0cmluZyB7Cgl2YWx1ZSA6PSBlcXVpcG1lbnRNZXRhZGF0YS5HZXQodWludDY0S2V5KHRva2VuSUQpKQoJaWYgdmFsdWUgPT0gbmlsIHsKCQlwYW5pYygiZXF1aXBtZW50IG1ldGFkYXRhIG5vdCBmb3VuZDogIiArIHN0cmNvbnYuRm9ybWF0VWludCh0b2tlbklELCAxMCkpCgl9CglyZXR1cm4gdmFsdWUuKG1hcFtzdHJpbmddc3RyaW5nKQp9CgpmdW5jIHNldEVxdWlwbWVudE1ldGFkYXRhKHRva2VuSUQgdWludDY0LCBhdHRyS2V5cywgYXR0clZhbHVlcyBzdHJpbmcpIHsKCWN1cnJlbnQgOj0gbXVzdEdldEVxdWlwbWVudE1ldGFkYXRhKHRva2VuSUQpCglhdHRycyA6PSBwYXJzZUVxdWlwbWVudEF0dHJpYnV0ZXMoYXR0cktleXMsIGF0dHJWYWx1ZXMpCglhdHRyc1tkZWZpbml0aW9uSURLZXldID0gY3VycmVudFtkZWZpbml0aW9uSURLZXldCglhdHRyc1tjcmVhdGVkQXRLZXldID0gY3VycmVudFtjcmVhdGVkQXRLZXldCgllcXVpcG1lbnRNZXRhZGF0YS5TZXQodWludDY0S2V5KHRva2VuSUQpLCBhdHRycykKfQoKZnVuYyBwYXJzZUVxdWlwbWVudEF0dHJpYnV0ZXMoYXR0cktleXMsIGF0dHJWYWx1ZXMgc3RyaW5nKSBtYXBbc3RyaW5nXXN0cmluZyB7CglhdHRycyA6PSBwYXJzZUF0dHJpYnV0ZXNDU1YoYXR0cktleXMsIGF0dHJWYWx1ZXMpCglpZiBfLCBmb3VuZCA6PSBhdHRyc1tkZWZpbml0aW9uSURLZXldOyBmb3VuZCB7CgkJcGFuaWMoInJlc2VydmVkIGtleTogIiArIGRlZmluaXRpb25JREtleSkKCX0KCWlmIF8sIGZvdW5kIDo9IGF0dHJzW3Rva2VuSURLZXldOyBmb3VuZCB7CgkJcGFuaWMoInJlc2VydmVkIGtleTogIiArIHRva2VuSURLZXkpCgl9CglpZiBfLCBmb3VuZCA6PSBhdHRyc1tjcmVhdGVkQXRLZXldOyBmb3VuZCB7CgkJcGFuaWMoInJlc2VydmVkIGtleTogIiArIGNyZWF0ZWRBdEtleSkKCX0KCXJldHVybiBhdHRycwp9CgpmdW5jIGJ1cm5FcXVpcG1lbnQodG9rZW5JRCB1aW50NjQsIG93bmVyIGFkZHJlc3MpIHsKCWlmIGVyciA6PSBlcXVpcG1lbnRUb2tlbi5CdXJuKGVxdWlwbWVudFRva2VuSUQodG9rZW5JRCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYygiZXF1aXBtZW50IGJ1cm4gZmFpbGVkOiAiICsgZXJyLkVycm9yKCkpCgl9CglpZiBfLCByZW1vdmVkIDo9IGVxdWlwbWVudE1ldGFkYXRhLlJlbW92ZSh1aW50NjRLZXkodG9rZW5JRCkpOyAhcmVtb3ZlZCB7CgkJcGFuaWMoImVxdWlwbWVudCBtZXRhZGF0YSBub3QgZm91bmQ6ICIgKyBzdHJjb252LkZvcm1hdFVpbnQodG9rZW5JRCwgMTApKQoJfQoJcmVtb3ZlT3duZXJUb2tlbklEKG93bmVyLCB0b2tlbklEKQp9CgpmdW5jIG11c3RHZXRNaW50ZXJSZWFsbUNhbGxlcihfIGludCwgcmxtIHJlYWxtKSBhZGRyZXNzIHsKCWFjY2Vzc2NvbnRyb2wuQXNzZXJ0Q3VycmVudFJlYWxtKDAsIHJsbSkKCXByZXYgOj0gcmxtLlByZXZpb3VzKCkKCWlmIHByZXYuSXNVc2VyQ2FsbCgpIHsKCQlwYW5pYygidXNlciBjYWxscyBub3QgYWxsb3dlZDogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSByZWFsbSIpCgl9CgljYWxsZXIgOj0gcHJldi5BZGRyZXNzKCkKCWlmICFJc01pbnRlclJlYWxtKGNhbGxlcikgewoJCXBhbmljKCJtaW50ZXIgcmVhbG0gcmVxdWlyZWQiKQoJfQoJcmV0dXJuIGNhbGxlcgp9CgpmdW5jIGFzc2VydEVxdWlwbWVudE5vQ29pbnMoKSB7CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoImF0dGFjaGVkIGNvaW5zIG5vdCBhbGxvd2VkIikKCX0KfQoKZnVuYyBhc3NlcnRFcXVpcG1lbnRMaXN0UGFnZUNvdW50KHBhZ2UsIGNvdW50IGludCkgewoJaWYgcGFnZSA8IDEgewoJCXBhbmljKCJwYWdlIG11c3QgYmUgYXQgbGVhc3QgMSIpCgl9CglpZiBjb3VudCA8IDEgewoJCXBhbmljKCJjb3VudCBtdXN0IGJlIGF0IGxlYXN0IDEiKQoJfQoJaWYgY291bnQgPiBsaXN0TGltaXQgewoJCXBhbmljKCJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAiICsgc3RyY29udi5JdG9hKGxpc3RMaW1pdCkgKyAiKSIpCgl9Cn0KCmZ1bmMgYWRkT3duZXJUb2tlbklEKG93bmVyIGFkZHJlc3MsIHRva2VuSUQgdWludDY0KSB7Cgl2YWx1ZSA6PSBvd25lclRva2VuSURzLkdldChvd25lci5TdHJpbmcoKSkKCXZhciBpZHMgKmJwdHJlZS5CUFRyZWUKCWlmIHZhbHVlICE9IG5pbCB7CgkJaWRzID0gdmFsdWUuKCpicHRyZWUuQlBUcmVlKQoJfSBlbHNlIHsKCQlpZHMgPSBicHRyZWUuTmV3QlBUcmVlMzIoKQoJCW93bmVyVG9rZW5JRHMuU2V0KG93bmVyLlN0cmluZygpLCBpZHMpCgl9CglpZHMuU2V0KHVpbnQ2NEtleSh0b2tlbklEKSwgdHJ1ZSkKfQoKZnVuYyByZW1vdmVPd25lclRva2VuSUQob3duZXIgYWRkcmVzcywgdG9rZW5JRCB1aW50NjQpIHsKCWlkcywgZm91bmQgOj0gZ2V0T3duZXJUb2tlbklEcyhvd25lcikKCWlmICFmb3VuZCB7CgkJcmV0dXJuCgl9CglpZHMuUmVtb3ZlKHVpbnQ2NEtleSh0b2tlbklEKSkKfQoKZnVuYyBnZXRPd25lclRva2VuSURzKG93bmVyIGFkZHJlc3MpICgqYnB0cmVlLkJQVHJlZSwgYm9vbCkgewoJdmFsdWUgOj0gb3duZXJUb2tlbklEcy5HZXQob3duZXIuU3RyaW5nKCkpCglpZiB2YWx1ZSA9PSBuaWwgewoJCXJldHVybiBuaWwsIGZhbHNlCgl9CglyZXR1cm4gdmFsdWUuKCpicHRyZWUuQlBUcmVlKSwgdHJ1ZQp9CgpmdW5jIGVxdWlwbWVudFRva2VuSUQodG9rZW5JRCB1aW50NjQpIGdyYzcyMS5Ub2tlbklEIHsKCXJldHVybiBncmM3MjEuVG9rZW5JRChzdHJjb252LkZvcm1hdFVpbnQodG9rZW5JRCwgMTApKQp9CgpmdW5jIHVpbnQ2NEtleShpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApCglpZiBsZW4ocykgPj0gMjAgewoJCXJldHVybiBzCgl9CglyZXR1cm4gIjAwMDAwMDAwMDAwMDAwMDAwMDAwIltsZW4ocyk6XSArIHMKfQoKZnVuYyBwYXJzZVVpbnQ2NEtleShrZXkgc3RyaW5nKSB1aW50NjQgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlVWludChrZXksIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJpbnZhbGlkIHVpbnQ2NCBrZXk6ICIgKyBrZXkpCgl9CglyZXR1cm4gaWQKfQoKZnVuYyBjb3B5U3RyaW5nTWFwKHNvdXJjZSBtYXBbc3RyaW5nXXN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgewoJcmVzdWx0IDo9IG1hcFtzdHJpbmddc3RyaW5ne30KCWZvciBrZXksIHZhbHVlIDo9IHJhbmdlIHNvdXJjZSB7CgkJcmVzdWx0W2tleV0gPSB2YWx1ZQoJfQoJcmV0dXJuIHJlc3VsdAp9CgovLyBwYXJzZUF0dHJpYnV0ZXNDU1YgYWNjZXB0cyBjb21tYS1zZXBhcmF0ZWQga2V5cyBhbmQgVVJMLWVuY29kZWQgdmFsdWVzLgovLyBFbXB0eSBrZXlzIGFuZCB2YWx1ZXMgcHJvZHVjZSBhbiBlbXB0eSBhdHRyaWJ1dGUgbWFwIHNvIG1pbnQgY2FuIHN0b3JlCi8vIGRlZmluaXRpb25JZCBhbmQgY3JlYXRlZF9hdCBhbG9uZS4KZnVuYyBwYXJzZUF0dHJpYnV0ZXNDU1Yoa2V5cywgdmFsdWVzIHN0cmluZykgbWFwW3N0cmluZ11zdHJpbmcgewoJaWYga2V5cyA9PSAiIiAmJiB2YWx1ZXMgPT0gIiIgewoJCXJldHVybiBtYXBbc3RyaW5nXXN0cmluZ3t9Cgl9CgoJcmVzdWx0IDo9IG1hcFtzdHJpbmddc3RyaW5ne30KCWtleVN0YXJ0LCB2YWxTdGFydCA6PSAwLCAwCglrZXlJZHgsIHZhbElkeCA6PSAwLCAwCglmb3IgewoJCWZvciBrZXlJZHggPCBsZW4oa2V5cykgJiYga2V5c1trZXlJZHhdICE9ICcsJyB7CgkJCWtleUlkeCsrCgkJfQoJCWZvciB2YWxJZHggPCBsZW4odmFsdWVzKSAmJiB2YWx1ZXNbdmFsSWR4XSAhPSAnLCcgewoJCQl2YWxJZHgrKwoJCX0KCgkJa2V5IDo9IGtleXNba2V5U3RhcnQ6a2V5SWR4XQoJCWlmIGtleSA9PSAiIiB7CgkJCXBhbmljKCJhdHRyaWJ1dGVzIGtleSBtdXN0IGJlIG5vdCBlbXB0eSIpCgkJfQoJCWlmIF8sIGZvdW5kIDo9IHJlc3VsdFtrZXldOyBmb3VuZCB7CgkJCXBhbmljKCJhdHRyaWJ1dGVzIGtleSBkdXBsaWNhdGVkOiAiICsga2V5KQoJCX0KCgkJdmFsdWUsIGVyciA6PSB1cmwuUGF0aFVuZXNjYXBlKHZhbHVlc1t2YWxTdGFydDp2YWxJZHhdKQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygiYXR0cmlidXRlcyB2YWx1ZSBVUkwgZGVjb2RlIGZhaWxlZDogIiArIGtleSkKCQl9CgkJcmVzdWx0W2tleV0gPSB2YWx1ZQoKCQlrZXlFbmQgOj0ga2V5SWR4ID49IGxlbihrZXlzKQoJCXZhbEVuZCA6PSB2YWxJZHggPj0gbGVuKHZhbHVlcykKCQlpZiBrZXlFbmQgIT0gdmFsRW5kIHsKCQkJcGFuaWMoImF0dHJpYnV0ZXMga2V5cyBhbmQgdmFsdWVzIGNvdW50IG1pc21hdGNoIikKCQl9CgkJaWYga2V5RW5kIHsKCQkJYnJlYWsKCQl9CgoJCWtleUlkeCsrCgkJdmFsSWR4KysKCQlrZXlTdGFydCA9IGtleUlkeAoJCXZhbFN0YXJ0ID0gdmFsSWR4Cgl9CgoJcmV0dXJuIHJlc3VsdAp9Chr9lwEKEmVxdWlwbWVudF90ZXN0LmdubxLllwFwYWNrYWdlIGVxdWlwbWVudAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvYWRtaW4iCikKCnZhciBlcXVpcG1lbnRUZXN0ID0gc3RydWN0IHsKCUFkbWluLCBPcGVyYXRvciwgT3duZXIsIE90aGVyIGFkZHJlc3MKCVNldHVwRG9uZSAgICAgICAgICAgICAgICAgICAgIGJvb2wKfXsKCUFkbWluOiAgICB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImVxdWlwbWVudEFkbWluIiksCglPcGVyYXRvcjogdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJlcXVpcG1lbnRPcGVyYXRvciIpLAoJT3duZXI6ICAgIHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZXF1aXBtZW50T3duZXIiKSwKCU90aGVyOiAgICB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImVxdWlwbWVudE90aGVyIiksCn0KCmZ1bmMgc2V0dXBFcXVpcG1lbnRUZXN0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7Cgl0LkhlbHBlcigpCglyZXNldEVxdWlwbWVudFN0YXRlKCkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t9KQoJaWYgZXF1aXBtZW50VGVzdC5TZXR1cERvbmUgewoJCXJldHVybgoJfQoJb3JpZ2luYWxBZG1pbiA6PSBhZG1pbi5HZXRBZG1pbigpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihvcmlnaW5hbEFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvcmlnaW5hbEFkbWluKSkKCWFkbWluLlRyYW5zZmVyQWRtaW4oY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuQWRtaW4pKQoJYWRtaW4uQWNjZXB0QWRtaW4oY3Jvc3MoY3VyKSkKCWFkbWluLlNldE9wZXJhdG9yKGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpCgllcXVpcG1lbnRUZXN0LlNldHVwRG9uZSA9IHRydWUKfQoKZnVuYyBUZXN0TWludEFsbG9jYXRlc1NlcXVlbnRpYWxUb2tlbklEcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBFcXVpcG1lbnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDApLCBHZXRMYXRlc3RUb2tlbklEKCkpCglmaXJzdCA6PSBNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCXNlY29uZCA6PSBNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3RoZXIsIDAsICIiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDEpLCBmaXJzdCkKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDIpLCBzZWNvbmQpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQ2NCgyKSwgR2V0TGF0ZXN0VG9rZW5JRCgpKQoJdWFzc2VydC5FcXVhbCh0LCBlcXVpcG1lbnRUZXN0Lk93bmVyLCBPd25lck9mKDEpKQoJdWFzc2VydC5FcXVhbCh0LCBlcXVpcG1lbnRUZXN0Lk90aGVyLCBPd25lck9mKDIpKQoJdWFzc2VydC5UcnVlKHQsIEhhcygxKSkKCXVhc3NlcnQuVHJ1ZSh0LCBIYXMoMikpCgl1YXNzZXJ0LkZhbHNlKHQsIEhhcygzKSkKCglsYXRlc3RUb2tlbklEID0gbWF4RXF1aXBtZW50VG9rZW5JRAoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJlcXVpcG1lbnQgdG9rZW4gaWQgZXhoYXVzdGVkIiwgZnVuYygpIHsKCQlNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCX0pCn0KCmZ1bmMgVGVzdEVxdWlwbWVudFRyYW5zZmVyQW5kQnVybihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBFcXVpcG1lbnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgMCwgIiIsICIiKQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5Pd25lcikpCglUcmFuc2ZlckZyb20oY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgZXF1aXBtZW50VGVzdC5PdGhlciwgMSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3RoZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3RoZXIpKQoJQnVybihjcm9zcyhjdXIpLCAxKQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJlcXVpcG1lbnQgbWV0YWRhdGEgbm90IGZvdW5kOiAxIiwgZnVuYygpIHsKCQlHZXRNZXRhZGF0YSgxKQoJfSkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAwLCAiZW5oYW5jZW1lbnQiLCAiMyIpCgl1YXNzZXJ0LkVxdWFsKHQsIHVpbnQ2NCgyKSwgR2V0TGF0ZXN0VG9rZW5JRCgpKQoJdWFzc2VydC5FcXVhbCh0LCBlcXVpcG1lbnRUZXN0Lk93bmVyLCBPd25lck9mKDIpKQoJbWV0YSA6PSBHZXRNZXRhZGF0YSgyKQoJdWFzc2VydC5FcXVhbCh0LCAiMTEwMTAwMCIsIG1ldGFbImRlZmluaXRpb25JZCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiMyIsIG1ldGFbImVuaGFuY2VtZW50Il0pCgl1YXNzZXJ0LlRydWUodCwgbWV0YVtjcmVhdGVkQXRLZXldICE9ICIiKQp9CgpmdW5jIFRlc3RFcXVpcG1lbnRBcHByb3ZhbEFsbG93c1RyYW5zZmVyQW5kQnVybihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBFcXVpcG1lbnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgMCwgIiIsICIiKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAwLCAiIiwgIiIpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCUFwcHJvdmUoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5PdGhlciwgMSkKCVNldEFwcHJvdmFsRm9yQWxsKGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3RoZXIsIHRydWUpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk90aGVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk90aGVyKSkKCVRyYW5zZmVyRnJvbShjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCBlcXVpcG1lbnRUZXN0LkFkbWluLCAxKQoJQnVybihjcm9zcyhjdXIpLCAyKQoJdWFzc2VydC5FcXVhbCh0LCBlcXVpcG1lbnRUZXN0LkFkbWluLCBPd25lck9mKDEpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQmFsYW5jZU9mKGVxdWlwbWVudFRlc3QuT3duZXIpKQp9CgpmdW5jIFRlc3RNaW50U2VjdXJpdHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRXF1aXBtZW50VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAwLCAiIiwgIiIpCgl9KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gb3Igb3BlcmF0b3IgYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCX0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze3sidWdub3QiLCAxfX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImF0dGFjaGVkIGNvaW5zIG5vdCBhbGxvd2VkIiwgZnVuYygpIHsKCQlNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCX0pCn0KCmZ1bmMgVGVzdEVxdWlwbWVudE1ldGFkYXRhKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEVxdWlwbWVudFRlc3QoY3Jvc3MoY3VyKSwgdCkKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAwLCAiZW5oYW5jZW1lbnQsbm90ZSIsICIzLGElMkNiIikKCW1ldGEgOj0gR2V0TWV0YWRhdGEoMSkKCXVhc3NlcnQuRXF1YWwodCwgIjExMDEwMDAiLCBtZXRhWyJkZWZpbml0aW9uSWQiXSkKCXVhc3NlcnQuRXF1YWwodCwgIjMiLCBtZXRhWyJlbmhhbmNlbWVudCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiYSxiIiwgbWV0YVsibm90ZSJdKQoJdWFzc2VydC5UcnVlKHQsIG1ldGFbY3JlYXRlZEF0S2V5XSAhPSAiIikKCXVhc3NlcnQuRXF1YWwodCwgNCwgbGVuKG1ldGEpKQoJbWV0YVsiZGVmaW5pdGlvbklkIl0gPSAiaGFja2VkIgoJdWFzc2VydC5FcXVhbCh0LCAiMTEwMTAwMCIsIEdldE1ldGFkYXRhKDEpWyJkZWZpbml0aW9uSWQiXSkKCgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJa2V5cywgdmFsdWVzLCBwYW5pY01zZyBzdHJpbmcKCX17CgkJeyJkZWZpbml0aW9uSWQiLCAiMSIsICJyZXNlcnZlZCBrZXk6IGRlZmluaXRpb25JZCJ9LAoJCXsidG9rZW5JZCIsICIxIiwgInJlc2VydmVkIGtleTogdG9rZW5JZCJ9LAoJCXsiY3JlYXRlZF9hdCIsICIxIiwgInJlc2VydmVkIGtleTogY3JlYXRlZF9hdCJ9LAoJCXsiYSxhIiwgIjEsMiIsICJhdHRyaWJ1dGVzIGtleSBkdXBsaWNhdGVkOiBhIn0sCgkJeyJhLGIiLCAiMSIsICJhdHRyaWJ1dGVzIGtleXMgYW5kIHZhbHVlcyBjb3VudCBtaXNtYXRjaCJ9LAoJCXsiLGEiLCAiMSwyIiwgImF0dHJpYnV0ZXMga2V5IG11c3QgYmUgbm90IGVtcHR5In0sCgl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgY2FzZXMgewoJCWtleXMsIHZhbHVlcywgcGFuaWNNc2cgOj0gdGMua2V5cywgdGMudmFsdWVzLCB0Yy5wYW5pY01zZwoJCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCBwYW5pY01zZywgZnVuYygpIHsKCQkJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxLCBrZXlzLCB2YWx1ZXMpCgkJfSkKCX0KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIEJhbGFuY2VPZihlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXF1aXBtZW50IG1ldGFkYXRhIG5vdCBmb3VuZDogMiIsIGZ1bmMoKSB7CgkJR2V0TWV0YWRhdGEoMikKCX0pCn0KCmZ1bmMgVGVzdEVxdWlwbWVudE93bmVkTGlzdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBFcXVpcG1lbnRUZXN0KGNyb3NzKGN1ciksIHQpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgbGVuKExpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDEsIDEwKSkpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgZXF1aXBtZW50IG93bmVyIiwgZnVuYygpIHsKCQlHZXRPd25lZENvdW50KGFkZHJlc3MoIiIpKQoJfSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGFnZSBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCUxpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDAsIDEpCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCUxpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDEsIDApCgl9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAxMDApIiwgZnVuYygpIHsKCQlMaXN0QnlPd25lcihlcXVpcG1lbnRUZXN0Lk93bmVyLCAxLCAxMDEpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAxMDAsIEdldExpc3RMaW1pdCgpKQoKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgMTEwMTAwMCwgImVuaGFuY2VtZW50IiwgIjMiKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAxLCAiIiwgIiIpCglNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDExMDEwMDIsICIiLCAiIikKCXVhc3NlcnQuRXF1YWwodCwgMywgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMyksIEJhbGFuY2VPZihlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXBhZ2UxIDo9IExpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDEsIDIpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihwYWdlMSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIxIiwgcGFnZTFbMF1bInRva2VuSWQiXSkKCXVhc3NlcnQuRXF1YWwodCwgIjExMDEwMDAiLCBwYWdlMVswXVsiZGVmaW5pdGlvbklkIl0pCgl1YXNzZXJ0LkVxdWFsKHQsICIzIiwgcGFnZTFbMF1bImVuaGFuY2VtZW50Il0pCgl1YXNzZXJ0LkVxdWFsKHQsICIyIiwgcGFnZTFbMV1bInRva2VuSWQiXSkKCXBhZ2UyIDo9IExpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDIsIDIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihwYWdlMikpCgl1YXNzZXJ0LkVxdWFsKHQsICIzIiwgcGFnZTJbMF1bInRva2VuSWQiXSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgbGVuKExpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuT3duZXIsIDMsIDIpKSkKCXBhZ2UxWzBdWyJkZWZpbml0aW9uSWQiXSA9ICJoYWNrZWQiCgl1YXNzZXJ0LkVxdWFsKHQsICIxMTAxMDAwIiwgTGlzdEJ5T3duZXIoZXF1aXBtZW50VGVzdC5Pd25lciwgMSwgMSlbMF1bImRlZmluaXRpb25JZCJdKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3duZXIpKQoJVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIGVxdWlwbWVudFRlc3QuT3RoZXIsIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIEdldE93bmVkQ291bnQoZXF1aXBtZW50VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldE93bmVkQ291bnQoZXF1aXBtZW50VGVzdC5PdGhlcikpCgl1YXNzZXJ0LkVxdWFsKHQsICIxIiwgTGlzdEJ5T3duZXIoZXF1aXBtZW50VGVzdC5PdGhlciwgMSwgMTApWzBdWyJ0b2tlbklkIl0pCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk90aGVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk90aGVyKSkKCUJ1cm4oY3Jvc3MoY3VyKSwgMSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk90aGVyKSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5BZG1pbiwgMTEwMTk5OSwgImVuaGFuY2VtZW50IiwgIjkiKQoJdWFzc2VydC5FcXVhbCh0LCB1aW50NjQoNCksIEdldExhdGVzdFRva2VuSUQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0LkFkbWluKSkKCXVhc3NlcnQuRXF1YWwodCwgIjQiLCBMaXN0QnlPd25lcihlcXVpcG1lbnRUZXN0LkFkbWluLCAxLCAxKVswXVsidG9rZW5JZCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiMTEwMTk5OSIsIExpc3RCeU93bmVyKGVxdWlwbWVudFRlc3QuQWRtaW4sIDEsIDEpWzBdWyJkZWZpbml0aW9uSWQiXSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5PdGhlciwgMSwgIiIsICIiKQoJdWFzc2VydC5FcXVhbCh0LCB1aW50NjQoNSksIEdldExhdGVzdFRva2VuSUQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk90aGVyKSkKfQoKZnVuYyBUZXN0U2V0TGlzdExpbWl0KGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEVxdWlwbWVudFRlc3QoY3Jvc3MoY3VyKSwgdCkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0LkFkbWluKSkKCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCA1MCkKCXVhc3NlcnQuRXF1YWwodCwgNTAsIEdldExpc3RMaW1pdCgpKQoKCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCAxKQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJjb3VudCBleGNlZWRzIGxpc3RMaW1pdCAobWF4OiAxKSIsIGZ1bmMoKSB7CgkJTGlzdEJ5T3duZXIoZXF1aXBtZW50VGVzdC5Pd25lciwgMSwgMikKCX0pCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJsaW1pdCBtdXN0IGJlIGF0IGxlYXN0IDEiLCBmdW5jKCkgewoJCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCAwKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxIiwgZnVuYygpIHsKCQlTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgLTEpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCA1MCkKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2V0TGlzdExpbWl0KGNyb3NzKGN1ciksIDUwKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2VxdWlwbWVudF9hZG1pbl9yZWxheSIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldExpc3RMaW1pdChjcm9zcyhjdXIpLCA1MCkKCX0pCn0KCmZ1bmMgVGVzdFNldE1pbnRlclJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEVxdWlwbWVudFRlc3QoY3Jvc3MoY3VyKSwgdCkKCW1pbnRlclBhdGggOj0gImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfbWludGVyIgoJbWludGVyIDo9IHRlc3RpbmcuTmV3Q29kZVJlYWxtKG1pbnRlclBhdGgpCgltaW50ZXJBZGRyIDo9IG1pbnRlci5BZGRyZXNzKCkKCgl1YXNzZXJ0LkVxdWFsKHQsIG1pbnRlckFkZHIuU3RyaW5nKCksIGNoYWluLlBhY2thZ2VBZGRyZXNzKG1pbnRlclBhdGgpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCBmYWxzZSwgSXNNaW50ZXJSZWFsbShtaW50ZXJBZGRyKSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0LkFkbWluKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0LkFkbWluKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicGFja2FnZSBwYXRoIGlzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiIikKCX0pCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImludmFsaWQgcGFja2FnZSBwYXRoIiwgZnVuYygpIHsKCQlTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCAiZ25vLmxhbmQvcC9ha2thZGlhL2JldGEvZXF1aXBtZW50IikKCX0pCglTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoJdWFzc2VydC5FcXVhbCh0LCB0cnVlLCBJc01pbnRlclJlYWxtKG1pbnRlckFkZHIpKQoJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgbWludGVyUGF0aCkKCXVhc3NlcnQuRXF1YWwodCwgdHJ1ZSwgSXNNaW50ZXJSZWFsbShtaW50ZXJBZGRyKSkKCglVbnNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksIG1pbnRlclBhdGgpCgl1YXNzZXJ0LkVxdWFsKHQsIGZhbHNlLCBJc01pbnRlclJlYWxtKG1pbnRlckFkZHIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwYWNrYWdlIHBhdGggaXMgbm90IGEgbWludGVyIHJlYWxtIiwgZnVuYygpIHsKCQlVbnNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksIG1pbnRlclBhdGgpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwYWNrYWdlIHBhdGggaXMgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVVuc2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgIiIpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfYWRtaW5fcmVsYXkiKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYWRtaW4gYWNjZXNzIHJlcXVpcmVkIiwgZnVuYygpIHsKCQlTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoJfSkKfQoKZnVuYyBUZXN0TWludEZyb21SZWFsbShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJc2V0dXBFcXVpcG1lbnRUZXN0KGNyb3NzKGN1ciksIHQpCgltaW50ZXIgOj0gdGVzdGluZy5OZXdDb2RlUmVhbG0oImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfbWludGVyIikKCXVucmVnaXN0ZXJlZCA6PSB0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2VxdWlwbWVudF9taW50ZXJfb3RoZXIiKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIHJlYWxtIiwgZnVuYygpIHsKCQlNaW50RnJvbVJlYWxtKGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh1bnJlZ2lzdGVyZWQpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm1pbnRlciByZWFsbSByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAwLCAiIiwgIiIpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuQWRtaW4pKQoJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfbWludGVyIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbShtaW50ZXIpCglNaW50RnJvbVJlYWxtKGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDExMDEwMDAsICJlbmhhbmNlbWVudCIsICIzIikKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDEpLCBHZXRMYXRlc3RUb2tlbklEKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGVxdWlwbWVudFRlc3QuT3duZXIsIE93bmVyT2YoMSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMTAxMDAwIiwgR2V0TWV0YWRhdGEoMSlbImRlZmluaXRpb25JZCJdKQoJdWFzc2VydC5FcXVhbCh0LCAiMyIsIEdldE1ldGFkYXRhKDEpWyJlbmhhbmNlbWVudCJdKQoJdWFzc2VydC5UcnVlKHQsIEdldE1ldGFkYXRhKDEpW2NyZWF0ZWRBdEtleV0gIT0gIiIpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIEdldE93bmVkQ291bnQoZXF1aXBtZW50VGVzdC5Pd25lcikpCgoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJlcXVpcG1lbnQgcmVjaXBpZW50IG11c3QgYmUgb3JpZ2luIGNhbGxlciIsIGZ1bmMoKSB7CgkJTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk90aGVyLCAwLCAiIiwgIiIpCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgQmFsYW5jZU9mKGVxdWlwbWVudFRlc3QuT3duZXIpKQoKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7InVnbm90IiwgMX19KQoJTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAxLCAiIiwgIiIpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uQ29pbnN7fSkKCXVhc3NlcnQuRXF1YWwodCwgdWludDY0KDIpLCBHZXRMYXRlc3RUb2tlbklEKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGVxdWlwbWVudFRlc3QuT3duZXIsIE93bmVyT2YoMikpCn0KCmZ1bmMgVGVzdEJ1cm5Gcm9tUmVhbG0oY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRXF1aXBtZW50VGVzdChjcm9zcyhjdXIpLCB0KQoJbWludGVyIDo9IHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2V4YW1wbGUvZXF1aXBtZW50X21pbnRlciIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5PcGVyYXRvcikpCglNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDAsICIiLCAiIikKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5PdGhlciwgMCwgIiIsICIiKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuQWRtaW4pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuQWRtaW4pKQoJU2V0TWludGVyUmVhbG0oY3Jvc3MoY3VyKSwgImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfbWludGVyIikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidXNlciBjYWxscyBub3QgYWxsb3dlZDogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSByZWFsbSIsIGZ1bmMoKSB7CgkJQnVybkZyb21SZWFsbShjcm9zcyhjdXIpLCAxKQoJfSkKCgl0ZXN0aW5nLlNldFJlYWxtKG1pbnRlcikKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXF1aXBtZW50IG93bmVyIG11c3QgYmUgb3JpZ2luIGNhbGxlciIsIGZ1bmMoKSB7CgkJQnVybkZyb21SZWFsbShjcm9zcyhjdXIpLCAyKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgZXF1aXBtZW50VGVzdC5PdGhlciwgT3duZXJPZigyKSkKCglCdXJuRnJvbVJlYWxtKGNyb3NzKGN1ciksIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBCYWxhbmNlT2YoZXF1aXBtZW50VGVzdC5Pd25lcikpCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgImVxdWlwbWVudCBtZXRhZGF0YSBub3QgZm91bmQ6IDEiLCBmdW5jKCkgewoJCUdldE1ldGFkYXRhKDEpCgl9KQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3BlcmF0b3IpKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAwLCAiIiwgIiIpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0obWludGVyKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBrZXk6IGRlZmluaXRpb25JZCIsIGZ1bmMoKSB7CgkJTWludEZyb21SZWFsbShjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxLCAiZGVmaW5pdGlvbklkIiwgIjEiKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgZXF1aXBtZW50VGVzdC5Pd25lciwgT3duZXJPZigzKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgR2V0T3duZWRDb3VudChlcXVpcG1lbnRUZXN0Lk93bmVyKSkKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXF1aXBtZW50IG1ldGFkYXRhIG5vdCBmb3VuZDogNCIsIGZ1bmMoKSB7CgkJR2V0TWV0YWRhdGEoNCkKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5BZG1pbikpCglVbnNldE1pbnRlclJlYWxtKGNyb3NzKGN1ciksICJnbm8ubGFuZC9yL2V4YW1wbGUvZXF1aXBtZW50X21pbnRlciIpCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk93bmVyKQoJdGVzdGluZy5TZXRSZWFsbShtaW50ZXIpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm1pbnRlciByZWFsbSByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJQnVybkZyb21SZWFsbShjcm9zcyhjdXIpLCAzKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgZXF1aXBtZW50VGVzdC5Pd25lciwgT3duZXJPZigzKSkKfQoKZnVuYyBUZXN0U2V0TWV0YWRhdGEoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRXF1aXBtZW50VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5PcGVyYXRvcikpCglNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDExMDEwMDAsICJlbmhhbmNlbWVudCxub3RlIiwgIjMsYSUyQ2IiKQoJY3JlYXRlZEF0IDo9IEdldE1ldGFkYXRhKDEpW2NyZWF0ZWRBdEtleV0KCXVhc3NlcnQuVHJ1ZSh0LCBjcmVhdGVkQXQgIT0gIiIpCglTZXRNZXRhZGF0YShjcm9zcyhjdXIpLCAxLCAiZW5oYW5jZW1lbnQiLCAiNCIpCgltZXRhIDo9IEdldE1ldGFkYXRhKDEpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMTAxMDAwIiwgbWV0YVsiZGVmaW5pdGlvbklkIl0pCgl1YXNzZXJ0LkVxdWFsKHQsICI0IiwgbWV0YVsiZW5oYW5jZW1lbnQiXSkKCXVhc3NlcnQuRXF1YWwodCwgY3JlYXRlZEF0LCBtZXRhW2NyZWF0ZWRBdEtleV0pCgl1YXNzZXJ0LkVxdWFsKHQsIDMsIGxlbihtZXRhKSkKCXVhc3NlcnQuRXF1YWwodCwgIjQiLCBMaXN0QnlPd25lcihlcXVpcG1lbnRUZXN0Lk93bmVyLCAxLCAxKVswXVsiZW5oYW5jZW1lbnQiXSkKCW1ldGFbImVuaGFuY2VtZW50Il0gPSAiaGFja2VkIgoJdWFzc2VydC5FcXVhbCh0LCAiNCIsIEdldE1ldGFkYXRhKDEpWyJlbmhhbmNlbWVudCJdKQoKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAicmVzZXJ2ZWQga2V5OiBkZWZpbml0aW9uSWQiLCBmdW5jKCkgewoJCVNldE1ldGFkYXRhKGNyb3NzKGN1ciksIDEsICJkZWZpbml0aW9uSWQiLCAiOSIpCgl9KQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJyZXNlcnZlZCBrZXk6IGNyZWF0ZWRfYXQiLCBmdW5jKCkgewoJCVNldE1ldGFkYXRhKGNyb3NzKGN1ciksIDEsICJjcmVhdGVkX2F0IiwgIjEiKQoJfSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXF1aXBtZW50IG1ldGFkYXRhIG5vdCBmb3VuZDogMiIsIGZ1bmMoKSB7CgkJU2V0TWV0YWRhdGEoY3Jvc3MoY3VyKSwgMiwgImVuaGFuY2VtZW50IiwgIjEiKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgIjExMDEwMDAiLCBHZXRNZXRhZGF0YSgxKVsiZGVmaW5pdGlvbklkIl0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5Pd25lcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5Pd25lcikpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFkbWluIG9yIG9wZXJhdG9yIGFjY2VzcyByZXF1aXJlZCIsIGZ1bmMoKSB7CgkJU2V0TWV0YWRhdGEoY3Jvc3MoY3VyKSwgMSwgImVuaGFuY2VtZW50IiwgIjUiKQoJfSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld0NvZGVSZWFsbSgiZ25vLmxhbmQvci9leGFtcGxlL2VxdWlwbWVudF9yZWxheSIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJhZG1pbiBvciBvcGVyYXRvciBhY2Nlc3MgcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldE1ldGFkYXRhKGNyb3NzKGN1ciksIDEsICJlbmhhbmNlbWVudCIsICI1IikKCX0pCn0KCmZ1bmMgVGVzdFNldE1ldGFkYXRhRnJvbVJlYWxtKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEVxdWlwbWVudFRlc3QoY3Jvc3MoY3VyKSwgdCkKCW1pbnRlclBhdGggOj0gImduby5sYW5kL3IvZXhhbXBsZS9lcXVpcG1lbnRfbWludGVyIgoJbWludGVyIDo9IHRlc3RpbmcuTmV3Q29kZVJlYWxtKG1pbnRlclBhdGgpCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5PcGVyYXRvcikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5PcGVyYXRvcikpCglNaW50KGNyb3NzKGN1ciksIGVxdWlwbWVudFRlc3QuT3duZXIsIDExMDEwMDAsICJlbmhhbmNlbWVudCIsICIzIikKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5PdGhlciwgMTEwMTAwMSwgImVuaGFuY2VtZW50IiwgIjEiKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGVxdWlwbWVudFRlc3QuT3duZXIpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJ1c2VyIGNhbGxzIG5vdCBhbGxvd2VkOiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIHJlYWxtIiwgZnVuYygpIHsKCQlTZXRNZXRhZGF0YUZyb21SZWFsbShjcm9zcyhjdXIpLCAxLCAiZW5oYW5jZW1lbnQiLCAiNCIpCgl9KQoKCXRlc3RpbmcuU2V0UmVhbG0obWludGVyKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJtaW50ZXIgcmVhbG0gcmVxdWlyZWQiLCBmdW5jKCkgewoJCVNldE1ldGFkYXRhRnJvbVJlYWxtKGNyb3NzKGN1ciksIDEsICJlbmhhbmNlbWVudCIsICI0IikKCX0pCgoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5BZG1pbikpCglTZXRNaW50ZXJSZWFsbShjcm9zcyhjdXIpLCBtaW50ZXJQYXRoKQoKCXRlc3RpbmcuU2V0T3JpZ2luQ2FsbGVyKGVxdWlwbWVudFRlc3QuT3duZXIpCgl0ZXN0aW5nLlNldFJlYWxtKG1pbnRlcikKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiZXF1aXBtZW50IG93bmVyIG11c3QgYmUgb3JpZ2luIGNhbGxlciIsIGZ1bmMoKSB7CgkJU2V0TWV0YWRhdGFGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgMiwgImVuaGFuY2VtZW50IiwgIjkiKQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgIjEiLCBHZXRNZXRhZGF0YSgyKVsiZW5oYW5jZW1lbnQiXSkKCgljcmVhdGVkQXQgOj0gR2V0TWV0YWRhdGEoMSlbY3JlYXRlZEF0S2V5XQoJU2V0TWV0YWRhdGFGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgMSwgImVuaGFuY2VtZW50IiwgIjQiKQoJdWFzc2VydC5FcXVhbCh0LCAiMTEwMTAwMCIsIEdldE1ldGFkYXRhKDEpWyJkZWZpbml0aW9uSWQiXSkKCXVhc3NlcnQuRXF1YWwodCwgIjQiLCBHZXRNZXRhZGF0YSgxKVsiZW5oYW5jZW1lbnQiXSkKCXVhc3NlcnQuRXF1YWwodCwgY3JlYXRlZEF0LCBHZXRNZXRhZGF0YSgxKVtjcmVhdGVkQXRLZXldKQoKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChjaGFpbi5Db2luc3t7InVnbm90IiwgMX19KQoJU2V0TWV0YWRhdGFGcm9tUmVhbG0oY3Jvc3MoY3VyKSwgMSwgImVuaGFuY2VtZW50IiwgIjUiKQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKGNoYWluLkNvaW5ze30pCgl1YXNzZXJ0LkVxdWFsKHQsICI1IiwgR2V0TWV0YWRhdGEoMSlbImVuaGFuY2VtZW50Il0pCn0KGkgKC2dub21vZC50b21sEjltb2R1bGUgPSAiZ25vLmxhbmQvci9ha2thZGlhL2JldGEvZXF1aXBtZW50Igpnbm8gPSAiMC45IgoanhcKCnJlbmRlci5nbm8SjxdwYWNrYWdlIGVxdWlwbWVudAoKaW1wb3J0ICgKCSJuZXQvdXJsIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9qZXJvbmltb2FsYmkvcGFnZXIvdjAiCikKCmZ1bmMgUmVuZGVyKGlVUkwgc3RyaW5nKSBzdHJpbmcgewoJYXNzZXJ0UmVuZGVyVVJMTGVuKGlVUkwpCgl1LCBlcnIgOj0gdXJsLlBhcnNlKGlVUkwpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gcmVuZGVyRXF1aXBtZW50RXJyb3IoIkludmFsaWQgVVJMIikKCX0KCglzd2l0Y2ggdS5QYXRoIHsKCWNhc2UgIiI6CgkJcmV0dXJuIHJlbmRlckVxdWlwbWVudEhvbWUoKQoJY2FzZSAib3duZXIiOgoJCXJldHVybiByZW5kZXJFcXVpcG1lbnRPd25lcihpVVJMLCBhZGRyZXNzKHUuUXVlcnkoKS5HZXQoImFkZHJlc3MiKSkpCglkZWZhdWx0OgoJCXJldHVybiByZW5kZXJFcXVpcG1lbnRFcnJvcigiTm90IGZvdW5kIikKCX0KfQoKZnVuYyByZW5kZXJFcXVpcG1lbnRIb21lKCkgc3RyaW5nIHsKCXJldHVybiBgIyBBS0tBRElBIEVxdWlwbWVudAoKTG9vayB1cCBlcXVpcG1lbnQgaGVsZCBieSBhbiBhZGRyZXNzLgoKPGduby1mb3JtIHBhdGg9Im93bmVyIj4KICA8Z25vLWlucHV0IG5hbWU9ImFkZHJlc3MiIHBsYWNlaG9sZGVyPSJFbnRlciB0aGUgYWRkcmVzcyIgLz4KPC9nbm8tZm9ybT4KYAp9CgpmdW5jIHJlbmRlckVxdWlwbWVudE93bmVyKGlVUkwgc3RyaW5nLCBvd25lciBhZGRyZXNzKSBzdHJpbmcgewoJaWYgIW93bmVyLklzVmFsaWQoKSB7CgkJcmV0dXJuIHJlbmRlckVxdWlwbWVudEVycm9yKCJJbnZhbGlkIGFkZHJlc3MiKQoJfQoKCW91dHB1dCA6PSBgIyBFcXVpcG1lbnQgSG9sZGluZ3MKClvihpAgSG9tZV0oLi9lcXVpcG1lbnQ6KQoKKiAqKkFkZHJlc3MqKjogYCArIG93bmVyLlN0cmluZygpICsgYApgCgoJdG90YWwgOj0gR2V0T3duZWRDb3VudChvd25lcikKCW91dHB1dCArPSAiKiAqKlRvdGFsKio6ICIgKyBzdHJjb252Lkl0b2EodG90YWwpICsgIlxuXG4iCglpZiB0b3RhbCA9PSAwIHsKCQlyZXR1cm4gb3V0cHV0ICsgYCpObyBlcXVpcG1lbnQgaGVsZC4qCmAKCX0KCglwYWdlU2l6ZSA6PSAyMAoJaWYgcGFnZVNpemUgPiBsaXN0TGltaXQgewoJCXBhZ2VTaXplID0gbGlzdExpbWl0Cgl9CglwYWdlcywgZXJyIDo9IHBhZ2VyLk5ldyhpVVJMLCB0b3RhbCwgcGFnZXIuV2l0aFBhZ2VTaXplKHBhZ2VTaXplKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiByZW5kZXJFcXVpcG1lbnRFcnJvcigiSW52YWxpZCBwYWdlIikKCX0KCglyb3dzIDo9IExpc3RCeU93bmVyKG93bmVyLCBwYWdlcy5QYWdlKCksIHBhZ2VzLlBhZ2VTaXplKCkpCglmb3IgXywgcm93IDo9IHJhbmdlIHJvd3MgewoJCW91dHB1dCArPSBmb3JtYXRFcXVpcG1lbnRIb2xkaW5nKHJvdykKCX0KCWlmIHBhZ2VzLkhhc1BhZ2VzKCkgewoJCW91dHB1dCArPSAiXG4iICsgcGFnZXIuUGlja2VyKHBhZ2VzKQoJfQoJcmV0dXJuIG91dHB1dAp9CgpmdW5jIGZvcm1hdEVxdWlwbWVudEhvbGRpbmcocm93IG1hcFtzdHJpbmddc3RyaW5nKSBzdHJpbmcgewoJbGluZSA6PSAiKiAqKiIgKyBlc2NhcGVFcXVpcG1lbnRNYXJrZG93bihyb3dbdG9rZW5JREtleV0pICsgIioqOiBkZWZpbml0aW9uSWQgIiArIGVzY2FwZUVxdWlwbWVudE1hcmtkb3duKHJvd1tkZWZpbml0aW9uSURLZXldKQoJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2Ugcm93IHsKCQlpZiBrZXkgPT0gdG9rZW5JREtleSB8fCBrZXkgPT0gZGVmaW5pdGlvbklES2V5IHx8IGtleSA9PSBjcmVhdGVkQXRLZXkgewoJCQljb250aW51ZQoJCX0KCQlsaW5lICs9ICIgwrcgIiArIGVzY2FwZUVxdWlwbWVudE1hcmtkb3duKGtleSkgKyAiICIgKyBlc2NhcGVFcXVpcG1lbnRNYXJrZG93bih2YWx1ZSkKCX0KCXJldHVybiBsaW5lICsgIlxuIgp9CgpmdW5jIHJlbmRlckVxdWlwbWVudEVycm9yKG1lc3NhZ2Ugc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIGAjIEVycm9yCgo+IGAgKyBlc2NhcGVFcXVpcG1lbnRNYXJrZG93bihtZXNzYWdlKSArIGAKClvihpAgSG9tZV0oLi9lcXVpcG1lbnQ6KQpgCn0KCmZ1bmMgZXNjYXBlRXF1aXBtZW50TWFya2Rvd24odmFsdWUgc3RyaW5nKSBzdHJpbmcgewoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJcXCIsICJcXFxcIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiXG4iLCAiXFxuIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiYCIsICJcXGAiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIqIiwgIlxcKiIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIl8iLCAiXFxfIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAieyIsICJcXHsiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICJ9IiwgIlxcfSIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIlsiLCAiXFxbIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiXSIsICJcXF0iKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIoIiwgIlxcKCIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIikiLCAiXFwpIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiIyIsICJcXCMiKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIrIiwgIlxcKyIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgIi0iLCAiXFwtIikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiLiIsICJcXC4iKQoJdmFsdWUgPSBzdHJpbmdzLlJlcGxhY2VBbGwodmFsdWUsICIhIiwgIlxcISIpCgl2YWx1ZSA9IHN0cmluZ3MuUmVwbGFjZUFsbCh2YWx1ZSwgInwiLCAiXFx8IikKCXZhbHVlID0gc3RyaW5ncy5SZXBsYWNlQWxsKHZhbHVlLCAiPiIsICJcXD4iKQoJcmV0dXJuIHZhbHVlCn0KGv0dCg9yZW5kZXJfdGVzdC5nbm8S6R1wYWNrYWdlIGVxdWlwbWVudAoKaW1wb3J0ICgKCSJuZXQvdXJsIgoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgopCgpmdW5jIFRlc3RSZW5kZXJIb21lQW5kT3duZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRXF1aXBtZW50VGVzdChjcm9zcyhjdXIpLCB0KQoKCWhvbWUgOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaG9tZSwgYDxnbm8tZm9ybSBwYXRoPSJvd25lciI+YCksICJzaG91bGQgcmVuZGVyIHRoZSBvd25lciBsb29rdXAgZm9ybSIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhob21lLCBgbmFtZT0iYWRkcmVzcyJgKSwgInNob3VsZCByZW5kZXIgdGhlIGFkZHJlc3MgaW5wdXQiKQoKCWVtcHR5IDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz0iICsgZXF1aXBtZW50VGVzdC5Pd25lci5TdHJpbmcoKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGVtcHR5LCBlcXVpcG1lbnRUZXN0Lk93bmVyLlN0cmluZygpKSwgInNob3VsZCByZW5kZXIgdGhlIG93bmVyIGFkZHJlc3MiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoZW1wdHksICJUb3RhbCoqOiAwIiksICJzaG91bGQgcmVuZGVyIGFuIGVtcHR5IHRvdGFsIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGVtcHR5LCAiTm8gZXF1aXBtZW50IGhlbGQiKSwgInNob3VsZCByZW5kZXIgYW4gZW1wdHkgaG9sZGluZyBsaXN0IikKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgMTEwMTAwMCwgImVuaGFuY2VtZW50IiwgIjMiKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAxLCAibm90ZSIsIHVybC5QYXRoRXNjYXBlKCIqKngqKiIpKQoKCWxpc3RlZCA6PSBSZW5kZXIoIm93bmVyP2FkZHJlc3M9IiArIGVxdWlwbWVudFRlc3QuT3duZXIuU3RyaW5nKCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICJUb3RhbCoqOiAyIiksICJzaG91bGQgcmVuZGVyIHRoZSBvd25lZCB0b2tlbiBjb3VudCIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhsaXN0ZWQsICIqKjEqKiIpLCAic2hvdWxkIHJlbmRlciB0aGUgZmlyc3QgdG9rZW4gaWQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMobGlzdGVkLCAiZGVmaW5pdGlvbklkIDExMDEwMDAiKSwgInNob3VsZCByZW5kZXIgdGhlIGRlZmluaXRpb24gaWQiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMobGlzdGVkLCAiZW5oYW5jZW1lbnQgMyIpLCAic2hvdWxkIHJlbmRlciBleHRyYSBhdHRyaWJ1dGVzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGxpc3RlZCwgYFwqXCp4XCpcKmApLCAic2hvdWxkIGVzY2FwZSBhdHRyaWJ1dGUgbWFya2Rvd24iKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGxpc3RlZCwgIioqeCoqIiksICJyYXcgbWFya2Rvd24gYXR0cmlidXRlcyBzaG91bGQgbm90IHJlbWFpbiIpCn0KCmZ1bmMgVGVzdFJlbmRlck93bmVyUGFnZXNXaGVuQ291bnRFeGNlZWRzTGltaXQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXNldHVwRXF1aXBtZW50VGVzdChjcm9zcyhjdXIpLCB0KQoJdGVzdGluZy5TZXRPcmlnaW5DYWxsZXIoZXF1aXBtZW50VGVzdC5BZG1pbikKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZXF1aXBtZW50VGVzdC5BZG1pbikpCglTZXRMaXN0TGltaXQoY3Jvc3MoY3VyKSwgMSkKCgl0ZXN0aW5nLlNldE9yaWdpbkNhbGxlcihlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShlcXVpcG1lbnRUZXN0Lk9wZXJhdG9yKSkKCU1pbnQoY3Jvc3MoY3VyKSwgZXF1aXBtZW50VGVzdC5Pd25lciwgMTEwMTAwMCwgIiIsICIiKQoJTWludChjcm9zcyhjdXIpLCBlcXVpcG1lbnRUZXN0Lk93bmVyLCAxMTAxMDAxLCAiIiwgIiIpCgoJcGFnZTEgOj0gUmVuZGVyKCJvd25lcj9hZGRyZXNzPSIgKyBlcXVpcG1lbnRUZXN0Lk93bmVyLlN0cmluZygpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTEsICJUb3RhbCoqOiAyIiksICJzaG91bGQgcmVuZGVyIHRvdGFsIGhvbGRpbmdzIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UxLCAiKioxKioiKSwgInBhZ2UgMSBzaG91bGQgaW5jbHVkZSB0aGUgZmlyc3QgdG9rZW4iKQoJdWFzc2VydC5GYWxzZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UxLCAiKioyKioiKSwgInBhZ2UgMSBzaG91bGQgbm90IGluY2x1ZGUgdGhlIHNlY29uZCB0b2tlbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlMSwgInBhZ2UgMSBvZiAyIiksICJzaG91bGQgcmVuZGVyIGEgcGFnZSBwaWNrZXIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZTEsICJwYWdlPTIiKSwgInNob3VsZCBsaW5rIHRvIHRoZSBuZXh0IHBhZ2UiKQoKCXBhZ2UyIDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz0iICsgZXF1aXBtZW50VGVzdC5Pd25lci5TdHJpbmcoKSArICImcGFnZT0yIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UyLCAiKioyKioiKSwgInBhZ2UgMiBzaG91bGQgaW5jbHVkZSB0aGUgc2Vjb25kIHRva2VuIikKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhwYWdlMiwgIioqMSoqIiksICJwYWdlIDIgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCB0b2tlbiIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlMiwgInBhZ2UgMiBvZiAyIiksICJzaG91bGQgcmVuZGVyIHRoZSBsYXN0IHBhZ2UgcGlja2VyIikKCglpbnZhbGlkUGFnZSA6PSBSZW5kZXIoIm93bmVyP2FkZHJlc3M9IiArIGVxdWlwbWVudFRlc3QuT3duZXIuU3RyaW5nKCkgKyAiJnBhZ2U9MyIpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbnZhbGlkUGFnZSwgIkludmFsaWQgcGFnZSIpLCAic2hvdWxkIHJlamVjdCBhIHBhZ2UgcGFzdCB0aGUgbGFzdCBwYWdlIikKfQoKZnVuYyBUZXN0UmVuZGVyRXJyb3JzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CglzZXR1cEVxdWlwbWVudFRlc3QoY3Jvc3MoY3VyKSwgdCkKCglpbnZhbGlkIDo9IFJlbmRlcigib3duZXI/YWRkcmVzcz1pbnZhbGlkLWFkZHJlc3MiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW52YWxpZCwgIkludmFsaWQgYWRkcmVzcyIpLCAic2hvdWxkIHJlamVjdCBhbiBpbnZhbGlkIGFkZHJlc3MiKQoKCXVua25vd24gOj0gUmVuZGVyKCJ1bmtub3duIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHVua25vd24sICJOb3QgZm91bmQiKSwgInNob3VsZCByZWplY3QgYW4gdW5rbm93biByb3V0ZSIpCn0KCmZ1bmMgVGVzdFJlbmRlclJlamVjdHNPdmVyc2l6ZWRVUkwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAidXJsIGV4Y2VlZHMgbWF4IHJ1bmVzIiwgZnVuYygpIHsKCQlSZW5kZXIoc3RyaW5ncy5SZXBlYXQoImEiLCByZW5kZXJVUkxNYXhSdW5lcysxKSkKCX0pCglSZW5kZXIoc3RyaW5ncy5SZXBlYXQoImEiLCByZW5kZXJVUkxNYXhSdW5lcykpCn0KGuMBCg52YWxpZGF0aW9uLmdubxLQAXBhY2thZ2UgZXF1aXBtZW50CgppbXBvcnQgInVuaWNvZGUvdXRmOCIKCmNvbnN0IHJlbmRlclVSTE1heFJ1bmVzID0gMTAyNAoKZnVuYyBhc3NlcnRSZW5kZXJVUkxMZW4odmFsdWUgc3RyaW5nKSB7CglpZiB1dGY4LlJ1bmVDb3VudEluU3RyaW5nKHZhbHVlKSA+IHJlbmRlclVSTE1heFJ1bmVzIHsKCQlwYW5pYygidXJsIGV4Y2VlZHMgbWF4IHJ1bmVzIikKCX0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEgiwts1qEgsxMTE3ODR1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQItRS2vq8g7O+I4ZvJRzWH7jH0BzvxYjnsf41ryBRUbwxJAL6dVg3qOW9icOJcNdD75ZZNLhmH08a9ja29DqDVAHYk3NC0jHpsYnFab8GFHIk0Eu2wNbjNhEyWxLK3lFkAWXRooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data