Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
80E3F6B6F6C85A089B4026ABD91299EA523E79E32A6A5CE234181551AC6AECA2
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
64,259,571
Requested gas limit
GAS USED
53,549,672
Gas consumed
FEE
64260ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CoO1AgoML3ZtLm1fYWRkcGtnEvG0AgooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBLDtAIKA2ducxIWZ25vLmxhbmQvci9nbm9zd2FwL2ducxqADgoJUkVBRE1FLm1kEvINIyBHTlMKCkdub1N3YXAgZ292ZXJuYW5jZSBhbmQgdXRpbGl0eSB0b2tlbi4KCiMjIE92ZXJ2aWV3CgpHTlMgaXMgdGhlIG5hdGl2ZSBnb3Zlcm5hbmNlIHRva2VuIG9mIEdub1N3YXAsIGZlYXR1cmluZyBhIGRlZmxhdGlvbmFyeSBlbWlzc2lvbiBzY2hlZHVsZSB3aXRoIGhhbHZpbmdzIGV2ZXJ5IDIgeWVhcnMgb3ZlciAxMiB5ZWFycyB0b3RhbC4KCiMjIFRva2VuIEVjb25vbWljcwoKLSAqKlN5bWJvbCoqOiBHTlMKLSAqKkRlY2ltYWxzKio6IDYKLSAqKk1heCBTdXBwbHkqKjogMSwwMDAsMDAwLDAwMCBHTlMKLSAqKkluaXRpYWwgTWludCoqOiAxMDAsMDAwLDAwMCBHTlMsIHByZS1taW50ZWQgdG8gdGhlIGNvbmZpZ3VyZWQgYEFETUlOYAogIHJvbGUgYWRkcmVzcyBkdXJpbmcgR05TIHJlYWxtIGluaXRpYWxpemF0aW9uCi0gKipUb3RhbCBFbWlzc2lvbioqOiA5MDAsMDAwLDAwMCBHTlMgb3ZlciAxMiB5ZWFycwoKIyMgRW1pc3Npb24gU2NoZWR1bGUKCnwgWWVhcnMgfCBBbm51YWwgRW1pc3Npb24gfCBSYXRlICB8CnwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLSB8CnwgMS0yICAgfCAyMjUsMDAwLDAwMCAgICAgfCAxMDAlICB8CnwgMy00ICAgfCAxMTIsNTAwLDAwMCAgICAgfCA1MCUgICB8CnwgNS02ICAgfCA1NiwyNTAsMDAwICAgICAgfCAyNSUgICB8CnwgNy04ICAgfCAyOCwxMjUsMDAwICAgICAgfCAxMi41JSB8CnwgOS0xMiAgfCAxNCwwNjIsNTAwICAgICAgfCA2LjI1JSB8CgojIyBDb3JlIEZ1bmN0aW9ucwoKIyMjIGBUcmFuc2ZlcmAKClRyYW5zZmVycyB0b2tlbnMgYmV0d2VlbiBhZGRyZXNzZXMuCgojIyMgYFRyYW5zZmVyRnJvbWAKClRyYW5zZmVycyB3aXRoIGFsbG93YW5jZS4KCiMjIyBgQXBwcm92ZWAKCkFwcHJvdmVzIHNwZW5kaW5nIGFsbG93YW5jZS4KCiMjIyBgSW5pdEVtaXNzaW9uU3RhdGVgCgpJbml0aWFsaXplcyB0aGUgZW1pc3Npb24gc2NoZWR1bGUgd2l0aCBzdGFydCBoZWlnaHQgYW5kIHRpbWVzdGFtcC4KU2V0cyB1cCB0aGUgMTIteWVhciBlbWlzc2lvbiBzY2hlZHVsZSB3aXRoIGhhbHZpbmcgcGVyaW9kcy4KT25seSBjYWxsYWJsZSBieSBlbWlzc2lvbiBjb250cmFjdC4KCiMjIyBgTWludEduc2AKCk1pbnRzIG5ldyB0b2tlbnMgcGVyIGVtaXNzaW9uIHNjaGVkdWxlLiBPbmx5IGNhbGxhYmxlIGJ5IGVtaXNzaW9uIGNvbnRyYWN0LgpDYWxjdWxhdGVzIHRva2VucyB0byBtaW50IGJhc2VkIG9uIGVsYXBzZWQgdGltZSBhbmQgdXBkYXRlcyBoYWx2aW5nIHllYXIgc3RhdGUuCgojIyBVc2FnZQoKVGhlc2Ugc25pcHBldHMgY2FsbCB0aGUgR05TIHJlYWxtIGZyb20gYSByZWFsbSBmdW5jdGlvbiB3aXRoIGEgY3VycmVudCBgY3VyYAp0b2tlbi4gSW1wb3J0IHRoZSBwYWNrYWdlIGFuZCBxdWFsaWZ5IGl0cyBmdW5jdGlvbiBuYW1lcyBpbiBpbnRlZ3JhdGluZyBjb2RlLgoKYGBgZ28KLy8gVHJhbnNmZXIgdG9rZW5zClRyYW5zZmVyKGNyb3NzKGN1ciksIHRvLCBhbW91bnQpCgovLyBBcHByb3ZlIGFuZCB0cmFuc2ZlcgpBcHByb3ZlKGNyb3NzKGN1ciksIHNwZW5kZXIsIGFtb3VudCkKVHJhbnNmZXJGcm9tKGNyb3NzKGN1ciksIGZyb20sIHRvLCBhbW91bnQpCgovLyBNaW50IHBlciBlbWlzc2lvbiBzY2hlZHVsZSAoY2FsbGVkIGJ5IGVtaXNzaW9uIGNvbnRyYWN0KQpNaW50R25zKGNyb3NzKGN1ciksIHJlY2lwaWVudEFkZHJlc3MpCmBgYAoKIyMgRGlzdHJpYnV0aW9uCgpTZWUgW2VtaXNzaW9uIGNvbnRyYWN0XSguLi9lbWlzc2lvbikgZm9yIGRpc3RyaWJ1dGlvbiBkZXRhaWxzLgoalAcKCmNvbnN0cy5nbm8ShQdwYWNrYWdlIGducwoKY29uc3QgKAoJU0VDT05EU19JTl9ZRUFSID0gMzE1MzYwMDAKCglIQUxWSU5HX1NUQVJUX1lFQVIgPSBpbnQ2NCgxKQoJSEFMVklOR19FTkRfWUVBUiAgID0gaW50NjQoMTIpCikKCi8vIE1VU1QgQkUgSU1NVVRBQkxFLCBETyBOT1QgTU9ESUZZLgovLyBBbm51YWwgaGFsdmluZyBhbW91bnQgLSBtYXhpbXVtIGlzc3VhbmNlIHBlciB5ZWFyCnZhciBoYWx2aW5nQW1vdW50c1BlclllYXIgPSBbSEFMVklOR19FTkRfWUVBUl1pbnQ2NHsKCTE4Xzc1MF8wMDBfMDAwXzAwMCAqIDEyLCAvLyBZZWFyIDE6ICAyMjUwMDAwMDAwMDAwMDAKCTE4Xzc1MF8wMDBfMDAwXzAwMCAqIDEyLCAvLyBZZWFyIDI6ICAyMjUwMDAwMDAwMDAwMDAKCTlfMzc1XzAwMF8wMDBfMDAwICogMTIsICAvLyBZZWFyIDM6ICAxMTI1MDAwMDAwMDAwMDAKCTlfMzc1XzAwMF8wMDBfMDAwICogMTIsICAvLyBZZWFyIDQ6ICAxMTI1MDAwMDAwMDAwMDAKCTRfNjg3XzUwMF8wMDBfMDAwICogMTIsICAvLyBZZWFyIDU6ICA1NjI1MDAwMDAwMDAwMAoJNF82ODdfNTAwXzAwMF8wMDAgKiAxMiwgIC8vIFllYXIgNjogIDU2MjUwMDAwMDAwMDAwCgkyXzM0M183NTBfMDAwXzAwMCAqIDEyLCAgLy8gWWVhciA3OiAgMjgxMjUwMDAwMDAwMDAKCTJfMzQzXzc1MF8wMDBfMDAwICogMTIsICAvLyBZZWFyIDg6ICAyODEyNTAwMDAwMDAwMAoJMV8xNzFfODc1XzAwMF8wMDAgKiAxMiwgIC8vIFllYXIgOTogIDE0MDYyNTAwMDAwMDAwCgkxXzE3MV84NzVfMDAwXzAwMCAqIDEyLCAgLy8gWWVhciAxMDogMTQwNjI1MDAwMDAwMDAKCTFfMTcxXzg3NV8wMDBfMDAwICogMTIsICAvLyBZZWFyIDExOiAxNDA2MjUwMDAwMDAwMAoJMV8xNzFfODc1XzAwMF8wMDAgKiAxMiwgIC8vIFllYXIgMTI6IDE0MDYyNTAwMDAwMDAwCn0KGpAICgdkb2MuZ25vEoQILy8gUGFja2FnZSBnbnMgaW1wbGVtZW50cyB0aGUgR05TIGdvdmVybmFuY2UgYW5kIHV0aWxpdHkgdG9rZW4gZm9yIEdub1N3YXAuCi8vCi8vIEdOUyBpcyBhIEdSQzIwLWNvbXBsaWFudCB0b2tlbiB3aXRoIGEgZGVmbGF0aW9uYXJ5IGVtaXNzaW9uIHNjaGVkdWxlLgovLyBUaGUgZW1pc3Npb24gZm9sbG93cyBhIDEyLXllYXIgc2NoZWR1bGUgd2l0aCBoYWx2aW5nIGV2ZXJ5IDIgeWVhcnM6Ci8vICAgLSBZZWFycyAxLTI6ICAyMjUsMDAwLDAwMCBHTlMgcGVyIHllYXIgKDEwMCUpCi8vICAgLSBZZWFycyAzLTQ6ICAxMTIsNTAwLDAwMCBHTlMgcGVyIHllYXIgKDUwJSkKLy8gICAtIFllYXJzIDUtNjogICA1NiwyNTAsMDAwIEdOUyBwZXIgeWVhciAoMjUlKQovLyAgIC0gWWVhcnMgNy04OiAgIDI4LDEyNSwwMDAgR05TIHBlciB5ZWFyICgxMi41JSkKLy8gICAtIFllYXJzIDktMTI6ICAxNCwwNjIsNTAwIEdOUyBwZXIgeWVhciAoNi4yNSUpCi8vCi8vIFRva2VuIEVjb25vbWljczoKLy8gICAtIE1heGltdW0gU3VwcGx5OiAxLDAwMCwwMDAsMDAwIEdOUwovLyAgIC0gSW5pdGlhbCBNaW50OiAgICAgMTAwLDAwMCwwMDAgR05TCi8vICAgLSBUb3RhbCBFbWlzc2lvbjogICA5MDAsMDAwLDAwMCBHTlMKLy8KLy8gS2V5IEZ1bmN0aW9uczoKLy8gICAtIEluaXRFbWlzc2lvblN0YXRlOiBJbml0aWFsaXplcyBlbWlzc2lvbiBzY2hlZHVsZSAoZW1pc3Npb24gY29udHJhY3Qgb25seSkKLy8gICAtIE1pbnRHbnM6IE1pbnRzIHRva2VucyBwZXIgZW1pc3Npb24gc2NoZWR1bGUgKGVtaXNzaW9uIGNvbnRyYWN0IG9ubHkpCi8vICAgLSBUcmFuc2Zlci9UcmFuc2ZlckZyb20vQXBwcm92ZTogU3RhbmRhcmQgR1JDMjAgb3BlcmF0aW9ucwovLwovLyBUaGUgZW1pc3Npb24gc3RhdGUgdHJhY2tzIGFjY3VtdWxhdGVkIGFuZCByZW1haW5pbmcgYW1vdW50cyBwZXIgaGFsdmluZyB5ZWFyLAovLyBlbnN1cmluZyBwcmVjaXNlIHRva2VuIGRpc3RyaWJ1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjaGVkdWxlLgpwYWNrYWdlIGducwoa4AgKDGVtaXNzaW9uLmdubxLPCHBhY2thZ2UgZ25zCgppbXBvcnQgKAoJImNoYWluIgoJInRpbWUiCgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCgkiZ25vLmxhbmQvci9nbm9zd2FwL2FjY2Vzcy92MSIKKQoKLy8gSW5pdEVtaXNzaW9uU3RhdGUgaW5pdGlhbGl6ZXMgdGhlIGVtaXNzaW9uIHNjaGVkdWxlLgovLyBJdCBjcmVhdGVzIHRoZSAxMi15ZWFyIHNjaGVkdWxlIHdpdGggdHdvLXllYXIgaGFsdmluZyBwZXJpb2RzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBjcmVhdGVkSGVpZ2h0OiBibG9jayBoZWlnaHQgd2hlbiB0aGUgc2NoZWR1bGUgaXMgaW5pdGlhbGl6ZWQKLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCB3aGVuIGVtaXNzaW9uIGJlZ2lucwovLwovLyBPbmx5IGNhbGxhYmxlIGJ5IHRoZSBlbWlzc2lvbiBjb250cmFjdC4KZnVuYyBJbml0RW1pc3Npb25TdGF0ZShjdXIgcmVhbG0sIGNyZWF0ZWRIZWlnaHQgaW50NjQsIHN0YXJ0VGltZXN0YW1wIGludDY0KSB7CglwcmV2aW91c1JlYWxtIDo9IGN1ci5QcmV2aW91cygpCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0VtaXNzaW9uKGNhbGxlcikKCgllbWlzc2lvblN0YXRlID0gTmV3RW1pc3Npb25TdGF0ZShjcmVhdGVkSGVpZ2h0LCBzdGFydFRpbWVzdGFtcCkKCgljaGFpbi5FbWl0KAoJCSJJbml0RW1pc3Npb25TdGF0ZSIsCgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2aW91c1JlYWxtLlBrZ1BhdGgoKSwKCQkiaGVpZ2h0IiwgdXRpbHMuRm9ybWF0SW50KGNyZWF0ZWRIZWlnaHQpLAoJCSJ0aW1lc3RhbXAiLCB1dGlscy5Gb3JtYXRJbnQodGltZS5Ob3coKS5Vbml4KCkpLAoJCSJzdGFydFRpbWVzdGFtcCIsIHV0aWxzLkZvcm1hdEludChlbWlzc2lvblN0YXRlLmdldFN0YXJ0VGltZXN0YW1wKCkpLAoJCSJlbmRUaW1lc3RhbXAiLCB1dGlscy5Gb3JtYXRJbnQoZW1pc3Npb25TdGF0ZS5nZXRFbmRUaW1lc3RhbXAoKSksCgkpCn0KGqwsChJlbWlzc2lvbl9zdGF0ZS5nbm8SlSxwYWNrYWdlIGducwoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJInRpbWUiCgoJZ25zbWF0aCAiZ25vLmxhbmQvcC9nbm9zd2FwL2duc21hdGgvdjEiCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCnZhciBlbWlzc2lvblN0YXRlICpFbWlzc2lvblN0YXRlCgpmdW5jIGluaXQoKSB7CgllbWlzc2lvblN0YXRlID0gTmV3RW1pc3Npb25TdGF0ZSgwLCAwKQp9CgovLyBFbWlzc2lvblN0YXRlIG1hbmFnZXMgZW1pc3Npb24gc3RhdGUgYW5kIGhhbHZpbmcgZGF0YS4KLy8gVHJhY2tzIGVtaXNzaW9uIHRpbWluZywgc3RhdHVzLCBhbmQgaGFsdmluZyB5ZWFyIGluZm9ybWF0aW9uIGZvciAxMi15ZWFyIHNjaGVkdWxlLgp0eXBlIEVtaXNzaW9uU3RhdGUgc3RydWN0IHsKCWNyZWF0ZWRIZWlnaHQgIGludDY0CglzdGFydFRpbWVzdGFtcCBpbnQ2NAoJZW5kVGltZXN0YW1wICAgaW50NjQKCWhhbHZpbmdEYXRhICAgICpIYWx2aW5nRGF0YQp9CgovLyBpc0luaXRpYWxpemVkIHJldHVybnMgdHJ1ZSBpZiBlbWlzc2lvbiBzdGF0ZSBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHZhbGlkIGhlaWdodCBhbmQgdGltZXN0YW1wLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBpc0luaXRpYWxpemVkKCkgYm9vbCB7CglyZXR1cm4gZS5jcmVhdGVkSGVpZ2h0ICE9IDAgJiYgZS5zdGFydFRpbWVzdGFtcCAhPSAwCn0KCi8vIGlzQWN0aXZlIHJldHVybnMgdHJ1ZSBpZiBlbWlzc2lvbiBpcyBjdXJyZW50bHkgYWN0aXZlIGF0IHRoZSBnaXZlbiB0aW1lc3RhbXAuCi8vIFJldHVybnMgZmFsc2UgaWYgbm90IGluaXRpYWxpemVkIG9yIHRpbWVzdGFtcCBpcyBvdXRzaWRlIGVtaXNzaW9uIHBlcmlvZC4KZnVuYyAoZSAqRW1pc3Npb25TdGF0ZSkgaXNBY3RpdmUodGltZXN0YW1wIGludDY0KSBib29sIHsKCWlmICFlLmlzSW5pdGlhbGl6ZWQoKSB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJaWYgZS5zdGFydFRpbWVzdGFtcCA+IHRpbWVzdGFtcCB7CgkJcmV0dXJuIGZhbHNlCgl9CgoJaWYgZS5lbmRUaW1lc3RhbXAgPCB0aW1lc3RhbXAgewoJCXJldHVybiBmYWxzZQoJfQoKCXJldHVybiB0cnVlCn0KCi8vIGlzRW5kZWQgcmV0dXJucyB0cnVlIGlmIGVtaXNzaW9uIGhhcyBlbmRlZCBhdCB0aGUgZ2l2ZW4gdGltZXN0YW1wLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBpc0VuZGVkKHRpbWVzdGFtcCBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gZS5lbmRUaW1lc3RhbXAgPCB0aW1lc3RhbXAKfQoKLy8gZ2V0Q3VycmVudFllYXIgcmV0dXJucyB0aGUgaGFsdmluZyB5ZWFyICgxLTEyKSBmb3IgdGhlIGdpdmVuIHRpbWVzdGFtcCwgb3IgMCBpZiBvdXRzaWRlIGVtaXNzaW9uIHBlcmlvZC4KZnVuYyAoZSAqRW1pc3Npb25TdGF0ZSkgZ2V0Q3VycmVudFllYXIodGltZXN0YW1wIGludDY0KSBpbnQ2NCB7CglpZiB0aW1lc3RhbXAgPCBlLnN0YXJ0VGltZXN0YW1wIHsKCQlyZXR1cm4gMAoJfQoKCWlmIHRpbWVzdGFtcCA+IGUuZW5kVGltZXN0YW1wIHsKCQlyZXR1cm4gMAoJfQoKCXllYXIgOj0gKHRpbWVzdGFtcCAtIGUuc3RhcnRUaW1lc3RhbXApIC8gU0VDT05EU19JTl9ZRUFSCglyZXR1cm4geWVhciArIDEKfQoKLy8gZ2V0Q3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9ja2NoYWluIGhlaWdodCB3aGVuIGVtaXNzaW9uIHN0YXJ0ZWQuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldENyZWF0ZWRIZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gZS5jcmVhdGVkSGVpZ2h0Cn0KCi8vIGdldFN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIGVtaXNzaW9uIHN0YXJ0ZWQuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldFN0YXJ0VGltZXN0YW1wKCkgaW50NjQgewoJcmV0dXJuIGUuc3RhcnRUaW1lc3RhbXAKfQoKLy8gZ2V0RW5kVGltZXN0YW1wIHJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIGVtaXNzaW9uIGVuZHMuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldEVuZFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBlLmVuZFRpbWVzdGFtcAp9CgovLyBnZXRIYWx2aW5nRGF0YSByZXR1cm5zIHRoZSBoYWx2aW5nIGRhdGEgY29udGFpbmluZyBlbWlzc2lvbiBzY2hlZHVsZSBkZXRhaWxzLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBnZXRIYWx2aW5nRGF0YSgpICpIYWx2aW5nRGF0YSB7CglyZXR1cm4gZS5oYWx2aW5nRGF0YQp9CgovLyBnZXRIYWx2aW5nWWVhclN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIHN0YXJ0IHRpbWVzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldEhhbHZpbmdZZWFyU3RhcnRUaW1lc3RhbXAoeWVhciBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIGUuaGFsdmluZ0RhdGEuZ2V0U3RhcnRUaW1lc3RhbXAoeWVhcikKfQoKLy8gZ2V0SGFsdmluZ1llYXJFbmRUaW1lc3RhbXAgcmV0dXJucyB0aGUgZW5kIHRpbWVzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldEhhbHZpbmdZZWFyRW5kVGltZXN0YW1wKHllYXIgaW50NjQpIGludDY0IHsKCXJldHVybiBlLmhhbHZpbmdEYXRhLmdldEVuZFRpbWVzdGFtcCh5ZWFyKQp9CgovLyBnZXRIYWx2aW5nWWVhckFtb3VudFBlclNlY29uZCByZXR1cm5zIHRoZSBlbWlzc2lvbiByYXRlIHBlciBzZWNvbmQgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBnZXRIYWx2aW5nWWVhckFtb3VudFBlclNlY29uZCh5ZWFyIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gZS5oYWx2aW5nRGF0YS5nZXRBbW91bnRQZXJTZWNvbmQoeWVhcikKfQoKLy8gZ2V0SGFsdmluZ1llYXJNaW50ZWRBbW91bnQgcmV0dXJucyB0aGUgbWludGVkIGVtaXNzaW9uIGFtb3VudCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldEhhbHZpbmdZZWFyTWludGVkQW1vdW50KHllYXIgaW50NjQpIGludDY0IHsKCXJldHVybiBlLmhhbHZpbmdEYXRhLmdldE1pbnRlZEFtb3VudCh5ZWFyKQp9CgovLyBnZXRIYWx2aW5nWWVhckxlZnRBbW91bnQgcmV0dXJucyB0aGUgcmVtYWluaW5nIGVtaXNzaW9uIGFtb3VudCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCmZ1bmMgKGUgKkVtaXNzaW9uU3RhdGUpIGdldEhhbHZpbmdZZWFyTGVmdEFtb3VudCh5ZWFyIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gZS5oYWx2aW5nRGF0YS5nZXRMZWZ0QW1vdW50KHllYXIpCn0KCi8vIGFkZEhhbHZpbmdZZWFyTWludGVkQW1vdW50IGFkZHMgdG8gdGhlIG1pbnRlZCBlbWlzc2lvbiBhbW91bnQgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgovLyBSZXR1cm5zIGVycm9yIGlmIHllYXIgaXMgaW52YWxpZCAoMCBvciBvdXRzaWRlIDEtMTIgcmFuZ2UpLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBhZGRIYWx2aW5nWWVhck1pbnRlZEFtb3VudCh5ZWFyIGludDY0LCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmIHllYXIgPT0gMCB7CgkJcmV0dXJuIG1ha2VFcnJvcldpdGhEZXRhaWxzKGVyckludmFsaWRZZWFyLCB1Zm10LlNwcmludGYoInllYXI6ICVkIiwgeWVhcikpCgl9CgoJbWludGVkQW1vdW50IDo9IGUuaGFsdmluZ0RhdGEuZ2V0TWludGVkQW1vdW50KHllYXIpCgltaW50ZWRBbW91bnQgPSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChtaW50ZWRBbW91bnQsIGFtb3VudCkKCglyZXR1cm4gZS5oYWx2aW5nRGF0YS5zZXRNaW50ZWRBbW91bnQoeWVhciwgbWludGVkQW1vdW50KQp9CgovLyBzdWJIYWx2aW5nWWVhckxlZnRBbW91bnQgc3VidHJhY3RzIGZyb20gdGhlIHJlbWFpbmluZyBlbWlzc2lvbiBhbW91bnQgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgovLyBSZXR1cm5zIGVycm9yIGlmIHllYXIgaXMgaW52YWxpZCAoMCBvciBvdXRzaWRlIDEtMTIgcmFuZ2UpLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBzdWJIYWx2aW5nWWVhckxlZnRBbW91bnQoeWVhciBpbnQ2NCwgYW1vdW50IGludDY0KSBlcnJvciB7CglpZiB5ZWFyID09IDAgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkWWVhciwgdWZtdC5TcHJpbnRmKCJ5ZWFyOiAlZCIsIHllYXIpKQoJfQoKCWxlZnRBbW91bnQgOj0gZS5oYWx2aW5nRGF0YS5nZXRMZWZ0QW1vdW50KHllYXIpCglsZWZ0QW1vdW50ID0gZ25zbWF0aC5TYWZlU3ViSW50NjQobGVmdEFtb3VudCwgYW1vdW50KQoKCXJldHVybiBlLmhhbHZpbmdEYXRhLnNldExlZnRBbW91bnQoeWVhciwgbGVmdEFtb3VudCkKfQoKLy8gQ2xvbmUgcmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZW1pc3Npb24gc3RhdGUsIGluY2x1ZGluZyBpbmRlcGVuZGVudCBoYWx2aW5nIGRhdGEuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjbG9uZTogaW5kZXBlbmRlbnQgRW1pc3Npb25TdGF0ZSBjb3B5IHdpdGggdGhlIHNhbWUgc2NoZWR1bGUgdmFsdWVzLgpmdW5jIChlICpFbWlzc2lvblN0YXRlKSBDbG9uZSgpICpFbWlzc2lvblN0YXRlIHsKCXJldHVybiAmRW1pc3Npb25TdGF0ZXsKCQljcmVhdGVkSGVpZ2h0OiAgZS5jcmVhdGVkSGVpZ2h0LAoJCXN0YXJ0VGltZXN0YW1wOiBlLnN0YXJ0VGltZXN0YW1wLAoJCWVuZFRpbWVzdGFtcDogICBlLmVuZFRpbWVzdGFtcCwKCQloYWx2aW5nRGF0YTogICAgZS5oYWx2aW5nRGF0YS5DbG9uZSgpLAoJfQp9CgovLyBOZXdFbWlzc2lvblN0YXRlIGNyZWF0ZXMgYW4gZW1pc3Npb24gc3RhdGUgYW5kIGl0cyAxMi15ZWFyIGhhbHZpbmcgc2NoZWR1bGUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjcmVhdGVkSGVpZ2h0OiBibG9ja2NoYWluIGhlaWdodCByZWNvcmRlZCBhcyB0aGUgc2NoZWR1bGUncyBjcmVhdGlvbiBoZWlnaHQuCi8vICAgLSBzdGFydFRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGZpcnN0IGhhbHZpbmcgeWVhciBiZWdpbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdGF0ZTogbmV3bHkgYWxsb2NhdGVkIGVtaXNzaW9uIHN0YXRlIHdpdGggYW4gZW5kIHRpbWVzdGFtcCBhbmQgaW5pdGlhbGl6ZWQgaGFsdmluZyBkYXRhLgpmdW5jIE5ld0VtaXNzaW9uU3RhdGUoY3JlYXRlZEhlaWdodCBpbnQ2NCwgc3RhcnRUaW1lc3RhbXAgaW50NjQpICpFbWlzc2lvblN0YXRlIHsKCWVtaXNzaW9uRW5kVGltZSA6PSBnbnNtYXRoLlNhZmVBZGRJbnQ2NChzdGFydFRpbWVzdGFtcCwgU0VDT05EU19JTl9ZRUFSKkhBTFZJTkdfRU5EX1lFQVItMSkKCglyZXR1cm4gJkVtaXNzaW9uU3RhdGV7CgkJY3JlYXRlZEhlaWdodDogIGNyZWF0ZWRIZWlnaHQsCgkJc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZXN0YW1wLAoJCWVuZFRpbWVzdGFtcDogICBlbWlzc2lvbkVuZFRpbWUsCgkJaGFsdmluZ0RhdGE6ICAgIE5ld0hhbHZpbmdEYXRhKHN0YXJ0VGltZXN0YW1wKSwKCX0KfQoKLy8gZ2V0RW1pc3Npb25TdGF0ZSByZXR1cm5zIHRoZSBzaW5nbGV0b24gZW1pc3Npb24gc3RhdGUgaW5zdGFuY2UuCmZ1bmMgZ2V0RW1pc3Npb25TdGF0ZSgpICpFbWlzc2lvblN0YXRlIHsKCWlmIGVtaXNzaW9uU3RhdGUgPT0gbmlsIHsKCQllbWlzc2lvblN0YXRlID0gTmV3RW1pc3Npb25TdGF0ZShydW50aW1lLkNoYWluSGVpZ2h0KCksIHRpbWUuTm93KCkuVW5peCgpKQoJfQoKCXJldHVybiBlbWlzc2lvblN0YXRlCn0KGpUDCgplcnJvcnMuZ25vEoYDcGFja2FnZSBnbnMKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0ICgKCWVyckludmFsaWRZZWFyICAgICAgICAgICA9ICJbR05PU1dBUC1HTlMtMDAxXSBpbnZhbGlkIHllYXIiCgllcnJUb29NYW55RW1pc3Npb24gICAgICAgPSAiW0dOT1NXQVAtR05TLTAwMl0gdG9vIG1hbnkgZW1pc3Npb24gcmV3YXJkIgoJZXJySW52YWxpZEVtaXNzaW9uQW1vdW50ID0gIltHTk9TV0FQLUdOUy0wMDNdIGludmFsaWQgZW1pc3Npb24gYW1vdW50IgopCgpmdW5jIG1ha2VFcnJvcldpdGhEZXRhaWxzKG1lc3NhZ2Ugc3RyaW5nLCBkZXRhaWxzIHN0cmluZykgZXJyb3IgewoJcmV0dXJuIHVmbXQuRXJyb3JmKCIlcyB8fCAlcyIsIG1lc3NhZ2UsIGRldGFpbHMpCn0KGr9VCgpnZXR0ZXIuZ25vErBVcGFja2FnZSBnbnMKCmltcG9ydCAoCgkidGltZSIKCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKKQoKLy8gR2V0TWF4RW1pc3Npb25BbW91bnQgcmV0dXJucyB0aGUgY29uZmlndXJlZCBsaWZldGltZSBHTlMgZW1pc3Npb24gY2FwIGluIGJhc2UgdW5pdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtYXhBbW91bnQ6IG1heGltdW0gbnVtYmVyIG9mIEdOUyBiYXNlIHVuaXRzIGF2YWlsYWJsZSBmb3IgZW1pc3Npb24KZnVuYyBHZXRNYXhFbWlzc2lvbkFtb3VudCgpIGludDY0IHsKCXJldHVybiBNQVhfRU1JU1NJT05fQU1PVU5UCn0KCi8vIEdldE1heGltdW1TdXBwbHkgcmV0dXJucyB0aGUgbWF4aW11bSBwb3NzaWJsZSBHTlMgdG9rZW4gc3VwcGx5IGluIGJhc2UgdW5pdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtYXhpbXVtU3VwcGx5OiBjb25maWd1cmVkIHRvdGFsIHN1cHBseSBjYXAsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBtaW50IGFuZCBlbWlzc2lvbnMKZnVuYyBHZXRNYXhpbXVtU3VwcGx5KCkgaW50NjQgewoJcmV0dXJuIE1BWElNVU1fU1VQUExZCn0KCi8vIEdldEluaXRpYWxNaW50QW1vdW50IHJldHVybnMgdGhlIGluaXRpYWwgR05TIGFsbG9jYXRpb24gbWludGVkIGJlZm9yZSBlbWlzc2lvbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpbml0aWFsQW1vdW50OiBudW1iZXIgb2YgR05TIGJhc2UgdW5pdHMgaW4gdGhlIGluaXRpYWwgbWludApmdW5jIEdldEluaXRpYWxNaW50QW1vdW50KCkgaW50NjQgewoJcmV0dXJuIElOSVRJQUxfTUlOVF9BTU9VTlQKfQoKLy8gSXNFbWlzc2lvbkluaXRpYWxpemVkIHJlcG9ydHMgd2hldGhlciB0aGUgZW1pc3Npb24gc3RhdGUgaGFzIG5vbi16ZXJvIGNyZWF0aW9uCi8vIGhlaWdodCBhbmQgc3RhcnQgdGltZXN0YW1wLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaW5pdGlhbGl6ZWQ6IHRydWUgd2hlbiBib3RoIGluaXRpYWxpemF0aW9uIGZpZWxkcyBhcmUgc2V0OyBmYWxzZSBvdGhlcndpc2UKZnVuYyBJc0VtaXNzaW9uSW5pdGlhbGl6ZWQoKSBib29sIHsKCXJldHVybiBnZXRFbWlzc2lvblN0YXRlKCkuaXNJbml0aWFsaXplZCgpCn0KCi8vIElzRW1pc3Npb25BY3RpdmUgcmVwb3J0cyB3aGV0aGVyIGVtaXNzaW9uIGlzIGluaXRpYWxpemVkIGFuZCB0aGUgY3VycmVudCBVbml4Ci8vIHRpbWUgbGllcyB3aXRoaW4gdGhlIGluY2x1c2l2ZSBlbWlzc2lvbiBzY2hlZHVsZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjdGl2ZTogdHJ1ZSBkdXJpbmcgdGhlIGNvbmZpZ3VyZWQgc2NoZWR1bGUsIGluY2x1ZGluZyBpdHMgZW5kcG9pbnRzOyBmYWxzZSBvdGhlcndpc2UKZnVuYyBJc0VtaXNzaW9uQWN0aXZlKCkgYm9vbCB7CglyZXR1cm4gZ2V0RW1pc3Npb25TdGF0ZSgpLmlzQWN0aXZlKHRpbWUuTm93KCkuVW5peCgpKQp9CgovLyBJc0VtaXNzaW9uRW5kZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBjdXJyZW50IFVuaXggdGltZSBpcyBhZnRlciB0aGUgZW1pc3Npb24gZW5kIHRpbWVzdGFtcC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVuZGVkOiB0cnVlIGFmdGVyIHRoZSBjb25maWd1cmVkIHNjaGVkdWxlJ3MgZW5kOyBmYWxzZSBhdCBvciBiZWZvcmUgdGhhdCB0aW1lc3RhbXAKZnVuYyBJc0VtaXNzaW9uRW5kZWQoKSBib29sIHsKCXJldHVybiBnZXRFbWlzc2lvblN0YXRlKCkuaXNFbmRlZCh0aW1lLk5vdygpLlVuaXgoKSkKfQoKLy8gR2V0SGFsdmluZ1llYXIgcmV0dXJucyB0aGUgaGFsdmluZyB5ZWFyIGNvbnRhaW5pbmcgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCB0byBjbGFzc2lmeSBhZ2FpbnN0IHRoZSBpbmNsdXNpdmUgMTIteWVhciBlbWlzc2lvbiBzY2hlZHVsZQovLwovLyBSZXR1cm5zOgovLyAgIC0geWVhcjogaGFsdmluZyB5ZWFyIGluIFsxLCAxMl0sIG9yIDAgd2hlbiB0aW1lc3RhbXAgaXMgYmVmb3JlIHRoZSBzdGFydCBvciBhZnRlciB0aGUgZW5kCmZ1bmMgR2V0SGFsdmluZ1llYXIodGltZXN0YW1wIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEN1cnJlbnRZZWFyKHRpbWVzdGFtcCkKfQoKLy8gR2V0Q3VycmVudFllYXIgcmV0dXJucyB0aGUgaGFsdmluZyB5ZWFyIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgVW5peCB0aW1lLgovLwovLyBSZXR1cm5zOgovLyAgIC0geWVhcjogY3VycmVudCBoYWx2aW5nIHllYXIgaW4gWzEsIDEyXSwgb3IgMCB3aGVuIHRoZSBjdXJyZW50IHRpbWUgaXMgb3V0c2lkZSB0aGUgc2NoZWR1bGUKZnVuYyBHZXRDdXJyZW50WWVhcigpIGludDY0IHsKCXJldHVybiBnZXRFbWlzc2lvblN0YXRlKCkuZ2V0Q3VycmVudFllYXIodGltZS5Ob3coKS5Vbml4KCkpCn0KCi8vIEdldEVtaXNzaW9uQW1vdW50UGVyU2Vjb25kSW5SYW5nZSByZXR1cm5zIHBhaXJlZCBlbWlzc2lvbi1yYXRlIGNoYW5nZSBwb2ludHMKLy8gd2hvc2UgdGltZXN0YW1wcyBmYWxsIHdpdGhpbiB0aGUgcmVxdWVzdGVkIHJhbmdlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZnJvbVRpbWU6IGluY2x1c2l2ZSBVbml4IHRpbWVzdGFtcCBsb3dlciBib3VuZAovLyAgIC0gdG9UaW1lOiBpbmNsdXNpdmUgVW5peCB0aW1lc3RhbXAgdXBwZXIgYm91bmQ7IGEgbG93ZXIgdmFsdWUgeWllbGRzIG5pbCBzbGljZXMKLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcHM6IHNjaGVkdWxlIHRpbWVzdGFtcHMgaW4gdGhlIHJhbmdlIHdoZXJlIHRoZSByYXRlIGNoYW5nZXMsIGluY2x1ZGluZyB0aGUgcG9zdC1lbmQgemVyby1yYXRlIHBvaW50IHdoZW4gYXBwbGljYWJsZQovLyAgIC0gYW1vdW50czogR05TIGJhc2UgdW5pdHMgZW1pdHRlZCBwZXIgc2Vjb25kIGF0IGVhY2ggY29ycmVzcG9uZGluZyB0aW1lc3RhbXA7IHNhbWUgbGVuZ3RoIGFuZCBvcmRlciBhcyB0aW1lc3RhbXBzCmZ1bmMgR2V0RW1pc3Npb25BbW91bnRQZXJTZWNvbmRJblJhbmdlKGZyb21UaW1lLCB0b1RpbWUgaW50NjQpIChbXWludDY0LCBbXWludDY0KSB7CglpZiBmcm9tVGltZSA+IHRvVGltZSB7CgkJcmV0dXJuIG5pbCwgbmlsCgl9CgoJaGFsdmluZ0RhdGEgOj0gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEhhbHZpbmdEYXRhKCkKCWhhbHZpbmdUaW1lcyA6PSBtYWtlKFtdaW50NjQsIDAsIEhBTFZJTkdfRU5EX1lFQVIrMSkKCWhhbHZpbmdFbWlzc2lvbnMgOj0gbWFrZShbXWludDY0LCAwLCBIQUxWSU5HX0VORF9ZRUFSKzEpCgoJZm9yIHllYXIgOj0gSEFMVklOR19TVEFSVF9ZRUFSOyB5ZWFyIDw9IEhBTFZJTkdfRU5EX1lFQVI7IHllYXIrKyB7CgkJc3RhcnRUaW1lc3RhbXAgOj0gaGFsdmluZ0RhdGEuZ2V0U3RhcnRUaW1lc3RhbXAoeWVhcikKCQlpZiBzdGFydFRpbWVzdGFtcCA8IGZyb21UaW1lIHsKCQkJY29udGludWUKCQl9CgoJCWlmIHRvVGltZSA8IHN0YXJ0VGltZXN0YW1wIHsKCQkJYnJlYWsKCQl9CgoJCWhhbHZpbmdUaW1lcyA9IGFwcGVuZChoYWx2aW5nVGltZXMsIHN0YXJ0VGltZXN0YW1wKQoJCWhhbHZpbmdFbWlzc2lvbnMgPSBhcHBlbmQoaGFsdmluZ0VtaXNzaW9ucywgaGFsdmluZ0RhdGEuZ2V0QW1vdW50UGVyU2Vjb25kKHllYXIpKQoJfQoKCWVtaXNzaW9uRW5kVGltZXN0YW1wIDo9IGhhbHZpbmdEYXRhLmdldEVuZFRpbWVzdGFtcChIQUxWSU5HX0VORF9ZRUFSKQoJaWYgZnJvbVRpbWUgPD0gZW1pc3Npb25FbmRUaW1lc3RhbXAgJiYgZW1pc3Npb25FbmRUaW1lc3RhbXAgPCB0b1RpbWUgewoJCWhhbHZpbmdUaW1lcyA9IGFwcGVuZChoYWx2aW5nVGltZXMsIGduc21hdGguU2FmZUFkZEludDY0KGVtaXNzaW9uRW5kVGltZXN0YW1wLCAxKSkKCQloYWx2aW5nRW1pc3Npb25zID0gYXBwZW5kKGhhbHZpbmdFbWlzc2lvbnMsIDApCgl9CgoJcmV0dXJuIGhhbHZpbmdUaW1lcywgaGFsdmluZ0VtaXNzaW9ucwp9CgovLyBHZXRFbWlzc2lvbkFtb3VudFBlclNlY29uZEJ5VGltZXN0YW1wIHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgR05TIGVtaXNzaW9uCi8vIHJhdGUgZm9yIHRoZSBoYWx2aW5nIHllYXIgY29udGFpbmluZyB0aW1lc3RhbXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lc3RhbXA6IFVuaXggdGltZXN0YW1wIHdob3NlIHNjaGVkdWxlIHJhdGUgaXMgcXVlcmllZAovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBHTlMgYmFzZSB1bml0cyBlbWl0dGVkIHBlciBzZWNvbmQgZm9yIHRpbWVzdGFtcCdzIGhhbHZpbmcgeWVhciwgb3IgMCBvdXRzaWRlIHRoZSBzY2hlZHVsZQpmdW5jIEdldEVtaXNzaW9uQW1vdW50UGVyU2Vjb25kQnlUaW1lc3RhbXAodGltZXN0YW1wIGludDY0KSBpbnQ2NCB7CglzdGF0ZSA6PSBnZXRFbWlzc2lvblN0YXRlKCkKCXllYXIgOj0gc3RhdGUuZ2V0Q3VycmVudFllYXIodGltZXN0YW1wKQoJcmV0dXJuIHN0YXRlLmdldEhhbHZpbmdZZWFyQW1vdW50UGVyU2Vjb25kKHllYXIpCn0KCi8vIEdldEVtaXNzaW9uTGVmdEFtb3VudEJ5VGltZXN0YW1wIHJldHVybnMgdGhlIHN0b3JlZCB1bm1pbnRlZCBhbGxvY2F0aW9uIGZvcgovLyB0aGUgaGFsdmluZyB5ZWFyIGNvbnRhaW5pbmcgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCB1c2VkIHRvIHNlbGVjdCBhIGhhbHZpbmcgeWVhcgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiByZW1haW5pbmcgR05TIGJhc2UgdW5pdHMgcmVjb3JkZWQgZm9yIHRoYXQgaGFsdmluZyB5ZWFyLCBvciAwIG91dHNpZGUgdGhlIHNjaGVkdWxlCmZ1bmMgR2V0RW1pc3Npb25MZWZ0QW1vdW50QnlUaW1lc3RhbXAodGltZXN0YW1wIGludDY0KSBpbnQ2NCB7CglzdGF0ZSA6PSBnZXRFbWlzc2lvblN0YXRlKCkKCXllYXIgOj0gc3RhdGUuZ2V0Q3VycmVudFllYXIodGltZXN0YW1wKQoJcmV0dXJuIHN0YXRlLmdldEhhbHZpbmdZZWFyTGVmdEFtb3VudCh5ZWFyKQp9CgovLyBHZXRFbWlzc2lvbkFjY3VtdWxhdGVkQW1vdW50QnlUaW1lc3RhbXAgcmV0dXJucyB0aGUgc3RvcmVkIG1pbnRlZCBhbGxvY2F0aW9uCi8vIGZvciB0aGUgaGFsdmluZyB5ZWFyIGNvbnRhaW5pbmcgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCB1c2VkIHRvIHNlbGVjdCBhIGhhbHZpbmcgeWVhcgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBtaW50ZWQgR05TIGJhc2UgdW5pdHMgcmVjb3JkZWQgZm9yIHRoYXQgaGFsdmluZyB5ZWFyLCBvciAwIG91dHNpZGUgdGhlIHNjaGVkdWxlCmZ1bmMgR2V0RW1pc3Npb25BY2N1bXVsYXRlZEFtb3VudEJ5VGltZXN0YW1wKHRpbWVzdGFtcCBpbnQ2NCkgaW50NjQgewoJc3RhdGUgOj0gZ2V0RW1pc3Npb25TdGF0ZSgpCgl5ZWFyIDo9IHN0YXRlLmdldEN1cnJlbnRZZWFyKHRpbWVzdGFtcCkKCXJldHVybiBzdGF0ZS5nZXRIYWx2aW5nWWVhck1pbnRlZEFtb3VudCh5ZWFyKQp9CgovLyBHZXRIYWx2aW5nWWVhclN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIGluY2x1c2l2ZSBzdGFydCBVbml4IHRpbWVzdGFtcCBmb3IKLy8gYSBjb25maWd1cmVkIGhhbHZpbmcgeWVhci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHllYXI6IGhhbHZpbmcgeWVhciBudW1iZXIgaW4gWzEsIDEyXQovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBpbmNsdXNpdmUgc3RhcnQgdGltZXN0YW1wIGZvciB5ZWFyLCBvciAwIHdoZW4geWVhciBpcyBpbnZhbGlkCmZ1bmMgR2V0SGFsdmluZ1llYXJTdGFydFRpbWVzdGFtcCh5ZWFyIGludDY0KSBpbnQ2NCB7CgloYWx2aW5nRGF0YSA6PSBnZXRFbWlzc2lvblN0YXRlKCkuZ2V0SGFsdmluZ0RhdGEoKQoJcmV0dXJuIGhhbHZpbmdEYXRhLmdldFN0YXJ0VGltZXN0YW1wKHllYXIpCn0KCi8vIEdldEhhbHZpbmdZZWFyRW5kVGltZXN0YW1wIHJldHVybnMgdGhlIGluY2x1c2l2ZSBlbmQgVW5peCB0aW1lc3RhbXAgZm9yIGEKLy8gY29uZmlndXJlZCBoYWx2aW5nIHllYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgbnVtYmVyIGluIFsxLCAxMl0KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWVzdGFtcDogaW5jbHVzaXZlIGVuZCB0aW1lc3RhbXAgZm9yIHllYXIsIG9yIDAgd2hlbiB5ZWFyIGlzIGludmFsaWQKZnVuYyBHZXRIYWx2aW5nWWVhckVuZFRpbWVzdGFtcCh5ZWFyIGludDY0KSBpbnQ2NCB7CgloYWx2aW5nRGF0YSA6PSBnZXRFbWlzc2lvblN0YXRlKCkuZ2V0SGFsdmluZ0RhdGEoKQoJcmV0dXJuIGhhbHZpbmdEYXRhLmdldEVuZFRpbWVzdGFtcCh5ZWFyKQp9CgovLyBHZXRIYWx2aW5nWWVhck1heEFtb3VudCByZXR1cm5zIHRoZSBtYXhpbXVtIEdOUyBhbGxvY2F0aW9uIGZvciBhIGhhbHZpbmcgeWVhci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHllYXI6IGhhbHZpbmcgeWVhciBudW1iZXIgaW4gWzEsIDEyXQovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBtYXhpbXVtIEdOUyBiYXNlIHVuaXRzIGFsbG9jYXRlZCB0byB5ZWFyLCBvciAwIHdoZW4geWVhciBpcyBpbnZhbGlkCmZ1bmMgR2V0SGFsdmluZ1llYXJNYXhBbW91bnQoeWVhciBpbnQ2NCkgaW50NjQgewoJaGFsdmluZ0RhdGEgOj0gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEhhbHZpbmdEYXRhKCkKCXJldHVybiBoYWx2aW5nRGF0YS5nZXRNYXhBbW91bnQoeWVhcikKfQoKLy8gR2V0SGFsdmluZ1llYXJMZWZ0QW1vdW50IHJldHVybnMgdGhlIHJlbWFpbmluZyBHTlMgYWxsb2NhdGlvbiByZWNvcmRlZCBmb3IgYQovLyBoYWx2aW5nIHllYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgbnVtYmVyIGluIFsxLCAxMl0KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdW5taW50ZWQgR05TIGJhc2UgdW5pdHMgZm9yIHllYXIsIG9yIDAgd2hlbiB5ZWFyIGlzIGludmFsaWQKZnVuYyBHZXRIYWx2aW5nWWVhckxlZnRBbW91bnQoeWVhciBpbnQ2NCkgaW50NjQgewoJaGFsdmluZ0RhdGEgOj0gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEhhbHZpbmdEYXRhKCkKCXJldHVybiBoYWx2aW5nRGF0YS5nZXRMZWZ0QW1vdW50KHllYXIpCn0KCi8vIEdldEhhbHZpbmdZZWFyTWludGVkQW1vdW50IHJldHVybnMgdGhlIG1pbnRlZCBHTlMgYWxsb2NhdGlvbiByZWNvcmRlZCBmb3IgYQovLyBoYWx2aW5nIHllYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgbnVtYmVyIGluIFsxLCAxMl0KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogbWludGVkIEdOUyBiYXNlIHVuaXRzIGZvciB5ZWFyLCBvciAwIHdoZW4geWVhciBpcyBpbnZhbGlkCmZ1bmMgR2V0SGFsdmluZ1llYXJNaW50ZWRBbW91bnQoeWVhciBpbnQ2NCkgaW50NjQgewoJaGFsdmluZ0RhdGEgOj0gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEhhbHZpbmdEYXRhKCkKCXJldHVybiBoYWx2aW5nRGF0YS5nZXRNaW50ZWRBbW91bnQoeWVhcikKfQoKLy8gR2V0QW1vdW50UGVyU2Vjb25kUGVySGFsdmluZ1llYXIgcmV0dXJucyB0aGUgY29uZmlndXJlZCBHTlMgZW1pc3Npb24gcmF0ZSBmb3IKLy8gYSBoYWx2aW5nIHllYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgbnVtYmVyIGluIFsxLCAxMl0KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudFBlclNlY29uZDogR05TIGJhc2UgdW5pdHMgZW1pdHRlZCBwZXIgc2Vjb25kIGluIHllYXIsIG9yIDAgd2hlbiB5ZWFyIGlzIGludmFsaWQKZnVuYyBHZXRBbW91bnRQZXJTZWNvbmRQZXJIYWx2aW5nWWVhcih5ZWFyIGludDY0KSBpbnQ2NCB7CgloYWx2aW5nRGF0YSA6PSBnZXRFbWlzc2lvblN0YXRlKCkuZ2V0SGFsdmluZ0RhdGEoKQoJcmV0dXJuIGhhbHZpbmdEYXRhLmdldEFtb3VudFBlclNlY29uZCh5ZWFyKQp9CgovLyBHZXRIYWx2aW5nQW1vdW50c1BlclllYXIgcmV0dXJucyB0aGUgdG90YWwgR05TIGFsbG9jYXRpb24gY29uZmlndXJlZCBmb3IgYQovLyBoYWx2aW5nIHllYXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgbnVtYmVyIGluIFsxLCAxMl0KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgR05TIGJhc2UgdW5pdHMgYWxsb2NhdGVkIHRvIHllYXIsIG9yIDAgd2hlbiB5ZWFyIGlzIGludmFsaWQKZnVuYyBHZXRIYWx2aW5nQW1vdW50c1BlclllYXIoeWVhciBpbnQ2NCkgaW50NjQgewoJaWYgdmFsaWRZZWFyKHllYXIpICE9IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBoYWx2aW5nQW1vdW50c1BlclllYXJbeWVhci0xXQp9CgovLyBHZXRFbWlzc2lvbkNyZWF0ZWRIZWlnaHQgcmV0dXJucyB0aGUgYmxvY2tjaGFpbiBoZWlnaHQgcmVjb3JkZWQgd2hlbiB0aGUKLy8gZW1pc3Npb24gc2NoZWR1bGUgd2FzIGNyZWF0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBoZWlnaHQ6IHNjaGVkdWxlIGNyZWF0aW9uIGhlaWdodCwgb3IgdGhlIHVuaW5pdGlhbGl6ZWQgc3RhdGUncyBzdG9yZWQgdmFsdWUKZnVuYyBHZXRFbWlzc2lvbkNyZWF0ZWRIZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldENyZWF0ZWRIZWlnaHQoKQp9CgovLyBHZXRFbWlzc2lvblN0YXJ0VGltZXN0YW1wIHJldHVybnMgdGhlIGluY2x1c2l2ZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUKLy8gY29uZmlndXJlZCBlbWlzc2lvbiBzY2hlZHVsZSBiZWdpbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IHNjaGVkdWxlIHN0YXJ0IHRpbWVzdGFtcApmdW5jIEdldEVtaXNzaW9uU3RhcnRUaW1lc3RhbXAoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldFN0YXJ0VGltZXN0YW1wKCkKfQoKLy8gR2V0RW1pc3Npb25FbmRUaW1lc3RhbXAgcmV0dXJucyB0aGUgaW5jbHVzaXZlIFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZQovLyBjb25maWd1cmVkIGVtaXNzaW9uIHNjaGVkdWxlIGVuZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lc3RhbXA6IHNjaGVkdWxlIGVuZCB0aW1lc3RhbXAKZnVuYyBHZXRFbWlzc2lvbkVuZFRpbWVzdGFtcCgpIGludDY0IHsKCXJldHVybiBnZXRFbWlzc2lvblN0YXRlKCkuZ2V0RW5kVGltZXN0YW1wKCkKfQoKLy8gR2V0SGFsdmluZ1llYXJJbmZvIHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgaGFsdmluZyBpbnRlcnZhbCBjb250YWluaW5nIHRpbWVzdGFtcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAgdG8gY2xhc3NpZnkgYWdhaW5zdCB0aGUgaW5jbHVzaXZlIGVtaXNzaW9uIHNjaGVkdWxlCi8vCi8vIFJldHVybnM6Ci8vICAgLSB5ZWFyOiBoYWx2aW5nIHllYXIgaW4gWzEsIDEyXSwgb3IgMCBvdXRzaWRlIHRoZSBzY2hlZHVsZQovLyAgIC0gc3RhcnRUaW1lc3RhbXA6IGluY2x1c2l2ZSBzdGFydCB0aW1lc3RhbXAgb2YgeWVhciwgb3IgMCB3aGVuIHRpbWVzdGFtcCBpcyBvdXRzaWRlIHRoZSBzY2hlZHVsZQovLyAgIC0gZW5kVGltZXN0YW1wOiBpbmNsdXNpdmUgZW5kIHRpbWVzdGFtcCBvZiB5ZWFyLCBvciAwIHdoZW4gdGltZXN0YW1wIGlzIG91dHNpZGUgdGhlIHNjaGVkdWxlCmZ1bmMgR2V0SGFsdmluZ1llYXJJbmZvKHRpbWVzdGFtcCBpbnQ2NCkgKGludDY0LCBpbnQ2NCwgaW50NjQpIHsKCXN0YXRlIDo9IGdldEVtaXNzaW9uU3RhdGUoKQoJeWVhciA6PSBzdGF0ZS5nZXRDdXJyZW50WWVhcih0aW1lc3RhbXApCgoJLy8gSWYgb3V0c2lkZSBlbWlzc2lvbiBwZXJpb2QsIHJldHVybiAwIHZhbHVlcwoJaWYgeWVhciA9PSAwIHsKCQlyZXR1cm4gMCwgMCwgMAoJfQoKCS8vIFVzZSBjYWNoZWQgdGltZXN0YW1wcyBmcm9tIEhhbHZpbmdEYXRhCgloYWx2aW5nRGF0YSA6PSBzdGF0ZS5nZXRIYWx2aW5nRGF0YSgpCglyZXR1cm4geWVhciwgaGFsdmluZ0RhdGEuZ2V0U3RhcnRUaW1lc3RhbXAoeWVhciksIGhhbHZpbmdEYXRhLmdldEVuZFRpbWVzdGFtcCh5ZWFyKQp9CgovLyBHZXRIYWx2aW5nSW5mbyByZXR1cm5zIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlIGNvbmZpZ3VyZWQgMTIteWVhciBoYWx2aW5nIHNjaGVkdWxlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGFsdmluZ0RhdGE6IGRlZXAgY29weSBvZiBzY2hlZHVsZSB0aW1lc3RhbXBzLCBhbGxvY2F0aW9ucywgbWludGVkIGFtb3VudHMsIHJlbWFpbmluZyBhbW91bnRzLCBhbmQgcmF0ZXMKZnVuYyBHZXRIYWx2aW5nSW5mbygpICpIYWx2aW5nRGF0YSB7CglyZXR1cm4gZ2V0RW1pc3Npb25TdGF0ZSgpLmdldEhhbHZpbmdEYXRhKCkuQ2xvbmUoKQp9CgovLyBDYWxjdWxhdGVNaW50R25zQW1vdW50IGNhbGN1bGF0ZXMgdGhlIEdOUyBiYXNlIHVuaXRzIGFsbG9jYXRlZCBvdmVyIGFuCi8vIGluY2x1c2l2ZSB0aW1lc3RhbXAgcmFuZ2Ugd2l0aG91dCBtdXRhdGluZyB0aGUgbGl2ZSBlbWlzc2lvbiBzdGF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGZyb21UaW1lc3RhbXA6IGluY2x1c2l2ZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBhbGxvY2F0aW9uIGJlZ2lucwovLyAgIC0gdG9UaW1lc3RhbXA6IGluY2x1c2l2ZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBhbGxvY2F0aW9uIGVuZHMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogR05TIGJhc2UgdW5pdHMgYWxsb2NhdGVkIGluIHRoZSBvdmVybGFwcGluZyBzY2hlZHVsZSBpbnRlcnZhbCwgb3IgMCBmb3IgYW4gaW52YWxpZCBvciBub24tb3ZlcmxhcHBpbmcgcmFuZ2UKZnVuYyBDYWxjdWxhdGVNaW50R25zQW1vdW50KGZyb21UaW1lc3RhbXAsIHRvVGltZXN0YW1wIGludDY0KSBpbnQ2NCB7CglzdGF0ZSA6PSBnZXRFbWlzc2lvblN0YXRlKCkuQ2xvbmUoKQoKCWFtb3VudFRvTWludCwgZXJyIDo9IGNhbGN1bGF0ZUFtb3VudFRvTWludChzdGF0ZSwgZnJvbVRpbWVzdGFtcCwgdG9UaW1lc3RhbXApCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoKCXJldHVybiBhbW91bnRUb01pbnQKfQoaPQoLZ25vbW9kLnRvbWwSLm1vZHVsZSA9ICJnbm8ubGFuZC9yL2dub3N3YXAvZ25zIgpnbm8gPSAiMC45Igoa8UgKB2ducy5nbm8S5UhwYWNrYWdlIGducwoKaW1wb3J0ICgKCSJjaGFpbiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvZ3JjMjAvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgoKCSJnbm8ubGFuZC9yL2dub3N3YXAvYWNjZXNzL3YxIgoJImduby5sYW5kL3IvbnQvZ3JjMjByZWcvdjAiCgoJImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC91dGlscy92MSIKCV8gImduby5sYW5kL3IvZ25vc3dhcC9yYmFjL3YxIgopCgpjb25zdCAoCgl0b2tlbklEICAgICAgICAgICAgID0gMAoJTUFYSU1VTV9TVVBQTFkgICAgICA9IGludDY0KDFfMDAwXzAwMF8wMDBfMDAwXzAwMCkKCUlOSVRJQUxfTUlOVF9BTU9VTlQgPSBpbnQ2NCgxMDBfMDAwXzAwMF8wMDBfMDAwKQoJTUFYX0VNSVNTSU9OX0FNT1VOVCA9IGludDY0KDkwMF8wMDBfMDAwXzAwMF8wMDApIC8vIE1BWElNVU1fU1VQUExZIC0gSU5JVElBTF9NSU5UX0FNT1VOVAopCgp2YXIgKAoJdG9rZW4gICAgICAgICAqZ3JjMjAuVG9rZW4KCXByaXZhdGVMZWRnZXIgKmdyYzIwLlByaXZhdGVMZWRnZXIKCXVzZXJUZWxsZXIgICAgZ3JjMjAuVGVsbGVyCgoJbGVmdEVtaXNzaW9uQW1vdW50ICAgaW50NjQgLy8gYW1vdW50IG9mIEdOUyBjYW4gYmUgbWludGVkIGZvciBlbWlzc2lvbgoJbWludGVkRW1pc3Npb25BbW91bnQgaW50NjQgLy8gYW1vdW50IG9mIEdOUyB0aGF0IGhhcyBiZWVuIG1pbnRlZCBmb3IgZW1pc3Npb24KCWxhc3RNaW50ZWRUaW1lc3RhbXAgIGludDY0IC8vIGxhc3QgYmxvY2sgdGltZSB0aGF0IGducyB3YXMgbWludGVkIGZvciBlbWlzc2lvbgopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7Cgl0b2tlbiwgcHJpdmF0ZUxlZGdlciA9IGdyYzIwLk5ld1Rva2VuKCJHbm9zd2FwIiwgIkdOUyIsIDYsIHRva2VuSUQsIGN1cikKCXVzZXJUZWxsZXIgPSBwcml2YXRlTGVkZ2VyLkNhbGxlclRlbGxlcigpCgoJZ3JjMjByZWcuUmVnaXN0ZXIoY3Jvc3MoY3VyKSwgdG9rZW4sICIiKQoKCS8vIEluaXRpYWwgYW1vdW50IHNldCB0byA5MDBfMDAwXzAwMF8wMDBfMDAwIChNQVhJTVVNX1NVUFBMWSAtIElOSVRJQUxfTUlOVF9BTU9VTlQpLgoJLy8gbGVmdEVtaXNzaW9uQW1vdW50IHdpbGwgZGVjcmVhc2UgYXMgdG9rZW5zIGFyZSBtaW50ZWQuCglzZXRMZWZ0RW1pc3Npb25BbW91bnQoTUFYX0VNSVNTSU9OX0FNT1VOVCkKCXNldE1pbnRlZEVtaXNzaW9uQW1vdW50KDApCglzZXRMYXN0TWludGVkVGltZXN0YW1wKDApCgoJLy8gUHJlLW1pbnQgdGhlIGluaXRpYWwgR05TIHN1cHBseS4KCXNldHVwUHJlTWludChjdXIpCn0KCi8vIE5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgR05TIHRva2VuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gbmFtZTogdG9rZW4gbmFtZQpmdW5jIE5hbWUoKSBzdHJpbmcgeyByZXR1cm4gdG9rZW4uR2V0TmFtZSgpIH0KCi8vIFN5bWJvbCByZXR1cm5zIHRoZSBzeW1ib2wgb2YgdGhlIEdOUyB0b2tlbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN5bWJvbDogdG9rZW4gc3ltYm9sCmZ1bmMgU3ltYm9sKCkgc3RyaW5nIHsgcmV0dXJuIHRva2VuLkdldFN5bWJvbCgpIH0KCi8vIERlY2ltYWxzIHJldHVybnMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBmb3IgR05TIHRva2VuLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVjaW1hbHM6IG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcwpmdW5jIERlY2ltYWxzKCkgaW50IHsgcmV0dXJuIHRva2VuLkdldERlY2ltYWxzKCkgfQoKLy8gVG90YWxTdXBwbHkgcmV0dXJucyB0aGUgdG90YWwgc3VwcGx5IG9mIEdOUyB0b2tlbnMgaW4gY2lyY3VsYXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdXBwbHk6IHRvdGFsIHRva2VuIHN1cHBseQpmdW5jIFRvdGFsU3VwcGx5KCkgaW50NjQgeyByZXR1cm4gdG9rZW4uVG90YWxTdXBwbHkoKSB9CgovLyBLbm93bkFjY291bnRzIHJldHVybnMgdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgdGhhdCBoYXZlIGhlbGQgR05TLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY291bnQ6IG51bWJlciBvZiBrbm93biBhY2NvdW50cwpmdW5jIEtub3duQWNjb3VudHMoKSBpbnQgeyByZXR1cm4gdG9rZW4uS25vd25BY2NvdW50cygpIH0KCi8vIEJhbGFuY2VPZiByZXR1cm5zIHRoZSBHTlMgYmFsYW5jZSBvZiBhIHNwZWNpZmljIGFkZHJlc3MuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBvd25lcjogYWRkcmVzcyB0byBjaGVjayBiYWxhbmNlIGZvcgovLwovLyBSZXR1cm5zOgovLyAgIC0gYmFsYW5jZTogdG9rZW4gYmFsYW5jZQpmdW5jIEJhbGFuY2VPZihvd25lciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiB0b2tlbi5CYWxhbmNlT2Yob3duZXIpIH0KCi8vIEFsbG93YW5jZSByZXR1cm5zIHRoZSBhbW91bnQgb2YgR05TIHRoYXQgYSBzcGVuZGVyIGlzIGFsbG93ZWQgdG8gdHJhbnNmZXIgZnJvbSBhbiBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG93bmVyOiB0b2tlbiBvd25lciBhZGRyZXNzCi8vICAgLSBzcGVuZGVyOiBzcGVuZGVyIGFkZHJlc3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIGFsbG93YW5jZTogYXBwcm92ZWQgYW1vdW50CmZ1bmMgQWxsb3dhbmNlKG93bmVyLCBzcGVuZGVyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIHRva2VuLkFsbG93YW5jZShvd25lciwgc3BlbmRlcikgfQoKLy8gTWludEducyBtaW50cyBuZXcgR05TIHRva2VucyBhY2NvcmRpbmcgdG8gdGhlIGVtaXNzaW9uIHNjaGVkdWxlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBDdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBhZGRyZXNzOiByZWNpcGllbnQgYWRkcmVzcyBmb3IgbWludGVkIHRva2VucwovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBHTlMgbWludGVkIGZvciB0aGUgY3VycmVudCB0aW1lc3RhbXA7IHplcm8gd2hlbiBlbWlzc2lvbiBpcwovLyAgICAgYWxyZWFkeSBwcm9jZXNzZWQgZm9yIHRoYXQgdGltZXN0YW1wIG9yIHRoZSBzY2hlZHVsZSBoYXMgZW5kZWQKLy8KLy8gT25seSBjYWxsYWJsZSBieSBlbWlzc2lvbiBjb250cmFjdC4KLy8KLy8gTm90ZTogSGFsdCBjaGVjayBpcyBwZXJmb3JtZWQgYnkgdGhlIGNhbGxlciAoZW1pc3Npb24uTWludEFuZERpc3RyaWJ1dGVHbnMpCi8vIHRvIGFsbG93IGdyYWNlZnVsIGhhbmRsaW5nLiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgY2FsbGVyIGhhcyBhbHJlYWR5IHZlcmlmaWVkCi8vIGhhbHQgc3RhdHVzIGJlZm9yZSBpbnZva2luZy4KZnVuYyBNaW50R25zKGN1ciByZWFsbSwgYWRkcmVzcyBhZGRyZXNzKSBpbnQ2NCB7CglwcmV2aW91c1JlYWxtIDo9IGN1ci5QcmV2aW91cygpCgljYWxsZXIgOj0gcHJldmlvdXNSZWFsbS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0VtaXNzaW9uKGNhbGxlcikKCglsYXN0R05TTWludGVkVGltZXN0YW1wIDo9IExhc3RNaW50ZWRUaW1lc3RhbXAoKQoJY3VycmVudFRpbWUgOj0gdGltZS5Ob3coKS5Vbml4KCkKCgkvLyBTa2lwIGlmIGFscmVhZHkgbWludGVkIHRoaXMgdGltZXN0YW1wIG9yIGVtaXNzaW9uIGVuZGVkLgoJaWYgbGFzdEdOU01pbnRlZFRpbWVzdGFtcCA9PSBjdXJyZW50VGltZSB8fCBsYXN0R05TTWludGVkVGltZXN0YW1wID49IEdldEVtaXNzaW9uRW5kVGltZXN0YW1wKCkgewoJCXJldHVybiAwCgl9CgoJYW1vdW50VG9NaW50LCBlcnIgOj0gY2FsY3VsYXRlQW1vdW50VG9NaW50KGdldEVtaXNzaW9uU3RhdGUoKSwgbGFzdEdOU01pbnRlZFRpbWVzdGFtcCsxLCBjdXJyZW50VGltZSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB2YWxpZEVtaXNzaW9uQW1vdW50KGFtb3VudFRvTWludCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglzZXRMYXN0TWludGVkVGltZXN0YW1wKGN1cnJlbnRUaW1lKQoJc2V0TWludGVkRW1pc3Npb25BbW91bnQoZ25zbWF0aC5TYWZlQWRkSW50NjQoTWludGVkRW1pc3Npb25BbW91bnQoKSwgYW1vdW50VG9NaW50KSkKCXNldExlZnRFbWlzc2lvbkFtb3VudChnbnNtYXRoLlNhZmVTdWJJbnQ2NChMZWZ0RW1pc3Npb25BbW91bnQoKSwgYW1vdW50VG9NaW50KSkKCgllcnIgPSBwcml2YXRlTGVkZ2VyLk1pbnQoYWRkcmVzcywgYW1vdW50VG9NaW50KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyLkVycm9yKCkpCgl9CgoJY2hhaW4uRW1pdCgKCQkiTWludEdOUyIsCgkJInByZXZBZGRyIiwgY2FsbGVyLlN0cmluZygpLAoJCSJwcmV2UmVhbG0iLCBwcmV2aW91c1JlYWxtLlBrZ1BhdGgoKSwKCQkibWludGVkQmxvY2tUaW1lIiwgdXRpbHMuRm9ybWF0SW50KGN1cnJlbnRUaW1lKSwKCQkibWludGVkR05TQW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KGFtb3VudFRvTWludCksCgkJImFjY3VtTWludGVkR05TQW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KE1pbnRlZEVtaXNzaW9uQW1vdW50KCkpLAoJCSJhY2N1bUxlZnRNaW50R05TQW1vdW50IiwgdXRpbHMuRm9ybWF0SW50KExlZnRFbWlzc2lvbkFtb3VudCgpKSwKCSkKCglyZXR1cm4gYW1vdW50VG9NaW50Cn0KCi8vIFRyYW5zZmVyIHRyYW5zZmVycyBHTlMgdG9rZW5zIGZyb20gY2FsbGVyIHRvIHJlY2lwaWVudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gdG86IHJlY2lwaWVudCBhZGRyZXNzCi8vICAgLSBhbW91bnQ6IG51bWJlciBvZiBHTlMgYmFzZSB1bml0cyB0byB0cmFuc2ZlcgpmdW5jIFRyYW5zZmVyKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7CgljaGVja0Vycih1c2VyVGVsbGVyLlRyYW5zZmVyKDAsIGN1ciwgdG8sIGFtb3VudCkpCn0KCi8vIEFwcHJvdmUgYWxsb3dzIHNwZW5kZXIgdG8gdHJhbnNmZXIgR05TIHRva2VucyBmcm9tIGNhbGxlcidzIGFjY291bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IEN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIHNwZW5kZXI6IGFkZHJlc3MgYXV0aG9yaXplZCB0byBzcGVuZAovLyAgIC0gYW1vdW50OiBtYXhpbXVtIG51bWJlciBvZiBHTlMgYmFzZSB1bml0cyBzcGVuZGVyIGNhbiB0cmFuc2ZlcgpmdW5jIEFwcHJvdmUoY3VyIHJlYWxtLCBzcGVuZGVyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgewoJY2hlY2tFcnIodXNlclRlbGxlci5BcHByb3ZlKDAsIGN1ciwgc3BlbmRlciwgYW1vdW50KSkKfQoKLy8gVHJhbnNmZXJGcm9tIHRyYW5zZmVycyBHTlMgdG9rZW5zIG9uIGJlaGFsZiBvZiBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogQ3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gZnJvbTogdG9rZW4gb3duZXIgYWRkcmVzcwovLyAgIC0gdG86IHJlY2lwaWVudCBhZGRyZXNzCi8vICAgLSBhbW91bnQ6IG51bWJlciBvZiBHTlMgYmFzZSB1bml0cyB0byB0cmFuc2ZlcgpmdW5jIFRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgewoJY2hlY2tFcnIodXNlclRlbGxlci5UcmFuc2ZlckZyb20oMCwgY3VyLCBmcm9tLCB0bywgYW1vdW50KSkKfQoKLy8gUmVuZGVyIHJldHVybnMgdG9rZW4gaW5mb3JtYXRpb24gZm9yIHdlYiBpbnRlcmZhY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwYXRoOiByZW5kZXIgcGF0aCBmb3Igc3BlY2lmaWMgdmlld3MKLy8KLy8gUmV0dXJuczoKLy8gICAtIG91dHB1dDogZm9ybWF0dGVkIHRva2VuIGluZm9ybWF0aW9uCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChwYXRoLCAiLyIpCgljIDo9IGxlbihwYXJ0cykKCglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiB0b2tlbi5SZW5kZXJIb21lKCkKCWNhc2UgYyA9PSAyICYmIHBhcnRzWzBdID09ICJiYWxhbmNlIjoKCQlvd25lciA6PSBhZGRyZXNzKHBhcnRzWzFdKQoJCWJhbGFuY2UgOj0gdG9rZW4uQmFsYW5jZU9mKG93bmVyKQoJCXJldHVybiB1Zm10LlNwcmludGYoIiVkXG4iLCBiYWxhbmNlKQoJZGVmYXVsdDoKCQlyZXR1cm4gIjQwNFxuIgoJfQp9CgovLyBjaGVja0VyciBwYW5pY3MgaWYgZXJyb3IgaXMgbm90IG5pbC4KZnVuYyBjaGVja0VycihlcnIgZXJyb3IpIHsKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQp9CgovLyBjYWxjdWxhdGVBbW91bnRUb01pbnQgY2FsY3VsYXRlcyBhbmQgYWxsb2NhdGVzIEdOUyB0b2tlbnMgdG8gbWludCBmb3IgZ2l2ZW4gdGltZXN0YW1wIHJhbmdlLgovLyBUaGlzIGZ1bmN0aW9uIGhhcyBzaWRlIGVmZmVjdHM6IGl0IHVwZGF0ZXMgdGhlIGFjY3VtdWxhdGVkIGFuZCByZW1haW5pbmcgYW1vdW50cwovLyBmb3IgZWFjaCBoYWx2aW5nIHllYXIgaW4gdGhlIGVtaXNzaW9uIHN0YXRlLgpmdW5jIGNhbGN1bGF0ZUFtb3VudFRvTWludChzdGF0ZSAqRW1pc3Npb25TdGF0ZSwgZnJvbVRpbWVzdGFtcCwgdG9UaW1lc3RhbXAgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCS8vIENhY2hlIHN0YXRlIHRvIGF2b2lkIHJlcGVhdGVkIGxvb2t1cHMKCWVuZFRpbWVzdGFtcCA6PSBzdGF0ZS5nZXRFbmRUaW1lc3RhbXAoKQoJaWYgdG9UaW1lc3RhbXAgPiBlbmRUaW1lc3RhbXAgewoJCXRvVGltZXN0YW1wID0gZW5kVGltZXN0YW1wCgl9CgoJaWYgZnJvbVRpbWVzdGFtcCA+IHRvVGltZXN0YW1wIHsKCQlyZXR1cm4gMCwgbmlsCgl9CgoJc3RhcnRUaW1lc3RhbXAgOj0gc3RhdGUuZ2V0U3RhcnRUaW1lc3RhbXAoKQoJaWYgZnJvbVRpbWVzdGFtcCA8IHN0YXJ0VGltZXN0YW1wIHsKCQlmcm9tVGltZXN0YW1wID0gc3RhcnRUaW1lc3RhbXAKCX0KCglpZiB0b1RpbWVzdGFtcCA8IHN0YXJ0VGltZXN0YW1wIHsKCQlyZXR1cm4gMCwgbmlsCgl9CgoJZnJvbVllYXIgOj0gc3RhdGUuZ2V0Q3VycmVudFllYXIoZnJvbVRpbWVzdGFtcCkKCXRvWWVhciA6PSBzdGF0ZS5nZXRDdXJyZW50WWVhcih0b1RpbWVzdGFtcCkKCglpZiBmcm9tWWVhciA9PSAwIHx8IHRvWWVhciA9PSAwIHsKCQlyZXR1cm4gMCwgbmlsCgl9CgoJdG90YWxBbW91bnRUb01pbnQgOj0gaW50NjQoMCkKCglmb3IgeWVhciA6PSBmcm9tWWVhcjsgeWVhciA8PSB0b1llYXI7IHllYXIrKyB7CgkJeWVhckVuZFRpbWVzdGFtcCA6PSBzdGF0ZS5nZXRIYWx2aW5nWWVhckVuZFRpbWVzdGFtcCh5ZWFyKQoJCWN1cnJlbnRUb1RpbWVzdGFtcCA6PSBpNjRNaW4odG9UaW1lc3RhbXAsIHllYXJFbmRUaW1lc3RhbXApCgoJCXNlY29uZHMgOj0gY3VycmVudFRvVGltZXN0YW1wIC0gZnJvbVRpbWVzdGFtcCArIDEKCQlpZiBzZWNvbmRzIDw9IDAgewoJCQlicmVhawoJCX0KCgkJYW1vdW50UGVyU2Vjb25kIDo9IHN0YXRlLmdldEhhbHZpbmdZZWFyQW1vdW50UGVyU2Vjb25kKHllYXIpCgkJeWVhckFtb3VudFRvTWludCA6PSBnbnNtYXRoLlNhZmVNdWxJbnQ2NChhbW91bnRQZXJTZWNvbmQsIHNlY29uZHMpCgoJCWlmIGN1cnJlbnRUb1RpbWVzdGFtcCA+PSB5ZWFyRW5kVGltZXN0YW1wIHsKCQkJbGVmdG92ZXIgOj0gZ25zbWF0aC5TYWZlU3ViSW50NjQoc3RhdGUuZ2V0SGFsdmluZ1llYXJMZWZ0QW1vdW50KHllYXIpLCB5ZWFyQW1vdW50VG9NaW50KQoJCQl5ZWFyQW1vdW50VG9NaW50ID0gZ25zbWF0aC5TYWZlQWRkSW50NjQoeWVhckFtb3VudFRvTWludCwgbGVmdG92ZXIpCgkJfQoKCQl0b3RhbEFtb3VudFRvTWludCA9IGduc21hdGguU2FmZUFkZEludDY0KHRvdGFsQW1vdW50VG9NaW50LCB5ZWFyQW1vdW50VG9NaW50KQoKCQllcnIgOj0gc3RhdGUuYWRkSGFsdmluZ1llYXJNaW50ZWRBbW91bnQoeWVhciwgeWVhckFtb3VudFRvTWludCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIDAsIGVycgoJCX0KCgkJZXJyID0gc3RhdGUuc3ViSGFsdmluZ1llYXJMZWZ0QW1vdW50KHllYXIsIHllYXJBbW91bnRUb01pbnQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAwLCBlcnIKCQl9CgoJCWZyb21UaW1lc3RhbXAgPSBjdXJyZW50VG9UaW1lc3RhbXAgKyAxCgoJCWlmIGZyb21UaW1lc3RhbXAgPiB0b1RpbWVzdGFtcCB7CgkJCWJyZWFrCgkJfQoJfQoKCXJldHVybiB0b3RhbEFtb3VudFRvTWludCwgbmlsCn0KCi8vIExhc3RNaW50ZWRUaW1lc3RhbXAgcmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEdOUyBlbWlzc2lvbiBtaW50LgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZXN0YW1wOiBsYXN0IG1pbnRlZCB0aW1lc3RhbXAKZnVuYyBMYXN0TWludGVkVGltZXN0YW1wKCkgaW50NjQgeyByZXR1cm4gbGFzdE1pbnRlZFRpbWVzdGFtcCB9CgovLyBMZWZ0RW1pc3Npb25BbW91bnQgcmV0dXJucyB0aGUgcmVtYWluaW5nIEdOUyB0b2tlbnMgYXZhaWxhYmxlIGZvciBlbWlzc2lvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogcmVtYWluaW5nIGVtaXNzaW9uIGFtb3VudApmdW5jIExlZnRFbWlzc2lvbkFtb3VudCgpIGludDY0IHsgcmV0dXJuIGxlZnRFbWlzc2lvbkFtb3VudCB9CgovLyBNaW50ZWRFbWlzc2lvbkFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBHTlMgdG9rZW5zIG1pbnRlZCB0aHJvdWdoIGVtaXNzaW9uLAovLyBleGNsdWRpbmcgdGhlIGluaXRpYWwgbWludCBhbW91bnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIG1pbnRlZCBlbWlzc2lvbiBhbW91bnQKZnVuYyBNaW50ZWRFbWlzc2lvbkFtb3VudCgpIGludDY0IHsgcmV0dXJuIG1pbnRlZEVtaXNzaW9uQW1vdW50IH0KCi8vIHNldExhc3RNaW50ZWRUaW1lc3RhbXAgc2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGVtaXNzaW9uIG1pbnQuCmZ1bmMgc2V0TGFzdE1pbnRlZFRpbWVzdGFtcCh0aW1lc3RhbXAgaW50NjQpIHsgbGFzdE1pbnRlZFRpbWVzdGFtcCA9IHRpbWVzdGFtcCB9CgovLyBzZXRMZWZ0RW1pc3Npb25BbW91bnQgc2V0cyB0aGUgcmVtYWluaW5nIGVtaXNzaW9uIGFtb3VudC4KZnVuYyBzZXRMZWZ0RW1pc3Npb25BbW91bnQoYW1vdW50IGludDY0KSB7IGxlZnRFbWlzc2lvbkFtb3VudCA9IGFtb3VudCB9CgovLyBzZXRNaW50ZWRFbWlzc2lvbkFtb3VudCBzZXRzIHRoZSB0b3RhbCBtaW50ZWQgZW1pc3Npb24gYW1vdW50LgpmdW5jIHNldE1pbnRlZEVtaXNzaW9uQW1vdW50KGFtb3VudCBpbnQ2NCkgeyBtaW50ZWRFbWlzc2lvbkFtb3VudCA9IGFtb3VudCB9ChqwMgoLaGFsdmluZy5nbm8SoDJwYWNrYWdlIGducwoKaW1wb3J0ICgKCWduc21hdGggImduby5sYW5kL3AvZ25vc3dhcC9nbnNtYXRoL3YxIgopCgovLyBIYWx2aW5nRGF0YSBzdG9yZXMgZW1pc3Npb24gZGF0YSBmb3IgZWFjaCBoYWx2aW5nIHBlcmlvZC4KLy8gQ29udGFpbnMgdGltZXN0YW1wcywgYW1vdW50cywgYW5kIHJhdGVzIGZvciB0aGUgMTIteWVhciBlbWlzc2lvbiBzY2hlZHVsZS4KdHlwZSBIYWx2aW5nRGF0YSBzdHJ1Y3QgewoJc3RhcnRUaW1lc3RhbXBzIFtdaW50NjQKCWVuZFRpbWVzdGFtcHMgICBbXWludDY0CgltYXhBbW91bnQgICAgICAgW11pbnQ2NAoJbGVmdEFtb3VudCAgICAgIFtdaW50NjQKCW1pbnRlZEFtb3VudCAgICBbXWludDY0CglhbW91bnRQZXJTZWNvbmQgW11pbnQ2NAp9CgovLyBnZXRTdGFydFRpbWVzdGFtcCByZXR1cm5zIHRoZSBzdGFydCB0aW1lc3RhbXAgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgovLyBSZXR1cm5zIDAgaWYgeWVhciBpcyBpbnZhbGlkLgpmdW5jIChoICpIYWx2aW5nRGF0YSkgZ2V0U3RhcnRUaW1lc3RhbXAoeWVhciBpbnQ2NCkgaW50NjQgewoJaWYgdmFsaWRZZWFyKHllYXIpICE9IG5pbCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gaC5zdGFydFRpbWVzdGFtcHNbeWVhci0xXQp9CgovLyBnZXRFbmRUaW1lc3RhbXAgcmV0dXJucyB0aGUgZW5kIHRpbWVzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCi8vIFJldHVybnMgMCBpZiB5ZWFyIGlzIGludmFsaWQuCmZ1bmMgKGggKkhhbHZpbmdEYXRhKSBnZXRFbmRUaW1lc3RhbXAoeWVhciBpbnQ2NCkgaW50NjQgewoJaWYgdmFsaWRZZWFyKHllYXIpICE9IG5pbCB7CgkJcmV0dXJuIDAKCX0KCglyZXR1cm4gaC5lbmRUaW1lc3RhbXBzW3llYXItMV0KfQoKLy8gZ2V0TWF4QW1vdW50IHJldHVybnMgdGhlIG1heGltdW0gZW1pc3Npb24gYW1vdW50IGZvciB0aGUgc3BlY2lmaWVkIGhhbHZpbmcgeWVhci4KLy8gUmV0dXJucyAwIGlmIHllYXIgaXMgaW52YWxpZC4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIGdldE1heEFtb3VudCh5ZWFyIGludDY0KSBpbnQ2NCB7CglpZiB2YWxpZFllYXIoeWVhcikgIT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoKCXJldHVybiBoLm1heEFtb3VudFt5ZWFyLTFdCn0KCi8vIGdldE1pbnRlZEFtb3VudCByZXR1cm5zIHRoZSBtaW50ZWQgZW1pc3Npb24gYW1vdW50IGZvciB0aGUgc3BlY2lmaWVkIGhhbHZpbmcgeWVhci4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIGdldE1pbnRlZEFtb3VudCh5ZWFyIGludDY0KSBpbnQ2NCB7CglpZiB2YWxpZFllYXIoeWVhcikgIT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGgubWludGVkQW1vdW50W3llYXItMV0KfQoKLy8gZ2V0TGVmdEFtb3VudCByZXR1cm5zIHRoZSByZW1haW5pbmcgZW1pc3Npb24gYW1vdW50IGZvciB0aGUgc3BlY2lmaWVkIGhhbHZpbmcgeWVhci4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIGdldExlZnRBbW91bnQoeWVhciBpbnQ2NCkgaW50NjQgewoJaWYgdmFsaWRZZWFyKHllYXIpICE9IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBoLmxlZnRBbW91bnRbeWVhci0xXQp9CgovLyBnZXRBbW91bnRQZXJTZWNvbmQgcmV0dXJucyB0aGUgZW1pc3Npb24gcmF0ZSBwZXIgc2Vjb25kIGZvciB0aGUgc3BlY2lmaWVkIGhhbHZpbmcgeWVhci4KLy8gUmV0dXJucyAwIGlmIHllYXIgaXMgaW52YWxpZC4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIGdldEFtb3VudFBlclNlY29uZCh5ZWFyIGludDY0KSBpbnQ2NCB7CglpZiB2YWxpZFllYXIoeWVhcikgIT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGguYW1vdW50UGVyU2Vjb25kW3llYXItMV0KfQoKLy8gc2V0U3RhcnRUaW1lc3RhbXAgc2V0cyB0aGUgc3RhcnQgdGltZXN0YW1wIGZvciB0aGUgc3BlY2lmaWVkIGhhbHZpbmcgeWVhci4KLy8gUmV0dXJucyBlcnJvciBpZiB5ZWFyIGlzIGludmFsaWQuCmZ1bmMgKGggKkhhbHZpbmdEYXRhKSBzZXRTdGFydFRpbWVzdGFtcCh5ZWFyIGludDY0LCB0aW1lc3RhbXAgaW50NjQpIGVycm9yIHsKCWVyciA6PSB2YWxpZFllYXIoeWVhcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgloLnN0YXJ0VGltZXN0YW1wc1t5ZWFyLTFdID0gdGltZXN0YW1wCgoJcmV0dXJuIG5pbAp9CgovLyBzZXRFbmRUaW1lc3RhbXAgc2V0cyB0aGUgZW5kIHRpbWVzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCi8vIFJldHVybnMgZXJyb3IgaWYgeWVhciBpcyBpbnZhbGlkLgpmdW5jIChoICpIYWx2aW5nRGF0YSkgc2V0RW5kVGltZXN0YW1wKHllYXIgaW50NjQsIHRpbWVzdGFtcCBpbnQ2NCkgZXJyb3IgewoJZXJyIDo9IHZhbGlkWWVhcih5ZWFyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWguZW5kVGltZXN0YW1wc1t5ZWFyLTFdID0gdGltZXN0YW1wCgoJcmV0dXJuIG5pbAp9CgovLyBzZXRNYXhBbW91bnQgc2V0cyB0aGUgbWF4aW11bSBlbWlzc2lvbiBhbW91bnQgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgovLyBSZXR1cm5zIGVycm9yIGlmIHllYXIgaXMgaW52YWxpZC4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIHNldE1heEFtb3VudCh5ZWFyLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWVyciA6PSB2YWxpZFllYXIoeWVhcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgloLm1heEFtb3VudFt5ZWFyLTFdID0gYW1vdW50CgoJcmV0dXJuIG5pbAp9CgovLyBzZXRNaW50ZWRBbW91bnQgc2V0cyB0aGUgbWludGVkIGFtb3VudCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCi8vIFJldHVybnMgZXJyb3IgaWYgeWVhciBpcyBpbnZhbGlkLgpmdW5jIChoICpIYWx2aW5nRGF0YSkgc2V0TWludGVkQW1vdW50KHllYXIsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJZXJyIDo9IHZhbGlkWWVhcih5ZWFyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWgubWludGVkQW1vdW50W3llYXItMV0gPSBhbW91bnQKCglyZXR1cm4gbmlsCn0KCi8vIHNldExlZnRBbW91bnQgc2V0cyB0aGUgcmVtYWluaW5nIGFtb3VudCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCi8vIFJldHVybnMgZXJyb3IgaWYgeWVhciBpcyBpbnZhbGlkLgpmdW5jIChoICpIYWx2aW5nRGF0YSkgc2V0TGVmdEFtb3VudCh5ZWFyLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWVyciA6PSB2YWxpZFllYXIoeWVhcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgloLmxlZnRBbW91bnRbeWVhci0xXSA9IGFtb3VudAoKCXJldHVybiBuaWwKfQoKLy8gYWRkTWludGVkQW1vdW50IGFkZHMgdG8gdGhlIG1pbnRlZCBhbW91bnQgZm9yIHRoZSBzcGVjaWZpZWQgaGFsdmluZyB5ZWFyLgovLyBSZXR1cm5zIGVycm9yIGlmIHllYXIgaXMgaW52YWxpZC4KZnVuYyAoaCAqSGFsdmluZ0RhdGEpIGFkZE1pbnRlZEFtb3VudCh5ZWFyLCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWVyciA6PSB2YWxpZFllYXIoeWVhcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgloLm1pbnRlZEFtb3VudFt5ZWFyLTFdID0gZ25zbWF0aC5TYWZlQWRkSW50NjQoaC5taW50ZWRBbW91bnRbeWVhci0xXSwgYW1vdW50KQoKCXJldHVybiBuaWwKfQoKLy8gc2V0QW1vdW50UGVyU2Vjb25kIHNldHMgdGhlIGVtaXNzaW9uIHJhdGUgcGVyIHNlY29uZCBmb3IgdGhlIHNwZWNpZmllZCBoYWx2aW5nIHllYXIuCi8vIFJldHVybnMgZXJyb3IgaWYgeWVhciBpcyBpbnZhbGlkLgpmdW5jIChoICpIYWx2aW5nRGF0YSkgc2V0QW1vdW50UGVyU2Vjb25kKHllYXIsIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJZXJyIDo9IHZhbGlkWWVhcih5ZWFyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCWguYW1vdW50UGVyU2Vjb25kW3llYXItMV0gPSBhbW91bnQKCglyZXR1cm4gbmlsCn0KCi8vIENsb25lIGNyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgYWxsIGhhbHZpbmcgc2NoZWR1bGUgc2xpY2VzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGFsdmluZ0RhdGE6IGluZGVwZW5kZW50IGNvcHkgb2YgdGltZXN0YW1wcywgYWxsb2NhdGlvbnMsIG1pbnRlZCBhbW91bnRzLCByZW1haW5pbmcgYW1vdW50cywgYW5kIHJhdGVzCmZ1bmMgKGggKkhhbHZpbmdEYXRhKSBDbG9uZSgpICpIYWx2aW5nRGF0YSB7CglzdGFydFRpbWVzdGFtcHMgOj0gbWFrZShbXWludDY0LCBsZW4oaC5zdGFydFRpbWVzdGFtcHMpKQoJZW5kVGltZXN0YW1wcyA6PSBtYWtlKFtdaW50NjQsIGxlbihoLmVuZFRpbWVzdGFtcHMpKQoJbWF4QW1vdW50IDo9IG1ha2UoW11pbnQ2NCwgbGVuKGgubWF4QW1vdW50KSkKCWxlZnRBbW91bnQgOj0gbWFrZShbXWludDY0LCBsZW4oaC5sZWZ0QW1vdW50KSkKCW1pbnRlZEFtb3VudCA6PSBtYWtlKFtdaW50NjQsIGxlbihoLm1pbnRlZEFtb3VudCkpCglhbW91bnRQZXJTZWNvbmQgOj0gbWFrZShbXWludDY0LCBsZW4oaC5hbW91bnRQZXJTZWNvbmQpKQoKCWNvcHkoc3RhcnRUaW1lc3RhbXBzLCBoLnN0YXJ0VGltZXN0YW1wcykKCWNvcHkoZW5kVGltZXN0YW1wcywgaC5lbmRUaW1lc3RhbXBzKQoJY29weShtYXhBbW91bnQsIGgubWF4QW1vdW50KQoJY29weShsZWZ0QW1vdW50LCBoLmxlZnRBbW91bnQpCgljb3B5KG1pbnRlZEFtb3VudCwgaC5taW50ZWRBbW91bnQpCgljb3B5KGFtb3VudFBlclNlY29uZCwgaC5hbW91bnRQZXJTZWNvbmQpCgoJcmV0dXJuICZIYWx2aW5nRGF0YXsKCQlzdGFydFRpbWVzdGFtcHM6IHN0YXJ0VGltZXN0YW1wcywKCQllbmRUaW1lc3RhbXBzOiAgIGVuZFRpbWVzdGFtcHMsCgkJbWF4QW1vdW50OiAgICAgICBtYXhBbW91bnQsCgkJbGVmdEFtb3VudDogICAgICBsZWZ0QW1vdW50LAoJCW1pbnRlZEFtb3VudDogICAgbWludGVkQW1vdW50LAoJCWFtb3VudFBlclNlY29uZDogYW1vdW50UGVyU2Vjb25kLAoJfQp9CgovLyBOZXdIYWx2aW5nRGF0YSBjcmVhdGVzIGEgMTIteWVhciBIYWx2aW5nRGF0YSBlbWlzc2lvbiBzY2hlZHVsZSBzdGFydGluZyBhdAovLyBzdGFydFRpbWVzdGFtcC4gRWFjaCB5ZWFyIHJlY2VpdmVzIGNvbmZpZ3VyZWQgdGltZXN0YW1wcywgYWxsb2NhdGlvbiwgemVybwovLyBtaW50ZWQgYW1vdW50LCByZW1haW5pbmcgYWxsb2NhdGlvbiwgYW5kIGFuIGludGVnZXItdHJ1bmNhdGVkIHBlci1zZWNvbmQgcmF0ZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHN0YXJ0VGltZXN0YW1wOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBoYWx2aW5nIHllYXIgMSBiZWdpbnMKLy8KLy8gUmV0dXJuczoKLy8gICAtIGhhbHZpbmdEYXRhOiBpbml0aWFsaXplZCBzY2hlZHVsZSB3aXRoIHllYXJzIFsxLCAxMl0gYW5kIHRoZWlyIGRlcml2ZWQgdmFsdWVzCmZ1bmMgTmV3SGFsdmluZ0RhdGEoc3RhcnRUaW1lc3RhbXAgaW50NjQpICpIYWx2aW5nRGF0YSB7CgloYWx2aW5nRGF0YSA6PSAmSGFsdmluZ0RhdGF7CgkJc3RhcnRUaW1lc3RhbXBzOiBtYWtlKFtdaW50NjQsIEhBTFZJTkdfRU5EX1lFQVIpLAoJCWVuZFRpbWVzdGFtcHM6ICAgbWFrZShbXWludDY0LCBIQUxWSU5HX0VORF9ZRUFSKSwKCQltYXhBbW91bnQ6ICAgICAgIG1ha2UoW11pbnQ2NCwgSEFMVklOR19FTkRfWUVBUiksCgkJbGVmdEFtb3VudDogICAgICBtYWtlKFtdaW50NjQsIEhBTFZJTkdfRU5EX1lFQVIpLAoJCW1pbnRlZEFtb3VudDogICAgbWFrZShbXWludDY0LCBIQUxWSU5HX0VORF9ZRUFSKSwKCQlhbW91bnRQZXJTZWNvbmQ6IG1ha2UoW11pbnQ2NCwgSEFMVklOR19FTkRfWUVBUiksCgl9CgoJZm9yIHllYXIgOj0gSEFMVklOR19TVEFSVF9ZRUFSOyB5ZWFyIDw9IEhBTFZJTkdfRU5EX1lFQVI7IHllYXIrKyB7CgkJeWVhclN0YXJ0VGltZXN0YW1wIDo9IHN0YXJ0VGltZXN0YW1wICsgKFNFQ09ORFNfSU5fWUVBUiAqICh5ZWFyIC0gMSkpCgkJeWVhckVuZFRpbWVzdGFtcCA6PSB5ZWFyU3RhcnRUaW1lc3RhbXAgKyBTRUNPTkRTX0lOX1lFQVIgLSAxCgkJeWVhckRpc3RyaWJ1dGlvbkFtb3VudCA6PSBHZXRIYWx2aW5nQW1vdW50c1BlclllYXIoeWVhcikKCQl5ZWFyQW1vdW50UGVyU2Vjb25kIDo9IHllYXJEaXN0cmlidXRpb25BbW91bnQgLyBTRUNPTkRTX0lOX1lFQVIKCgkJaGFsdmluZ0RhdGEuc2V0U3RhcnRUaW1lc3RhbXAoeWVhciwgeWVhclN0YXJ0VGltZXN0YW1wKQoJCWhhbHZpbmdEYXRhLnNldEVuZFRpbWVzdGFtcCh5ZWFyLCB5ZWFyRW5kVGltZXN0YW1wKQoJCWhhbHZpbmdEYXRhLnNldE1heEFtb3VudCh5ZWFyLCB5ZWFyRGlzdHJpYnV0aW9uQW1vdW50KQoJCWhhbHZpbmdEYXRhLnNldE1pbnRlZEFtb3VudCh5ZWFyLCAwKQoJCWhhbHZpbmdEYXRhLnNldEFtb3VudFBlclNlY29uZCh5ZWFyLCB5ZWFyQW1vdW50UGVyU2Vjb25kKQoJCWhhbHZpbmdEYXRhLnNldExlZnRBbW91bnQoeWVhciwgeWVhckRpc3RyaWJ1dGlvbkFtb3VudCkKCX0KCglyZXR1cm4gaGFsdmluZ0RhdGEKfQoatgQKCXNldHVwLmdubxKoBHBhY2thZ2UgZ25zCgovLyBzZXR1cFByZU1pbnQgbWludHMgdGhlIGluaXRpYWwgR05TIHN1cHBseSB0byBmaXhlZCByZWNpcGllbnRzIGF0IHJlYWxtIGluaXQuCi8vCi8vIEdlbmVyYXRlZCBieSBzY3JpcHRzL3BhdGNoLWducy1wcmVtaW50LnNoIGZyb20gR05TX1BSRV9NSU5ULiBJdCByZXBsYWNlcyB0aGUKLy8gdXBzdHJlYW0gcm9sZS1iYXNlZCByZWNpcGllbnQgKHJiYWMgQURNSU4pIHdpdGggdGhlIGFkZHJlc3NlcyBsaXN0ZWQgYmVsb3cuCmZ1bmMgc2V0dXBQcmVNaW50KGN1ciByZWFsbSkgewoJZXJyIDo9IHByaXZhdGVMZWRnZXIuTWludCgiZzF5N2g2NTlwYXRhd2R5OTltbHVmajlscDN0OWN3cHQ4ZnE4NTJ6cSIsIDUwXzAwMF8wMDBfMDAwXzAwMCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQoKCWVyciA9IHByaXZhdGVMZWRnZXIuTWludCgiZzFwbHhkNzRobnh5anZoMzA5bmZjbmRwNTN5cHZ2OTN5cDVyZDdkayIsIDUwXzAwMF8wMDBfMDAwXzAwMCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVyci5FcnJvcigpKQoJfQp9ChrHCAoJdXRpbHMuZ25vErkIcGFja2FnZSBnbnMKCmltcG9ydCAoCglnbnNtYXRoICJnbm8ubGFuZC9wL2dub3N3YXAvZ25zbWF0aC92MSIKCXVmbXQgImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKLy8gdmFsaWRZZWFyIHZhbGlkYXRlcyB0aGF0IHllYXIgaXMgd2l0aGluIGhhbHZpbmcgcGVyaW9kIHJhbmdlICgxLTEyKS4KLy8gUmV0dXJucyBlcnJvciBpZiB5ZWFyIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgpmdW5jIHZhbGlkWWVhcih5ZWFyIGludDY0KSBlcnJvciB7CglpZiB5ZWFyIDwgSEFMVklOR19TVEFSVF9ZRUFSIHx8IHllYXIgPiBIQUxWSU5HX0VORF9ZRUFSIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJySW52YWxpZFllYXIsIHVmbXQuU3ByaW50ZigieWVhcjogJWQiLCB5ZWFyKSkKCX0KCglyZXR1cm4gbmlsCn0KCi8vIHZhbGlkRW1pc3Npb25BbW91bnQgdmFsaWRhdGVzIHRoYXQgdGhlIGVtaXNzaW9uIGFtb3VudCBkb2VzIG5vdCBleGNlZWQgbWF4aW11bS4KLy8gUmV0dXJucyBlcnJvciBpZiBtaW50aW5nIHRoZSBhbW91bnQgd291bGQgZXhjZWVkIE1BWF9FTUlTU0lPTl9BTU9VTlQuCmZ1bmMgdmFsaWRFbWlzc2lvbkFtb3VudChhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmIGFtb3VudCA8IDAgewoJCXJldHVybiBtYWtlRXJyb3JXaXRoRGV0YWlscyhlcnJJbnZhbGlkRW1pc3Npb25BbW91bnQsIHVmbXQuU3ByaW50ZigiZW1pc3Npb24gYW1vdW50IGNhbm5vdCBiZSBuZWdhdGl2ZTogJWQiLCBhbW91bnQpKQoJfQoKCWlmIGduc21hdGguU2FmZUFkZEludDY0KGFtb3VudCwgTWludGVkRW1pc3Npb25BbW91bnQoKSkgPiBNQVhfRU1JU1NJT05fQU1PVU5UIHsKCQlyZXR1cm4gbWFrZUVycm9yV2l0aERldGFpbHMoZXJyVG9vTWFueUVtaXNzaW9uLCB1Zm10LlNwcmludGYoInRvbyBtYW55IGVtaXNzaW9uIGFtb3VudDogJWQiLCBhbW91bnQpKQoJfQoKCXJldHVybiBuaWwKfQoKLy8gaTY0TWluIHJldHVybnMgdGhlIHNtYWxsZXIgb2YgdHdvIGludDY0IHZhbHVlcy4KZnVuYyBpNjRNaW4oeCwgeSBpbnQ2NCkgaW50NjQgewoJaWYgeCA8IHkgewoJCXJldHVybiB4Cgl9CglyZXR1cm4geQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbBIRCOaXpD0SCjY0MjYwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQLUfVW2FD8YwHDp+Yo12MRA5K6LPWU5k3LTfekczYIH9Ds5nXrR/yntOrQtFu+1JuPyVIJhyHeeakriLU1RpETAaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=