{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "N6cCYgVYsDdU+8FTcihS0f8B+jxi34WeVfN+X/DwKj4=",
    "height": "378326",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "74424945",
      "GasUsed": "49616630"
    },
    "tx": "CpaiAgoML3ZtLm1fYWRkcGtnEoSiAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLHoQIKCGludm9pY2VzEjxnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvaW52b2ljZXMaYwoLZ25vbW9kLnRvbWwSVG1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvaW52b2ljZXMiCmdubyA9ICIwLjkiChqWoAIKDGludm9pY2VzLmdubxKEoAIvLyBQYWNrYWdlIGludm9pY2VzIGlzIG9uLWNoYWluIGFjY291bnRzIHJlY2VpdmFibGU6IGFuIGlzc3VlciByZWNvcmRzIGFuCi8vIG9ibGlnYXRpb24sIGFuZCB0aGUgbmFtZWQgcGF5ZXIgZGlzY2hhcmdlcyBpdCBsYXRlciwgaW4gcGFydHMuCi8vCi8vICMgVGhlIG9uZSBpZGVhCi8vCi8vIEV2ZXJ5IHBheW1lbnQgcmVhbG0gaW4gdGhpcyBwb3J0Zm9saW8sIGFuZCBldmVyeSBlc2Nyb3cgYW5kIHZlc3RpbmcKLy8gcGFja2FnZSB0aGUgZGlzY292ZXJ5IGdhdGUgZm91bmQgb24gZWl0aGVyIGxpdmUgY2hhaW4sIGlzIFBSRUZVTkRFRC4KLy8gc2VydmljZV9tYXJrZXQgZXNjcm93cyB0aGUgZXhhY3QgcHJpY2UgYXQgcHVyY2hhc2UuIHN1YnNjcmlwdGlvbnMKLy8gcHJlcGF5cyBhIHdob2xlIHBlcmlvZC4gcGF5cm9sbCwgdmVzdGluZywgZmVlX3NwbGl0IGFuZCByZXZzaGFyZSBwdXNoCi8vIG1vbmV5IHRoYXQgYWxyZWFkeSBhcnJpdmVkLiBJbiBhbGwgb2YgdGhlbSB0aGUgY29pbnMgZXhpc3QgYmVmb3JlIHRoZQovLyBjbGFpbSBvbiB0aGVtIGRvZXMuCi8vCi8vIEFuIGludm9pY2UgaW52ZXJ0cyB0aGF0LiBJdCBpcyBVTkZVTkRFRCBBVCBDUkVBVElPTjogdGhlIG9ibGlnYXRpb24gaXMKLy8gcmVjb3JkZWQgZmlyc3QsIGFuZCB0aGUgbW9uZXkgbWF5IG5ldmVyIGFycml2ZSBhdCBhbGwuCi8vCi8vIFRoYXQgb25lIGludmVyc2lvbiBpcyB0aGUgd2hvbGUgcmVhbG0sIGFuZCBpdCBpcyB2aXNpYmxlIGluIHRoZQovLyBhcml0aG1ldGljIHJhdGhlciB0aGFuIG9ubHkgaW4gdGhlIHByb3NlLiBwYXlyb2xsJ3MgaW52YXJpYW50IGNhcnJpZXMgYQovLyBwb29sIHRlcm0gYmVjYXVzZSBhbiBlbXBsb3llciBmdW5kcyBmaXJzdDoKLy8KLy8JcGF5cm9sbDogIEhlbGQoKSA9PSBUb3RhbFBvb2xlZCgpICsgTGlhYmlsaXRpZXMoKSArIFN1cnBsdXMoKQovLwlpbnZvaWNlczogSGVsZCgpID09ICAgICAgICAgICAgICAgICBMaWFiaWxpdGllcygpICsgU3VycGx1cygpCi8vCi8vIFRoZXJlIGlzIG5vIHBvb2wgaGVyZSwgYW5kIG5vIHJlc2VydmUsIGJlY2F1c2UgYXQgdGhlIG1vbWVudCBhbiBpbnZvaWNlCi8vIGlzIGlzc3VlZCB0aGlzIHJlYWxtIGhvbGRzIG5vdGhpbmcgb24gaXRzIGJlaGFsZiBhbmQgcHJvbWlzZXMgbm90aGluZy4KLy8gSXNzdWluZyBjb3N0cyB0aGUgaXNzdWVyIGEgc3RvcmFnZSBkZXBvc2l0IGFuZCBub3RoaW5nIGVsc2UuCi8vCi8vICMgV2hhdCBiZWluZyB1bmZ1bmRlZCBmb3JjZXMKLy8KLy8gVHdvIGZlYXR1cmVzIHRoYXQgd291bGQgYmUgZGVjb3JhdGlvbiBvbiBhIHByZWZ1bmRlZCByYWlsIGFyZSBsb2FkLQovLyBiZWFyaW5nIGhlcmUsIGFuZCB0aGV5IGFyZSB0aGUgcmVhc29uIHRoaXMgaXMgYSByZWFsbSByYXRoZXIgdGhhbiBhCi8vIGZpZWxkIG9uIGFuIGV4aXN0aW5nIG9uZToKLy8KLy8gICAtIFBBUlRJQUwgU0VUVExFTUVOVC4gV2hlbiB0aGUgbW9uZXkgaXMgYWxyZWFkeSBpbiBlc2Nyb3csICJwYXkiIGlzIGEKLy8gICAgIHJlbGVhc2Ugb2YgYSBrbm93biBhbW91bnQgYW5kIHBhcnRpYWxpdHkgaXMgbWVhbmluZ2xlc3MuIFdoZW4gaXQgaXMKLy8gICAgIG5vdCwgYSBwYXllciB3aG8gY2FuIHNlbmQgNjAlIHRvZGF5IGlzIHRoZSBvcmRpbmFyeSBjYXNlLiBQYXkKLy8gICAgIGFjY2VwdHMgYW55IGFtb3VudCB1cCB0byB0aGUgb3V0c3RhbmRpbmcgYmFsYW5jZSwgcmVwZWF0ZWRseS4KLy8gICAtIEFOIE9WRVJEVUUgU1RBVEUuIEEgcHJlZnVuZGVkIGNsYWltIGNhbm5vdCBiZSBsYXRlLiBBbiB1bmZ1bmRlZCBvbmUKLy8gICAgIGNhbiwgc28gbGF0ZW5lc3MgaXMgYSBzdGF0ZSBvdGhlciByZWFsbXMgY2FuIHJlYWQgYW5kIGFjdCBvbi4gVGhhdAovLyAgICAgcmVhZGFibGUgc3RhdGUgaXMgdGhlIGludGVncmF0aW9uIHN1cmZhY2UgdGhpcyByZWFsbSBleGlzdHMgdG8KLy8gICAgIHByb3ZpZGUsIGluIHRoZSBzYW1lIHdheSBzdWJzY3JpcHRpb25zIGV4aXN0cyB0byBwcm92aWRlIEVudGl0bGVkLgovLwovLyAjIE5vIGVzY3Jvdywgbm8gYWNjZXB0YW5jZSwgbm8gYXJiaXRyYXRpb24KLy8KLy8gQW4gaW52b2ljZSBpcyBiaWxsZWQgZm9yIHdvcmsgYWxyZWFkeSBkb25lLCBzbyB0aGVyZSBpcyBub3RoaW5nIGZvciB0aGlzCi8vIHJlYWxtIHRvIGhvbGQgYmFjay4gTW9uZXkgcGFpZCBpcyBjcmVkaXRlZCB0byB0aGUgaXNzdWVyJ3MgbGVkZ2VyCi8vIGJhbGFuY2UgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24uIFRoZXJlIGlzIG5vIGFjY2VwdGFuY2Ugd2luZG93IGFuZCBubwovLyByZWxlYXNlIHN0ZXAg4oCUIHRob3NlIGJlbG9uZyB0byBzZXJ2aWNlX21hcmtldCwgd2hvc2UgbW9kZWwgaXMgdGhlCi8vIG9wcG9zaXRlIG9uZS4KLy8KLy8gQ29uc2VxdWVudGx5IHRoaXMgcmVhbG0gRE9FUyBOT1QgYXJiaXRyYXRlLiBBIHBheWVyIHdobyBkaXNwdXRlcyBhIGJpbGwKLy8gc2ltcGx5IGRvZXMgbm90IHBheSBpdCwgYW5kIHRoZSBpbnZvaWNlIGdvZXMgb3ZlcmR1ZS4gVGhhdCBpcyB0aGUKLy8gbWVjaGFuaXNtIG9mZiBjaGFpbiB0b28sIGFuZCBpbnZlbnRpbmcgYSBkaXNwdXRlIHBhdGggaGVyZSB3b3VsZCBtYWtlCi8vIHRoaXMgYSB3b3JzZSBjb3B5IG9mIHNlcnZpY2VfbWFya2V0IHJhdGhlciB0aGFuIGEgY29tcGxlbWVudCB0byBpdC4KLy8KLy8gIyBQYXltZW50IGlzIHB1bGwsIGluIHRoZSBkaXJlY3Rpb24gdGhhdCBjYW5ub3QgZmFpbAovLwovLyBQYXkgY3JlZGl0cyB0aGUgaXNzdWVyJ3MgbGVkZ2VyIGJhbGFuY2U7IHRoZSBpc3N1ZXIgbGF0ZXIgY2FsbHMgQ2xhaW0uCi8vIFRoZSBwdXNoIGFsdGVybmF0aXZlIOKAlCBwYXlpbmcgdGhlIGlzc3VlciBpbnNpZGUgdGhlIHBheWVyJ3Mgb3duCi8vIHRyYW5zYWN0aW9uIOKAlCB3b3VsZCBsZXQgdGhlIGlzc3VlcidzIGFkZHJlc3MgZGVjaWRlIHdoZXRoZXIgdGhlIFBBWUVSJ3MKLy8gc2V0dGxlbWVudCBzdWNjZWVkcy4gQW4gaXNzdWVyIHRoYXQgaXMgYSByZWFsbSB3aGljaCBwYW5pY3Mgb24gcmVjZWlwdCwKLy8gb3IgaXMgc2ltcGx5IHVuYWJsZSB0byBhY2NlcHQsIHdvdWxkIG1ha2UgaXRzIG93biBpbnZvaWNlcyB1bnBheWFibGUgYW5kCi8vIHRoZSBmYWlsdXJlIHdvdWxkIGxhbmQgb24gdGhlIHBheWVyLiBQdWxsIHB1dHMgZXZlcnkgZmFpbHVyZSBvbiB0aGUKLy8gcGFydHkgd2hvIG93bnMgaXQuCi8vCi8vICMgQW55b25lIG1heSBpc3N1ZSBhbiBpbnZvaWNlIG5hbWluZyBhbnlvbmUuIFJlYWQgdGhpcyBiZWZvcmUgdHJ1c3RpbmcgYSB0b3RhbC4KLy8KLy8gVGhlcmUgaXMgbm8gcGVybWlzc2lvbiB0byBiaWxsIHNvbWVvbmUsIGJlY2F1c2UgcmVxdWlyaW5nIG9uZSB3b3VsZCBtZWFuCi8vIGEgcmVnaXN0cnkgb2Ygd2hvIG1heSBpbnZvaWNlIHdob20sIHdoaWNoIGlzIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uLgovLyBUaGUgaG9uZXN0IGNvbnNlcXVlbmNlIGlzIHN0YXRlZCBoZXJlIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQgbGF0ZXI6Ci8vCi8vCUFOIFVOUEFJRCBJTlZPSUNFIElTIEFOIFVOVkVSSUZJRUQgQ0xBSU0gQlkgSVRTIElTU1VFUi4KLy8KLy8gU28gdGhpcyByZWFsbSBkZWxpYmVyYXRlbHkgZXhwb3NlcyBOTyBnbG9iYWwgIndoYXQgZG9lcyB0aGlzIGFkZHJlc3MKLy8gb3dlIiBhZ2dyZWdhdGUuIFN1Y2ggYSBudW1iZXIgd291bGQgYmUgdGhlIHN1bSBvZiBldmVyeSBzdHJhbmdlcidzCi8vIHNlbGYtcmVwb3J0ZWQgYXNzZXJ0aW9uLCBhbmQgcmVhZGluZyBpdCBhcyBhIGNyZWRpdCBzaWduYWwgaXMgdGhlIGVycm9yCi8vIHRoZSBnZXR0ZXIncyBleGlzdGVuY2Ugd291bGQgaW52aXRlLiBXaGF0IGl0IGV4cG9zZXMgaW5zdGVhZCBpcwovLyBJU1NVRVItU0NPUEVEOiBPdXRzdGFuZGluZ0Zyb20gYW5kIE92ZXJkdWVGcm9tIGFuc3dlciAid2hhdCBkb2VzIHRoaXMKLy8gcGF5ZXIgb3dlIFRISVMgaXNzdWVyIiwgd2hpY2ggaXMgdGhlIHF1ZXN0aW9uIGEgY29uc3VtZXIgcmVhbG0gY2FuCi8vIGFjdHVhbGx5IGFjdCBvbiwgYmVjYXVzZSBhIGNvbnN1bWVyIGdhdGluZyBpdHMgb3duIHNlcnZpY2Ugb24gaXRzIG93bgovLyB1bnBhaWQgYmlsbHMgaXMgdHJ1c3Rpbmcgb25seSBpdHNlbGYuCi8vCi8vIFR3byBib3VuZHMgYmFjayB0aGF0IHVwIG1lY2hhbmljYWxseS4gSXNzdWluZyBjb3N0cyBhIHN0b3JhZ2UgZGVwb3NpdAovLyBwYWlkIGJ5IHRoZSBJU1NVRVIsIHNvIHZvbHVtZSBpcyBub3QgZnJlZSB0byB0aGUgcGFydHkgd2hvIGJlbmVmaXRzIGZyb20KLy8gaXQ7IGFuZCBNYXhSZWNvcmRzUGVySXNzdWVyIGNhcHMgb25lIGlzc3VlcidzIFNUT1JFRCByZWNvcmRzLCB3aGljaCBpcyBhbgovLyBhdmFpbGFiaWxpdHkgYm91bmQgb24gdGhhdCBpc3N1ZXIncyBvd24gbmFtZXNwYWNlIGFuZCBubyBvbmUgZWxzZSdzLgovLyBOZWl0aGVyIGJvdW5kIG1ha2VzIGFuIHVucGFpZCBjbGFpbSB0cnVlLCBhbmQgdGhleSBhcmUgbm90IHByZXNlbnRlZCBhcwovLyBkb2luZyBzby4KLy8KLy8gQm90aCBib3VuZHMgYXJlIFBFUiBJU1NVRVIsIGFuZCB0aGUgZ2xvYmFsIHRvdGFsIGlzIG5vdCBib3VuZGVkLiBTeWJpbAovLyBpc3N1ZXJzIG11bHRpcGx5IGl0OiBOIGZ1bmRlZCBhZGRyZXNzZXMgeWllbGQgTipNYXhSZWNvcmRzUGVySXNzdWVyCi8vIHJlY29yZHMsIGFuZCB0aGUgcGVyLXJlY29yZCBkZXBvc2l0IHBhaWQgYnkgZWFjaCBpcyB0aGUgb25seSB0aGluZyBtYWtpbmcKLy8gdGhhdCBleHBlbnNpdmUuIFR3byBjb25zZXF1ZW5jZXMgZm9sbG93LCBzdGF0ZWQgaGVyZSByYXRoZXIgdGhhbgovLyBkaXNjb3ZlcmVkOgovLwovLyAgIC0gQSBwYXllciBuYW1lZCBvbiBhbiBpbnZvaWNlIENBTk5PVCByZW1vdmUgaXQuIFZvaWQgaXMgaXNzdWVyLW9ubHksCi8vICAgICBiZWNhdXNlIGZvcmdpdmluZyBhIGRlYnQgaXMgdGhlIGlzc3VlcidzIHRvIGRvLCBhbmQgUmVsZWFzZSByZWZ1c2VzIGFuCi8vICAgICBvcGVuIHJlY29yZDsgc28gYSBzdHJhbmdlcidzIG9wZW4gaW52b2ljZSBuYW1pbmcgeW91IHBlcnNpc3RzIHVudGlsCi8vICAgICB0aGF0IHN0cmFuZ2VyIHZvaWRzIGl0LiBXaGF0IGFic29yYnMgdGhpcyBpcyB0aGUgZGVzaWduIGFib3ZlIHJhdGhlcgovLyAgICAgdGhhbiBhIGJvdW5kOiBubyBnbG9iYWwgYWdncmVnYXRlIHJlYWRzIHN1Y2ggYSByZWNvcmQsIGFuZCB0aGUKLy8gICAgIGlzc3Vlci1zY29wZWQgZ2V0dGVycyBhIGNvbnN1bWVyIHJlYWxtIGFjdHVhbGx5IGNhbGxzIHN0YXkgZ2FzLWJvdW5kZWQKLy8gICAgIGF0IE1heFJlY29yZHNQZXJJc3N1ZXIsIHNvIGEgdmljdGltJ3MgcmVhZHMgYXJlIG5ldmVyIGNoYXJnZWQgZm9yIGFuCi8vICAgICBhdHRhY2tlcidzIHZvbHVtZS4gVGhlIHJlc2lkdWFsIGhhcm0gaXMgYW4gb2ZmLWNoYWluIHJlYWRlcidzLCBhbmQgdGhlCi8vICAgICB1bnZlcmlmaWVkLWNsYWltIHdhcm5pbmcgYWJvdmUgaXMgd2hhdCBpdCBpcyBmb3IuCi8vICAgLSBBbiBpc3N1ZXIgcmVjb3JkIGlzIG5ldmVyIHJlY2xhaW1lZC4gUmVsZWFzZSBkZWNyZW1lbnRzIGl0cyBjb3VudCBidXQKLy8gICAgIGRvZXMgbm90IGRlbGV0ZSB0aGUgaXNzdWVycyBlbnRyeSwgYmVjYXVzZSBgaXNzdWVkYCBhbmQgYGludm9pY2VkYCBhcmUKLy8gICAgIExJRkVUSU1FIGZpZ3VyZXMgdGhhdCBJc3N1ZWRPZiByZXBvcnRzLCBhbmQgZGVsZXRpbmcgdGhlIGVudHJ5IHdvdWxkCi8vICAgICByZXNldCB0aGVtIHRvIHplcm8gYW5kIG1ha2UgdGhhdCBnZXR0ZXIgbGllLiBHbG9iYWwgc3RhdGUgdGhlcmVmb3JlCi8vICAgICBncm93cyBtb25vdG9uaWNhbGx5LiBLZWVwaW5nIGFuIGhvbmVzdCBjb3VudGVyIGlzIHdvcnRoIG1vcmUgdGhhbgovLyAgICAgcmVjbGFpbWluZyBvbmUgQVZMIG5vZGUuCi8vCi8vIFRoZSBjYXAgY291bnRzIFNUT1JFRCByZWNvcmRzIHJhdGhlciB0aGFuIE9QRU4gb25lcywgYW5kIHRoZSBkaWZmZXJlbmNlCi8vIGlzIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBhIGRldGFpbC4gT3V0c3RhbmRpbmdGcm9tLCBPdmVyZHVlRnJvbSBhbmQKLy8gSGFzT3ZlcmR1ZUZyb20g4oCUIHRoZSBnZXR0ZXJzIGEgY29uc3VtZXIgcmVhbG0gY2FsbHMsIGFuZCB0aGVyZWZvcmUgdGhlCi8vIG9uZXMgd2hvc2UgZ2FzIGNvc3QgaXMgc29tZW9uZSBlbHNlJ3MgcHJvYmxlbSDigJQgaXRlcmF0ZSBhbiBpc3N1ZXIncyB3aG9sZQovLyBwcmVmaXgsIHNldHRsZWQgYW5kIHZvaWRlZCByZWNvcmRzIGluY2x1ZGVkLCBiZWNhdXNlIGEgc2V0dGxlZCByZWNvcmQgaXMKLy8gbm90IHJlbW92ZWQgdW50aWwgUmVsZWFzZS4gQSBjYXAgb24gb3BlbiBpbnZvaWNlcyBhbG9uZSB3b3VsZCBib3VuZCB0aGUKLy8gb2JsaWdhdGlvbnMgYW5kIGxlYXZlIHRoYXQgaXRlcmF0aW9uIHVuYm91bmRlZDogYW4gaXNzdWVyIGNvdWxkIGlzc3VlIGFuZAovLyB2b2lkIHJlcGVhdGVkbHksIGtlZXBpbmcgYG9wZW5gIGF0IHplcm8gd2hpbGUgdGhlaXIgcHJlZml4IGdyZXcgd2l0aG91dAovLyBsaW1pdCwgdW50aWwgYSBjb25zdW1lcidzIHJlYWQgcmFuIG91dCBvZiBnYXMuIENhcHBpbmcgd2hhdCBpcyBzdG9yZWQKLy8gYm91bmRzIGJvdGgsIHNpbmNlIG9wZW4gY2FuIG5ldmVyIGV4Y2VlZCBzdG9yZWQuCi8vCi8vIEZpbmRpbmcgImV2ZXJ5IGludm9pY2UgbmFtaW5nIG1lIiBpcyB0aGVyZWZvcmUgYW4gb2ZmLWNoYWluIGluZGV4ZXIncwovLyBqb2I6IG9uIGNoYWluIGl0IHdvdWxkIGJlIGFuIHVuYm91bmRlZCBpdGVyYXRpb24gb3ZlciBldmVyeSBpc3N1ZXIgdGhhdAovLyBoYXMgZXZlciBiaWxsZWQgYW55b25lLCBhbmQgdGhlIGFuc3dlciB3b3VsZCBiZSB1bnRydXN0d29ydGh5IGFueXdheS4KLy8KLy8gIyBTVE9SQUdFCi8vCi8vIEFuIGlzc3VlciByZWNvcmQgaXMgcGFpZCBmb3IgYnkgdGhhdCBpc3N1ZXIncyBmaXJzdCBJc3N1ZTsgYW4gaW52b2ljZQovLyByZWNvcmQgYnkgdGhlIElzc3VlIHRoYXQgY3JlYXRlcyBpdC4gUmVsZWFzZSByZW1vdmVzIGEgZmluaXNoZWQgaW52b2ljZQovLyBhbmQgdGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIGRlcG9zaXQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZXMKLy8gaXQsIHdoaWNoIGlzIHRoZSBzdGFuZGluZyBpbmNlbnRpdmUgdG8gdGlkeSB1cCBhIHJlY29yZCB0aGF0IGlzIG5vCi8vIGxvbmdlciBhbnlvbmUncyBidXNpbmVzcy4KLy8KLy8gIyBXaGF0IHRoaXMgcmVhbG0gZG9lcyBOT1QgZG8KLy8KLy8gICAtIEl0IGRvZXMgbm90IHZlcmlmeSB0aGF0IHdvcmsgaGFwcGVuZWQsIHZhbHVlIGl0LCBvciBhcmJpdHJhdGUuCi8vICAgLSBJdCBob2xkcyB1Z25vdCBhbmQgb25seSB1Z25vdC4KLy8gICAtIEl0IGhhcyBubyBhZG1pbi4gVGhlIGRlcGxveWluZyBuYW1lc3BhY2UgcmVjZWl2ZXMgcHJvdG9jb2wgZmVlcyBhbmQKLy8gICAgIHN3ZXB0IHN1cnBsdXMgYW5kIGhhcyBubyBvdGhlciBwcml2aWxlZ2U6IG5vIHNldHRlciwgbm8gcGF1c2UsIG5vCi8vICAgICBhYmlsaXR5IHRvIHZvaWQgYW4gaW52b2ljZSBvciB0b3VjaCBhIGJhbGFuY2UuCnBhY2thZ2UgaW52b2ljZXMKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBSZWFsbVBhdGggaXMgdGhpcyByZWFsbSdzIG93biBwYXRoLCB1c2VkIHRvIGJ1aWxkIFJlbmRlciBsaW5rcy4KY29uc3QgUmVhbG1QYXRoID0gIi9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvaW52b2ljZXMiCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGhvbGRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBjZWlsaW5nIG9uIGFueSBmZWUgdGhpcyByZWFsbSBjb3VsZCBldmVyIGNoYXJnZSwKLy8gZW5mb3JjZWQgYnkgdGhlIGZlZWxlZGdlciB0aGUgcmVhbG0gaXMgY29uc3RydWN0ZWQgd2l0aCDigJQgYSBmZWVCcHMgYWJvdmUKLy8gaXQgaXMgcmVmdXNlZCBieSB0aGUgcHJpbWl0aXZlJ3Mgb3duIHZhbGlkYXRpb24sIG5vdCBieSBhIGNoZWNrIGluIHRoaXMKLy8gZmlsZS4gNTAwIGJwcyA9IDUlLgpjb25zdCBNYXhGZWVCcHMgPSBpbnQ2NCg1MDApCgovLyBTZXR0bGVtZW50RmVlQnBzIGlzIGNoYXJnZWQgb24gZWFjaCBwYXltZW50LCBvbiB0aGUgZ3Jvc3MsIGZsb29yLXJvdW5kZWQKLy8gaW4gdGhlIElTU1VFUidzIGZhdm91cjogMTAwIGJwcyA9IDElLiBJdCBtYXRjaGVzIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZQovLyBsaXZlIGZlZSBpbiB0aGlzIHBvcnRmb2xpbyAoZmVlX3NwbGl0LCBjcm93ZGZ1bmQsIGJ1ZGdldHMsIHBheXJvbGwpLgovLwovLyBUaGUgSVNTVUVSIGJlYXJzIGl0LCBub3QgdGhlIHBheWVyOiBhIHBheW1lbnQgb2YgTiByZWR1Y2VzIHRoZQovLyBvdXRzdGFuZGluZyBiYWxhbmNlIGJ5IGV4YWN0bHkgTiwgYW5kIHRoZSBpc3N1ZXIgaXMgY3JlZGl0ZWQgTiBtaW51cyB0aGUKLy8gZmVlLiBBIHBheWVyJ3MgZGVidCBtdXN0IGJlIGRpc2NoYXJnZWQgYnkgd2hhdCB0aGUgcGF5ZXIgc2VudCwgb3IgdGhlCi8vIGFyaXRobWV0aWMgb2YgInBhaWQgaW4gZnVsbCIgd291bGQgZGVwZW5kIG9uIHRoaXMgcmVhbG0ncyBmZWUgc2NoZWR1bGUuCi8vCi8vIEl0IGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHdpdGggbm8gc2V0dGVyLCBzbyBhbiBpbnZvaWNlJ3MgZWNvbm9taWNzCi8vIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGl0IGlzIGlzc3VlZC4KLy8KLy8gVGhlIGZlZSBpcyBmbG9vcmVkIFBFUiBQQVlNRU5ULCBzbyBzcGxpdHRpbmcgYSBwYXltZW50IGNhbiBsb3dlciB0aGUgdG90YWwKLy8gZmVlLiBFYWNoIHBheW1lbnQgYm91bmRhcnkgZm9yZmVpdHMgYXQgbW9zdCAxIHVnbm90LCBhbmQgTWluUGF5bWVudCBib3VuZHMKLy8gaG93IG1hbnkgYm91bmRhcmllcyBhbiBpbnZvaWNlIGFkbWl0cy4gTUVBU1VSRUQgb24gb255eC0xLCBub3QgcmVhc29uZWQ6Ci8vIDEwLDk5MCBwYWlkIGF0IG9uY2UgY2hhcmdlcyAxMDksIHdoaWxlIHRlbiBwYXltZW50cyBvZiAxLDA5OSBjaGFyZ2UgMTAwLgovLyBUaGUgYmVuZWZpY2lhcnkgaXMgdGhlIElTU1VFUiwgd2hvIGlzIGNyZWRpdGVkIHRoZSBkaWZmZXJlbmNlIGFuZCBkb2VzIG5vdAovLyBjb250cm9sIHRoZSBwYXltZW50IHNjaGVkdWxlOyB0aGUgcGF5ZXIgZ2FpbnMgbm90aGluZywgYmVjYXVzZSB0aGUKLy8gb3V0c3RhbmRpbmcgYmFsYW5jZSBmYWxscyBieSB0aGUgZ3Jvc3MgZWl0aGVyIHdheS4gR2FzIGZvciBvbmUgZXh0cmEKLy8gcGF5bWVudCBjb3N0cyBtb3JlIHRoYW4gdGhlIDEgdWdub3QgaXQgc2F2ZXMsIHNvIHRoaXMgaXMgcHJpY2VkIG91dCByYXRoZXIKLy8gdGhhbiBwcmV2ZW50ZWQsIGFuZCBhIGNvbGx1ZGluZyBpc3N1ZXIvcGF5ZXIgcGFpciB3b3VsZCBzcGVuZCBtb3JlIHRvCi8vIGV4cGxvaXQgaXQgdGhhbiB0aGV5IHJlY292ZXJlZC4KLy8KLy8gQSBmaW5hbCBzZXR0bGVtZW50IGJlbG93IHRoZSBmZWUgZGVub21pbmF0b3IgcGF5cyB6ZXJvIGZlZSBmb3IgdGhhdCBzYW1lCi8vIHJlYXNvbiBhbmQgaXMgTk9UIGEgc2VwYXJhdGUgY2FzZTogZmxvb3IoOTkvMTAwKSBpcyAwIHdoZXRoZXIgb3Igbm90Ci8vIE1pblBheW1lbnQncyBzZXR0bGUtZXhhY3RseSBjbGF1c2UgYWRtaXR0ZWQgaXQsIHNvIHRoYXQgY2xhdXNlIGZvcmZlaXRzCi8vIG5vdGhpbmcgb24gaXRzIG93bi4KY29uc3QgU2V0dGxlbWVudEZlZUJwcyA9IGludDY0KDEwMCkKCi8vIEZlZUNvbGxlY3RvciByZWNlaXZlcyB3aXRoZHJhd24gZmVlcyBhbmQgc3dlcHQgc3VycGx1cy4gQ29tcGlsZS10aW1lCi8vIGNvbnN0YW50OiB0aGVyZSBpcyBubyBzZXR0ZXIgYW5kIG5vIHRyYW5zZmVyIHBhdGguIEl0IGlzIHRoZSBkZXBsb3lpbmcKLy8gbmFtZXNwYWNlJ3MgYWRkcmVzcyDigJQgc3RhdGVkIHBsYWlubHk6IHRoZSBvcGVyYXRvciBvZiB0aGlzIHJlYWxtLgovLwovLyBOT1RFIEZPUiBBTlkgUkUtTkFNRVNQQUNFRCBQT1JUOiB0aGlzIGlzIHRoZSBhZGRyZXNzLWFzLWRhdGEgaGF6YXJkIHRoYXQKLy8gYSBuYW1lc3BhY2Ugc3Vic3RpdHV0aW9uIHJld3JpdGVzIHNpbGVudGx5IHdoaWxlIGV2ZXJ5IGJ5dGUtY29tcGFyaXNvbgovLyBzdGlsbCByZXBvcnRzIHRoZSB0cmVlIGZhaXRoZnVsLCBiZWNhdXNlIHRoZSByZXdyaXRlIElTIHRoZSBpbnRlbmRlZAovLyB0cmFuc2Zvcm1hdGlvbi4gUmUtc3RhdGUgaXQgZGVsaWJlcmF0ZWx5IHBlciBjaGFpbjsgbmV2ZXIgbGV0IGl0IGJlCi8vIGRlcml2ZWQuCmNvbnN0IEZlZUNvbGxlY3RvciA9IGFkZHJlc3MoImcxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMiKQoKLy8gTWluSW52b2ljZUFtb3VudCBpcyB0aGUgc21hbGxlc3QgaW52b2ljZSB0aGF0IG1heSBiZSBpc3N1ZWQuIEJlbG93IHRoZQovLyBmZWUgZGVub21pbmF0b3IgYSAxJSBmZWUgZmxvb3JzIHRvIHplcm8sIHNvIGEgc21hbGxlciBpbnZvaWNlIHdvdWxkIGJlCi8vIGZlZS1mcmVlIGJ5IGFjY2lkZW50IHJhdGhlciB0aGFuIGJ5IGRlc2lnbi4KY29uc3QgTWluSW52b2ljZUFtb3VudCA9IGludDY0KDFfMDAwKQoKLy8gTWluUGF5bWVudCBrZWVwcyBkdXN0IHNldHRsZW1lbnRzIG91dC4gSXQgaXMgTk9UIGEgZmxvb3Igb24gdGhlIGZpbmFsCi8vIHBheW1lbnQ6IGEgcGF5bWVudCBpcyBhY2NlcHRlZCB3aGVuIGl0IGlzIGF0IGxlYXN0IE1pblBheW1lbnQgT1Igd2hlbiBpdAovLyBzZXR0bGVzIHRoZSBpbnZvaWNlIGV4YWN0bHkuIFdpdGhvdXQgdGhhdCBzZWNvbmQgY2xhdXNlIGFuIGludm9pY2Ugd2l0aAovLyAzMDAgdWdub3Qgb3V0c3RhbmRpbmcgY291bGQgbmV2ZXIgYmUgY2xvc2VkLCBhbmQgInVucGF5YWJsZSByZW1haW5kZXIiCi8vIGlzIGEgd29yc2UgZmFpbHVyZSB0aGFuIGR1c3QuCmNvbnN0IE1pblBheW1lbnQgPSBpbnQ2NCgxXzAwMCkKCi8vIE1heFJlY29yZHNQZXJJc3N1ZXIgY2FwcyB0aGUgaW52b2ljZSByZWNvcmRzIG9uZSBpc3N1ZXIgbWF5IGhhdmUgU1RPUkVECi8vIGF0IG9uY2Ug4oCUIG9wZW4sIHNldHRsZWQgYW5kIHZvaWRlZCBhbGlrZS4gSXQgaXMgd2hhdCBtYWtlcyB0aGUKLy8gaXNzdWVyLXNjb3BlZCBnZXR0ZXJzIGdhcy1ib3VuZGVkOyBzZWUgdGhlIHBhY2thZ2UgZG9jIGZvciB3aHkgdGhlIGNhcAovLyBjb3VudHMgc3RvcmVkIHJlY29yZHMgYW5kIG5vdCBvcGVuIG9uZXMuCi8vCi8vIElzc3VlIGlzIHBlcm1pc3Npb25sZXNzLCBzbyB0aGlzIGlzIGFuIEFWQUlMQUJJTElUWSBCT1VORCBhbmQgaXQgaXMKLy8gZG9jdW1lbnRlZCByYXRoZXIgdGhhbiBoaWRkZW46IGFuIGlzc3VlciBjYW4gZXhoYXVzdCB0aGVpciBPV04gY2FwYWNpdHkKLy8gYW5kIG5vIG9uZSBlbHNlJ3MsIGJlY2F1c2UgdGhlIGJvdW5kIGlzIHBlci1pc3N1ZXIuIFRoZSBjb3N0IG9mIGZpbGxpbmcKLy8gaXQgaXMgZ2FzIHBsdXMgYSBzdG9yYWdlIGRlcG9zaXQgb24gZXZlcnkgcmVjb3JkLgovLwovLyBIaXR0aW5nIGl0IGlzIHNlbGYtc2VydmljZSB0byBjbGVhcjogUmVsZWFzZSBpcyBwZXJtaXNzaW9ubGVzcyBhbmQgdGhlCi8vIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIGRlcG9zaXQgdG8gd2hvZXZlciBjYWxscyBpdCwgc28gYW4gaXNzdWVyIGF0IHRoZQovLyBjYXAgY2FuIGFsd2F5cyByZWxlYXNlIHRoZWlyIG93biBmaW5pc2hlZCByZWNvcmRzLCBhbmQgYSBzdHJhbmdlciBoYXMgYQovLyBzdGFuZGluZyBpbmNlbnRpdmUgdG8gZG8gaXQgZm9yIHRoZW0uCmNvbnN0IE1heFJlY29yZHNQZXJJc3N1ZXIgPSA2NAoKLy8gTWF4TWVtb0xlbiBib3VuZHMgdGhlIGZyZWUtdGV4dCBtZW1vLCBpbiBieXRlcy4gVGhlIG1lbW8gaXMgcmVuZGVyZWQsCi8vIHNvIGl0IGlzIHNhbml0aXplZCBhdCB0aGUgcmVuZGVyIGJvdW5kYXJ5LCBuZXZlciBhdCB0aGUgd3JpdGUgYm91bmRhcnkg4oCUCi8vIHN0b3Jpbmcgd2hhdCB0aGUgaXNzdWVyIGFjdHVhbGx5IHdyb3RlIGtlZXBzIHRoZSByZWNvcmQgaG9uZXN0Lgpjb25zdCBNYXhNZW1vTGVuID0gMjU2CgovLyBJbnZvaWNlIHN0YXR1c2VzLgpjb25zdCAoCglTdGF0dXNPcGVuICAgID0gIm9wZW4iCglTdGF0dXNTZXR0bGVkID0gInNldHRsZWQiCglTdGF0dXNWb2lkZWQgID0gInZvaWRlZCIKKQoKdHlwZSBpbnZvaWNlIHN0cnVjdCB7CglpZCAgICAgaW50NjQKCWlzc3VlciBhZGRyZXNzCglwYXllciAgYWRkcmVzcwoKCS8vIGFtb3VudCBpcyB0aGUgZ3Jvc3Mgb2JsaWdhdGlvbi4gSXQgbmV2ZXIgY2hhbmdlczogZm9yZ2l2aW5nIHBhcnQgb2YKCS8vIGEgYmlsbCBpcyBhIFZvaWQgb2YgdGhlIHdob2xlIHJlbWFpbmRlciwgbm90IGEgcmV3cml0ZSBvZiBoaXN0b3J5LgoJYW1vdW50IGludDY0CgoJLy8gcGFpZCBpcyB0aGUgY3VtdWxhdGl2ZSBncm9zcyB0aGUgcGF5ZXIgaGFzIHNlbnQuIEl0IG9ubHkgZXZlcgoJLy8gaW5jcmVhc2VzLCBhbmQgYW1vdW50LXBhaWQgaXMgdGhlIG91dHN0YW5kaW5nIGJhbGFuY2UuCglwYWlkIGludDY0CgoJLy8gZHVlSGVpZ2h0IGlzIHRoZSBoZWlnaHQgYXQgb3IgYmVmb3JlIHdoaWNoIHRoZSBpbnZvaWNlIHNob3VsZCBiZQoJLy8gc2V0dGxlZC4gRXF1YWwgdG8gdGhlIGlzc3VlIGhlaWdodCBtZWFucyAiZHVlIG9uIHJlY2VpcHQiLgoJZHVlSGVpZ2h0IGludDY0CgoJaXNzdWVkQXQgaW50NjQKCXN0YXR1cyAgIHN0cmluZwoJbWVtbyAgICAgc3RyaW5nCn0KCnR5cGUgaXNzdWVyUmVjIHN0cnVjdCB7CgkvLyByZWNvcmRzIGlzIGhvdyBtYW55IGludm9pY2UgcmVjb3JkcyB0aGlzIGlzc3VlciBjdXJyZW50bHkgaGFzCgkvLyBTVE9SRUQsIG9mIGFueSBzdGF0dXMuIEl0IGlzIHRoZSBmaWd1cmUgTWF4UmVjb3Jkc1Blcklzc3VlciBjYXBzLAoJLy8gYW5kIHRoZXJlZm9yZSB0aGUgb25lIHRoYXQgYm91bmRzIGV2ZXJ5IGlzc3Vlci1zY29wZWQgZ2V0dGVyOiBpdAoJLy8gcmlzZXMgb24gSXNzdWUgYW5kIGZhbGxzIG9ubHkgb24gUmVsZWFzZS4KCXJlY29yZHMgaW50CgoJLy8gb3BlbiBpcyBob3cgbWFueSBvZiB0aG9zZSBhcmUgc3RpbGwgb3Blbi4gSW5mb3JtYXRpb25hbCDigJQgYQoJLy8gc2V0dGxlZCBvciB2b2lkZWQgcmVjb3JkIHN0aWxsIG9jY3VwaWVzIGEgc2xvdCB1bnRpbCBSZWxlYXNlLCBzbwoJLy8gdGhpcyBuZXZlciBnYXRlcyBhbnl0aGluZy4KCW9wZW4gaW50CgoJaXNzdWVkICAgaW50NjQKCWludm9pY2VkIGludDY0Cn0KCnZhciAoCglzZWxmIGFkZHJlc3MKCgkvLyBpbnZvaWNlcyBob2xkcyBvbmUgcmVjb3JkIHBlciBpbnZvaWNlLCBrZXllZCBpc3N1ZXJ8cGFkZGVkSUQgc28gYW4KCS8vIGlzc3VlcidzIGJvb2sgaXMgYSBib3VuZGVkIHByZWZpeCBpdGVyYXRpb24uIFRoZSBwdWJsaWMgaGFuZGxlIGlzCgkvLyB0aGVyZWZvcmUgKGlzc3VlciwgaWQpLCB0aGUgc2FtZSB0d28tcGFydCBzaGFwZSBwYXlyb2xsIHVzZXMuCglpbnZvaWNlcyA9IGF2bC5OZXdUcmVlKCkgLy8gImlzc3VlcnwlMDE5ZCIgLT4gKmludm9pY2UKCgkvLyBpc3N1ZXJzIGhvbGRzIG9uZSByZWNvcmQgcGVyIGFkZHJlc3MgdGhhdCBoYXMgZXZlciBpc3N1ZWQuCglpc3N1ZXJzID0gYXZsLk5ld1RyZWUoKSAvLyBhZGRyZXNzIHN0cmluZyAtPiAqaXNzdWVyUmVjCgoJLy8gbGVkZ2VyIGhvbGRzIGV2ZXJ5IGlzc3VlcidzIHNldHRsZWQtYnV0LXVuY2xhaW1lZCBiYWxhbmNlIGFuZCB0aGUKCS8vIGZlZSBwb3QuIEl0IGlzIGdsb2JhbCBhY3Jvc3MgaW52b2ljZXMgb24gcHVycG9zZTogYW4gaXNzdWVyIGJpbGxpbmcKCS8vIHR3ZW50eSBwYXllcnMgaGFzIG9uZSBiYWxhbmNlIGFuZCBvbmUgQ2xhaW0uCglsZWRnZXIgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCgoJLy8gbmV4dElEIGlzIGEgbW9ub3RvbmljIGNvdW50ZXIuIElEcyBhcmUgbmV2ZXIgcmV1c2VkLCBzbyBhIHJlbGVhc2VkCgkvLyBpbnZvaWNlJ3MgaWQgY2FuIG5ldmVyIGJlIGNvbmZ1c2VkIHdpdGggYSBsaXZlIG9uZS4KCW5leHRJRCBpbnQ2NCA9IDEKKQoKZnVuYyBpbml0KCkgewoJc2VsZiA9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKfQoKLy8gcmVqZWN0U3RyYXlTZW5kIGFib3J0cyB3aGVuIGNvaW5zIGFyZSBhdHRhY2hlZCB0byBhIG5vbi1wYXlhYmxlIGNhbGwuCi8vIFRoaXMgcmVhbG0gaG9sZHMgZnVuZHMsIHNvIGEgc3RyYXkgc2VuZCB3b3VsZCBiZWNvbWUgc3dlZXBhYmxlIHN1cnBsdXMsCi8vIHNpbGVudGx5IGNvbnZlcnRpbmcgYSB1c2VyJ3MgY29pbnMgaW50byBvcGVyYXRvciBmdW5kcy4KZnVuYyByZWplY3RTdHJheVNlbmQoY3VyIHJlYWxtKSB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQkvLyBFdmVyeSBjYWxsIHNpdGUgZm9yd2FyZHMgYSBjcm9zc2luZyBlbnRyeXBvaW50J3Mgb3duIGxpdmUgY3VyLAoJCS8vIHNvIHRoaXMgY2Fubm90IGZpcmUgdG9kYXk7IGl0IGV4aXN0cyBzbyBhIGZ1dHVyZSByZWZhY3RvciB0aGF0CgkJLy8gaGFuZHMgdGhpcyBndWFyZCBhIHN0YWxlIHJlYWxtIHZhbHVlIGZhaWxzIGNsb3NlZCwgbm90IG9wZW4KCQkvLyAoY29pbmlvIG5hbWVzIElzQ3VycmVudCBhcyB0aGUgZ3VhcmQgc2Vjb25kYXJ5IHJlYWxtIHBhcmFtZXRlcnMKCQkvLyByZXF1aXJlLCBhbmQgdGhpcyBoZWxwZXIgZm9sbG93cyB0aGF0IGRpc2NpcGxpbmUpLgoJCXBhbmljKCJpbnZvaWNlczogcmVhbG0gY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgZW50cnlwb2ludCBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyAtLS0gaXNzdWluZyAtLS0KCi8vIElzc3VlIHJlY29yZHMgYW4gb2JsaWdhdGlvbiBvZiBgYW1vdW50YCBvd2VkIGJ5IGBwYXllcmAgdG8gdGhlIGNhbGxlciwKLy8gdG8gYmUgc2V0dGxlZCBieSBgZHVlSGVpZ2h0YC4gSXQgbW92ZXMgbm8gY29pbnMgYW5kIHJlc2VydmVzIG5vdGhpbmcuCi8vIFJldHVybnMgdGhlIGludm9pY2UgaWQuCi8vCi8vIGR1ZUhlaWdodCBtdXN0IG5vdCBiZSBpbiB0aGUgcGFzdC4gQSBiYWNrZGF0ZWQgZHVlIGhlaWdodCB3b3VsZCBjcmVhdGUKLy8gYW4gaW52b2ljZSB0aGF0IGlzIG92ZXJkdWUgaW4gdGhlIHRyYW5zYWN0aW9uIHRoYXQgaXNzdWVkIGl0LCB3aGljaCBpcyBhCi8vIGNsYWltIGFib3V0IGEgZGVhZGxpbmUgdGhhdCB3YXMgbmV2ZXIgb2ZmZXJlZC4KZnVuYyBJc3N1ZShjdXIgcmVhbG0sIHBheWVyIGFkZHJlc3MsIGFtb3VudCwgZHVlSGVpZ2h0IGludDY0LCBtZW1vIHN0cmluZykgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCgkvLyBUaGUgbG93ZXJjYXNlIGNsYXVzZSBpcyBsb2FkLWJlYXJpbmcsIGFuZCBpdCBpcyBjYXJyaWVkIGZyb20gYnVkZ2V0cycKCS8vIEdyYW50IGFuZCBwYXlyb2xsJ3MgSGlyZSAobWVhc3VyZWQgb24gdGhpcyB0b29sY2hhaW4sIG5vdCBhcmd1ZWQpOgoJLy8gYWRkcmVzcy5Jc1ZhbGlkKCkgZGVmZXJzIHRvIGNyeXB0by5BZGRyZXNzRnJvbUJlY2gzMiwgd2hvc2UgZGVjb2RlcgoJLy8gbG93ZXJjYXNlcyB0aGUgaW5wdXQgQkVGT1JFIHZlcmlmeWluZyB0aGUgY2hlY2tzdW0sIHNvIGl0IHJldHVybnMKCS8vIHRydWUgZm9yIHRoZSBhbGwtdXBwZXJjYXNlIHNwZWxsaW5nIG9mIGEgdmFsaWQgYWRkcmVzcy4KCS8vCgkvLyBUSEUgU0VWRVJJVFkgSEVSRSBJUyBUSEUgTUlMREVSIE9GIFRIRSBUV08gVEhJUyBQT1JURk9MSU8gSEFTCgkvLyBNRUFTVVJFRCwgYW5kIHNheWluZyB3aGljaCBtYXR0ZXJzLiBJbiBwYXlyb2xsIGFuIHVwcGVyY2FzZSBlbXBsb3llZQoJLy8gaXMgYSBQRVJNQU5FTlQgTE9TUzogQWNjcnVlIGNyZWRpdHMgYSBiYWxhbmNlIG5vYm9keSBjYW4gYXV0aGVudGljYXRlCgkvLyBhcy4gSGVyZSBpdCBpcyBhIEJSSUNLRUQgUkVDT1JELCBhcyBpbiBidWRnZXRzOiBQYXkgYXV0aGVudGljYXRlcyB0aGUKCS8vIGNhbGxlciBhZ2FpbnN0IHRoZSBzdG9yZWQgcGF5ZXIsIHNvIGEgbm9uLWNhbm9uaWNhbCBwYXllciBtYWtlcyB0aGUKCS8vIGludm9pY2UgdW5wYXlhYmxlIGJ5IGV2ZXJ5b25lLCBpbmNsdWRpbmcgdGhlIHBlcnNvbiBpdCBuYW1lcy4gTm8gY29pbnMKCS8vIG1vdmUsIG5vdGhpbmcgaXMgbG9zdCBidXQgdGhlIGlzc3VlcidzIG93biBzdG9yYWdlIGRlcG9zaXQgYW5kIHNsb3QuCgkvLyBUaGUgZ3VhcmQgaXMgc3RpbGwgd29ydGggaXRzIGxpbmUg4oCUIGEgcmVjb3JkIHRoYXQgY2FuIG5ldmVyIGJlCgkvLyBzYXRpc2ZpZWQgYW5kIGNhbiBuZXZlciBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYSByZWFsIGRlYnQgaXMgZXhhY3RseQoJLy8gdGhlIHVudHJ1c3R3b3J0aHkgdG90YWwgdGhlIHBhY2thZ2UgZG9jIHdhcm5zIGFib3V0IOKAlCBidXQgaXQgaXMgbm90CgkvLyB0aGUgZnVuZC1sb3NzIGNhc2UgYW5kIG11c3Qgbm90IGJlIGNpdGVkIGFzIG9uZS4KCS8vCgkvLyBUaGUgY2hlY2sgaXMgY29tcGxldGUgYXMgd2VsbCBhcyBuZWNlc3Nhcnk6IHRoYXQgZGVjb2RlciByZWplY3RzCgkvLyBtaXhlZCBjYXNlIG91dHJpZ2h0LCBzbyBhIHZhbGlkIGFkZHJlc3MgaGFzIGV4YWN0bHkgdHdvIHNwZWxsaW5ncyBhbmQKCS8vIHJlZnVzaW5nIGV2ZXJ5IG5vbi1sb3dlciBvbmUgbGVhdmVzIHByZWNpc2VseSB0aGUgY2Fub25pY2FsIG9uZS4KCWlmICFwYXllci5Jc1ZhbGlkKCkgfHwgc3RyaW5nKHBheWVyKSAhPSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5nKHBheWVyKSkgewoJCXBhbmljKCJwYXllciBpcyBub3QgYSB2YWxpZCBhZGRyZXNzIGluIGNhbm9uaWNhbCAobG93ZXJjYXNlKSBmb3JtIikKCX0KCWlmIGFtb3VudCA8IE1pbkludm9pY2VBbW91bnQgewoJCXBhbmljKCJhbW91bnQgaXMgYmVsb3cgTWluSW52b2ljZUFtb3VudCIpCgl9CglpZiBsZW4obWVtbykgPiBNYXhNZW1vTGVuIHsKCQlwYW5pYygibWVtbyBleGNlZWRzIE1heE1lbW9MZW4iKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgZHVlSGVpZ2h0IDwgbm93IHsKCQlwYW5pYygiZHVlSGVpZ2h0IGlzIGluIHRoZSBwYXN0IikKCX0KCglpc3N1ZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBpc3N1ZXIgPT0gcGF5ZXIgewoJCXBhbmljKCJhbiBpc3N1ZXIgY2Fubm90IGludm9pY2UgdGhlbXNlbHZlcyIpCgl9CglrZXkgOj0gaXNzdWVyLlN0cmluZygpCglyIDo9IGdldElzc3VlcihrZXkpCglpZiByID09IG5pbCB7CgkJciA9ICZpc3N1ZXJSZWN7fQoJCWlzc3VlcnMuU2V0KGtleSwgcikKCX0KCWlmIHIucmVjb3JkcyA+PSBNYXhSZWNvcmRzUGVySXNzdWVyIHsKCQlwYW5pYygiaXNzdWVyIGhhcyB0b28gbWFueSBzdG9yZWQgaW52b2ljZXMiKQoJfQoJaW52b2ljZWQsIG9rIDo9IGNoZWNrZWRBZGQoci5pbnZvaWNlZCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygiaXNzdWVyIGxpZmV0aW1lIHRvdGFsIHdvdWxkIG92ZXJmbG93IikKCX0KCglpZCA6PSBuZXh0SUQKCW5leHRJRCsrCglpbnZvaWNlcy5TZXQoaW52S2V5KGlzc3VlciwgaWQpLCAmaW52b2ljZXsKCQlpZDogICAgICAgIGlkLAoJCWlzc3VlcjogICAgaXNzdWVyLAoJCXBheWVyOiAgICAgcGF5ZXIsCgkJYW1vdW50OiAgICBhbW91bnQsCgkJcGFpZDogICAgICAwLAoJCWR1ZUhlaWdodDogZHVlSGVpZ2h0LAoJCWlzc3VlZEF0OiAgbm93LAoJCXN0YXR1czogICAgU3RhdHVzT3BlbiwKCQltZW1vOiAgICAgIG1lbW8sCgl9KQoJci5yZWNvcmRzKysKCXIub3BlbisrCglyLmlzc3VlZCsrCglyLmludm9pY2VkID0gaW52b2ljZWQKCgljaGFpbi5FbWl0KCJJc3N1ZWQiLCAiaWQiLCBpdG9hKGlkKSwgImlzc3VlciIsIGtleSwKCQkicGF5ZXIiLCBwYXllci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkiZHVlSGVpZ2h0IiwgaXRvYShkdWVIZWlnaHQpKQoJcmV0dXJuIGlkCn0KCi8vIC0tLSBzZXR0bGluZyAtLS0KCi8vIFBheSBzZXR0bGVzIHBhcnQgb3IgYWxsIG9mIGFuIGludm9pY2Ugd2l0aCB0aGUgYXR0YWNoZWQgY29pbnMuIFRoZSBuYW1lZAovLyBwYXllciBvbmx5LiBEaXJlY3QgRU9BIGNhbGxzIHdpdGggLXNlbmQgb25seSAodGhlIHJlY2VpcHQtZ3VhcmFudGVlZAovLyBzaGFwZSk7IGV4YWN0bHkgb25lIHBvc2l0aXZlIHVnbm90IGNvaW4uCi8vCi8vIFRoZSBhdHRhY2hlZCBhbW91bnQgbXVzdCBub3QgZXhjZWVkIHRoZSBvdXRzdGFuZGluZyBiYWxhbmNlLiBBY2NlcHRpbmcKLy8gYW4gb3ZlcnBheW1lbnQgd291bGQgdHVybiBhIHBheW1lbnQgaW50byBhIGRvbmF0aW9uIHRoZSBwYXllciBkaWQgbm90Ci8vIGNob29zZSB0byBtYWtlIGFuZCB0aGlzIHJlYWxtIGhhcyBubyBwYXRoIHRvIHJldHVybiwgc28gaXQgaXMgcmVmdXNlZAovLyBhbmQgdGhlIHBheWVyIGtlZXBzIHRoZWlyIGNvaW5zLgovLwovLyBSZXR1cm5zIHRoZSBvdXRzdGFuZGluZyBiYWxhbmNlIHJlbWFpbmluZyBhZnRlciB0aGlzIHBheW1lbnQuCmZ1bmMgUGF5KGN1ciByZWFsbSwgaXNzdWVyIGFkZHJlc3MsIGlkIGludDY0KSBpbnQ2NCB7CgkvLyBSZWNlaXZlIGZpcnN0IGFuZCBvbmNlLCBwZXIgY29pbmlvJ3MgZW52ZWxvcGUgY29udHJhY3QuCglmcm9tLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCglpbnYgOj0gbXVzdEludm9pY2UoaXNzdWVyLCBpZCkKCWlmIGludi5zdGF0dXMgIT0gU3RhdHVzT3BlbiB7CgkJcGFuaWMoImludm9pY2UgaXMgbm90IG9wZW4iKQoJfQoJaWYgZnJvbSAhPSBpbnYucGF5ZXIgewoJCXBhbmljKCJvbmx5IHRoZSBuYW1lZCBwYXllciBtYXkgcGF5IHRoaXMgaW52b2ljZSIpCgl9CglvdXRzdGFuZGluZyA6PSBpbnYuYW1vdW50IC0gaW52LnBhaWQKCWlmIGFtb3VudCA+IG91dHN0YW5kaW5nIHsKCQlwYW5pYygicGF5bWVudCBleGNlZWRzIHRoZSBvdXRzdGFuZGluZyBiYWxhbmNlIikKCX0KCWlmIGFtb3VudCA8IE1pblBheW1lbnQgJiYgYW1vdW50ICE9IG91dHN0YW5kaW5nIHsKCQlwYW5pYygicGF5bWVudCBpcyBiZWxvdyBNaW5QYXltZW50IGFuZCBkb2VzIG5vdCBzZXR0bGUgdGhlIGludm9pY2UiKQoJfQoKCWludi5wYWlkICs9IGFtb3VudAoJcmVtYWluaW5nIDo9IGludi5hbW91bnQgLSBpbnYucGFpZAoJaWYgcmVtYWluaW5nID09IDAgewoJCWludi5zdGF0dXMgPSBTdGF0dXNTZXR0bGVkCgkJbXVzdERlY09wZW4oaXNzdWVyKQoJfQoJY3JlZGl0ZWQsIGZlZSA6PSBsZWRnZXIuTXVzdERlcG9zaXQoaXNzdWVyLlN0cmluZygpLCBhbW91bnQsIFNldHRsZW1lbnRGZWVCcHMpCgoJY2hhaW4uRW1pdCgiUGFpZCIsICJpZCIsIGl0b2EoaWQpLCAiaXNzdWVyIiwgaXNzdWVyLlN0cmluZygpLAoJCSJwYXllciIsIGZyb20uU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCksCgkJImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksICJmZWUiLCBpdG9hKGZlZSksCgkJInBhaWQiLCBpdG9hKGludi5wYWlkKSwgIm91dHN0YW5kaW5nIiwgaXRvYShyZW1haW5pbmcpLAoJCSJzdGF0dXMiLCBpbnYuc3RhdHVzKQoJcmV0dXJuIHJlbWFpbmluZwp9CgovLyBWb2lkIGNhbmNlbHMgdGhlIHVucGFpZCByZW1haW5kZXIgb2YgYW4gaW52b2ljZS4gVGhlIGlzc3VlciBvbmx5IOKAlCB0aGlzCi8vIGlzIGFuIGlzc3VlciBmb3JnaXZpbmcgYSBkZWJ0LCBhbmQgbm9ib2R5IGVsc2UgbWF5IGZvcmdpdmUgaXQgZm9yIHRoZW0uCi8vCi8vIEl0IGRvZXMgTk9UIHJldmVyc2UgcGF5bWVudHMgYWxyZWFkeSBtYWRlLiBDb2lucyB0aGUgcGF5ZXIgc2VudCBhcmUKLy8gYWxyZWFkeSBjcmVkaXRlZCB0byB0aGUgaXNzdWVyJ3MgbGVkZ2VyIGJhbGFuY2UgYW5kIG1heSBhbHJlYWR5IGhhdmUKLy8gYmVlbiBjbGFpbWVkOyB0aGVyZSBpcyBubyBtZWNoYW5pc20gb24gY2hhaW4gdG8gdGFrZSB0aGVtIGJhY2ssIGFuZAovLyBwcmV0ZW5kaW5nIG90aGVyd2lzZSBpbiB0aGUgc3RhdHVzIHdvdWxkIGJlIHdvcnNlIHRoYW4gc2F5aW5nIHNvLiBBCi8vIHZvaWRlZCBpbnZvaWNlIHRoZXJlZm9yZSBrZWVwcyBpdHMgYHBhaWRgIGZpZ3VyZSwgd2hpY2ggaXMgd2hhdCBtYWtlcwovLyB0aGUgcmVjb3JkIHJlYWRhYmxlIGFmdGVyd2FyZHMuCi8vCi8vIFZvaWRpbmcgZG9lcyBub3QgcmVtb3ZlIHRoZSByZWNvcmQuIFJlbGVhc2UgZG9lcyB0aGF0LgpmdW5jIFZvaWQoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlzc3VlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWludiA6PSBtdXN0SW52b2ljZShpc3N1ZXIsIGlkKQoJaWYgaW52LnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiaW52b2ljZSBpcyBub3Qgb3BlbiIpCgl9CglpbnYuc3RhdHVzID0gU3RhdHVzVm9pZGVkCgltdXN0RGVjT3Blbihpc3N1ZXIpCgljaGFpbi5FbWl0KCJWb2lkZWQiLCAiaWQiLCBpdG9hKGlkKSwgImlzc3VlciIsIGlzc3Vlci5TdHJpbmcoKSwKCQkicGF5ZXIiLCBpbnYucGF5ZXIuU3RyaW5nKCksICJwYWlkIiwgaXRvYShpbnYucGFpZCksCgkJImZvcmdpdmVuIiwgaXRvYShpbnYuYW1vdW50LWludi5wYWlkKSkKfQoKLy8gUmVsZWFzZSByZW1vdmVzIGEgZmluaXNoZWQgaW52b2ljZSBhbmQgZnJlZXMgaXRzIHN0b3JhZ2UuIFBlcm1pc3Npb25sZXNzOgovLyB0aGUgY2hhaW4gcmVmdW5kcyB0aGUgZnJlZWQgc3RvcmFnZSBkZXBvc2l0IHRvIHRoZSBjYWxsZXIsIHdoaWNoIGlzIHRoZQovLyBzdGFuZGluZyBpbmNlbnRpdmUgdG8gdGlkeSB1cCBhIHJlY29yZCB0aGF0IGlzIG5vdCB5b3VyIG93bi4KLy8KLy8gSXQgcmVmdXNlcyBhbiBvcGVuIGludm9pY2UsIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgc2FmZSB0byBsZXQgYSBzdHJhbmdlcgovLyBjYWxsOiBhIFJlbGVhc2UgY2FuIG5ldmVyIGRlc3Ryb3kgYW4gb3V0c3RhbmRpbmcgb2JsaWdhdGlvbi4gQW4gaXNzdWVyCi8vIHdobyB3YW50cyBhIHJlY29yZCBnb25lIG11c3QgVm9pZCBpdCBmaXJzdCwgYW5kIHRoYXQgbGVhdmVzIGFuIGV2ZW50LgovLwovLyBSZWxlYXNpbmcgZnJlZXMgdGhlIGlzc3VlcidzIHNsb3QgYWdhaW5zdCBNYXhSZWNvcmRzUGVySXNzdWVyLiBUaGF0IGlzCi8vIHRoZSBvbmx5IHdheSBhIHNsb3QgaXMgZXZlciBmcmVlZCDigJQgc2V0dGxpbmcgYW5kIHZvaWRpbmcgZG8gbm90IGZyZWUKLy8gb25lLCBiZWNhdXNlIHRoZSByZWNvcmQgaXMgc3RpbGwgc3RvcmVkIGFuZCBzdGlsbCB3YWxrZWQgYnkgZXZlcnkKLy8gaXNzdWVyLXNjb3BlZCBnZXR0ZXIuCmZ1bmMgUmVsZWFzZShjdXIgcmVhbG0sIGlzc3VlciBhZGRyZXNzLCBpZCBpbnQ2NCkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWludiA6PSBtdXN0SW52b2ljZShpc3N1ZXIsIGlkKQoJaWYgaW52LnN0YXR1cyA9PSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiaW52b2ljZSBpcyBzdGlsbCBvcGVuIikKCX0KCWludm9pY2VzLlJlbW92ZShpbnZLZXkoaXNzdWVyLCBpZCkpCglyIDo9IGdldElzc3Vlcihpc3N1ZXIuU3RyaW5nKCkpCglpZiByID09IG5pbCB8fCByLnJlY29yZHMgPT0gMCB7CgkJLy8gVW5yZWFjaGFibGUsIGFuZCBhIHBhbmljIHJhdGhlciB0aGFuIGEgbWFzayBvbiBwdXJwb3NlLiBTZWUKCQkvLyBtdXN0RGVjT3BlbiBmb3IgdGhlIHJlYXNvbmluZzsgdGhlIHN0YWtlcyBhcmUgaGlnaGVyIGhlcmUKCQkvLyBiZWNhdXNlIGByZWNvcmRzYCBpcyB3aGF0IHRoZSBjYXAgcmVhZHMsIHNvIG1hc2tpbmcgd291bGQgY29zdAoJCS8vIHRoZSBpc3N1ZXIgYSBzbG90IHBlcm1hbmVudGx5IGFuZCBzaWxlbnRseS4KCQlwYW5pYygiaW52b2ljZXM6IGlzc3VlciByZWNvcmQgY291bnQgZGVzeW5jaHJvbml6ZWQgZnJvbSB0aGUgaW52b2ljZSB0cmVlIikKCX0KCXIucmVjb3Jkcy0tCgljaGFpbi5FbWl0KCJSZWxlYXNlZCIsICJpZCIsIGl0b2EoaWQpLCAiaXNzdWVyIiwgaXNzdWVyLlN0cmluZygpLAoJCSJzdGF0dXMiLCBpbnYuc3RhdHVzLCAicGFpZCIsIGl0b2EoaW52LnBhaWQpKQp9CgovLyAtLS0gY2xhaW1pbmcgLS0tCgovLyBDbGFpbSBwYXlzIHRoZSBjYWxsZXIgdGhlaXIgd2hvbGUgc2V0dGxlZCBiYWxhbmNlLiBUaGUgaXNzdWVyIG9ubHkg4oCUCi8vIHRoZXJlIGlzIG5vICJjbGFpbSBvbiBiZWhhbGYgb2YiLCBiZWNhdXNlIHRoYXQgd291bGQgbGV0IGEgdGhpcmQgcGFydHkKLy8gY2hvb3NlIHRoZSBtb21lbnQgc29tZW9uZSBlbHNlJ3MgY29pbnMgbW92ZS4KZnVuYyBDbGFpbShjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgl3aG8gOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglrZXkgOj0gd2hvLlN0cmluZygpCglhbW91bnQgOj0gbGVkZ2VyLkJhbGFuY2VPZihrZXkpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIGJhbGFuY2UgdG8gY2xhaW0iKQoJfQoJLy8gRGViaXQgZmlyc3QsIHBlciBjb2luaW8ncyBvcmRlcmluZyBjb250cmFjdDogYSBwYW5pYyBpbnNpZGUgY29pbmlvCgkvLyBhYm9ydHMgdGhlIHRyYW5zYWN0aW9uIGFuZCByZXZlcnRzIHRoaXMgZGViaXQuCglsZWRnZXIuTXVzdFdpdGhkcmF3KGtleSwgYW1vdW50KQoJY29pbmlvLlBheW91dCgwLCBjdXIsIHdobywgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltZWQiLCAiYWNjb3VudCIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKCXJldHVybiBhbW91bnQKfQoKLy8gV2l0aGRyYXdGZWVzIG1vdmVzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gRmVlQ29sbGVjdG9yLiBBbnlvbmUgbWF5IGNhbGwKLy8gaXQ7IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgc28gdGhlIGNhbGxlciBjYW5ub3QKLy8gaW5mbHVlbmNlIHdoZXJlIHRoZSBjb2lucyBnby4KZnVuYyBXaXRoZHJhd0ZlZXMoY3VyIHJlYWxtKSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJZmVlcyA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWlmIGZlZXMgPT0gMCB7CgkJcGFuaWMoIm5vIGZlZXMgYWNjcnVlZCIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgRmVlQ29sbGVjdG9yLCBEZW5vbSwgZmVlcykKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBGZWVDb2xsZWN0b3IuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGZlZXMpKQoJcmV0dXJuIGZlZXMKfQoKLy8gU3dlZXBTdXJwbHVzIHNlbmRzIGNvaW5zIGhlbGQgYmV5b25kIGV2ZXJ5IG9ibGlnYXRpb24gdG8gRmVlQ29sbGVjdG9yLgovLyBUaGUgcmVzZXJ2ZSBwYXNzZWQgdG8gY29pbmlvIGlzIHRoZSByZWFsbSdzIGZ1bGwgbGlhYmlsaXR5LCBzbyBhIHN3ZWVwCi8vIGNhbiBuZXZlciByZWFjaCBhIGNvaW4gYW4gaXNzdWVyIGlzIG93ZWQuCmZ1bmMgU3dlZXBTdXJwbHVzKGN1ciByZWFsbSkgaW50NjQgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIEZlZUNvbGxlY3RvciwgRGVub20sIExpYWJpbGl0aWVzKCkpCgljaGFpbi5FbWl0KCJTd2VwdCIsICJkZW5vbSIsIERlbm9tLCAidG8iLCBGZWVDb2xsZWN0b3IuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2Eoc3dlcHQpKQoJcmV0dXJuIHN3ZXB0Cn0KCi8vIC0tLSB0aGUgb3ZlcmR1ZSBwcmVkaWNhdGU6IHRoaXMgcmVhbG0ncyBpbnRlZ3JhdGlvbiBzdXJmYWNlIC0tLQoKLy8gaXNPdmVyZHVlIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiBhbiBpbnZvaWNlIGFuZCB0aGUgY2xvY2ssIHdoaWNoIGlzIHdoYXQKLy8gbWFrZXMgaXQgdW5pdC10ZXN0YWJsZSB3aXRob3V0IGEgY2hhaW4uCi8vCi8vIE92ZXJkdWUgbWVhbnM6IHN0aWxsIG9wZW4sIHN0aWxsIG93aW5nLCBhbmQgdGhlIGR1ZSBoZWlnaHQgaGFzIFBBU1NFRC4KLy8gU3RyaWN0bHkgcGFzc2VkIOKAlCBhdCBleGFjdGx5IGR1ZUhlaWdodCB0aGUgaW52b2ljZSBpcyBkdWUgYnV0IG5vdCB5ZXQKLy8gbGF0ZSwgd2hpY2ggaXMgd2hhdCBsZXRzIGR1ZUhlaWdodCA9PSBpc3N1ZSBoZWlnaHQgbWVhbiAiZHVlIG9uIHJlY2VpcHQiCi8vIHdpdGhvdXQgYmVpbmcgYm9ybiBsYXRlLgpmdW5jIGlzT3ZlcmR1ZShpbnYgKmludm9pY2UsIG5vdyBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gaW52LnN0YXR1cyA9PSBTdGF0dXNPcGVuICYmIGludi5wYWlkIDwgaW52LmFtb3VudCAmJiBub3cgPiBpbnYuZHVlSGVpZ2h0Cn0KCi8vIElzT3ZlcmR1ZSByZXBvcnRzIHdoZXRoZXIgb25lIGludm9pY2UgaXMgb3ZlcmR1ZSByaWdodCBub3cuCmZ1bmMgSXNPdmVyZHVlKGlzc3VlciBhZGRyZXNzLCBpZCBpbnQ2NCkgYm9vbCB7CglyZXR1cm4gaXNPdmVyZHVlKG11c3RJbnZvaWNlKGlzc3VlciwgaWQpLCBydW50aW1lLkNoYWluSGVpZ2h0KCkpCn0KCi8vIE91dHN0YW5kaW5nRnJvbSBpcyB0aGUgdG90YWwgYSBwYXllciBzdGlsbCBvd2VzIFRISVMgaXNzdWVyIGFjcm9zcyB0aGUKLy8gaXNzdWVyJ3Mgb3BlbiBpbnZvaWNlcy4KLy8KLy8gVGhlIGl0ZXJhdGlvbiBpcyBib3VuZGVkIGJ5IE1heFJlY29yZHNQZXJJc3N1ZXIsIE5PVCBieSB0aGUgbnVtYmVyIG9mCi8vIG9wZW4gaW52b2ljZXM6IGl0IHdhbGtzIHRoZSBpc3N1ZXIncyB3aG9sZSBzdG9yZWQgcHJlZml4IGFuZCBza2lwcyB0aGUKLy8gcmVjb3JkcyB0aGF0IGFyZSBub3Qgb3Blbi4gVGhhdCBpcyB3aHkgdGhlIGNhcCBjb3VudHMgc3RvcmVkIHJlY29yZHMg4oCUCi8vIHNlZSB0aGUgcGFja2FnZSBkb2MuCi8vCi8vIFRoaXMgaXMgdGhlIGlzc3Vlci1zY29wZWQgc2hhcGUgdGhlIHBhY2thZ2UgZG9jIGFyZ3VlcyBmb3I6IGEgY29uc3VtZXIKLy8gcmVhbG0gZ2F0aW5nIGl0cyBvd24gc2VydmljZSBvbiBpdHMgb3duIHVucGFpZCBiaWxscyBpcyB0cnVzdGluZyBvbmx5Ci8vIGl0c2VsZi4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIGdsb2JhbCBwZXItcGF5ZXIgdG90YWwg4oCUIHNlZSB0aGUKLy8gcGFja2FnZSBkb2MsICJBbnlvbmUgbWF5IGlzc3VlIGFuIGludm9pY2UgbmFtaW5nIGFueW9uZSIuCmZ1bmMgT3V0c3RhbmRpbmdGcm9tKGlzc3VlciwgcGF5ZXIgYWRkcmVzcykgaW50NjQgewoJdmFyIHN1bSBpbnQ2NAoJZWFjaE9mKGlzc3VlciwgZnVuYyhpbnYgKmludm9pY2UpIGJvb2wgewoJCWlmIGludi5wYXllciA9PSBwYXllciAmJiBpbnYuc3RhdHVzID09IFN0YXR1c09wZW4gewoJCQlzdW0gKz0gaW52LmFtb3VudCAtIGludi5wYWlkCgkJfQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBzdW0KfQoKLy8gT3ZlcmR1ZUZyb20gaXMgT3V0c3RhbmRpbmdGcm9tIHJlc3RyaWN0ZWQgdG8gaW52b2ljZXMgd2hvc2UgZHVlIGhlaWdodAovLyBoYXMgcGFzc2VkLiBBIGNvbnN1bWVyIHJlYWxtIHRoYXQgd2FudHMgdG8gd2l0aGhvbGQgc2VydmljZSBmcm9tIGEgbGF0ZQovLyBwYXllciByZWFkcyB0aGlzLgpmdW5jIE92ZXJkdWVGcm9tKGlzc3VlciwgcGF5ZXIgYWRkcmVzcykgaW50NjQgewoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJdmFyIHN1bSBpbnQ2NAoJZWFjaE9mKGlzc3VlciwgZnVuYyhpbnYgKmludm9pY2UpIGJvb2wgewoJCWlmIGludi5wYXllciA9PSBwYXllciAmJiBpc092ZXJkdWUoaW52LCBub3cpIHsKCQkJc3VtICs9IGludi5hbW91bnQgLSBpbnYucGFpZAoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gc3VtCn0KCi8vIEhhc092ZXJkdWVGcm9tIGlzIE92ZXJkdWVGcm9tIGFzIGEgcHJlZGljYXRlLCBmb3IgYSBjb25zdW1lciB0aGF0IG9ubHkKLy8gbmVlZHMgdGhlIGJvb2xlYW4uIEl0IHN0b3BzIGF0IHRoZSBmaXJzdCBoaXQgcmF0aGVyIHRoYW4gc3VtbWluZy4KZnVuYyBIYXNPdmVyZHVlRnJvbShpc3N1ZXIsIHBheWVyIGFkZHJlc3MpIGJvb2wgewoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJZm91bmQgOj0gZmFsc2UKCWVhY2hPZihpc3N1ZXIsIGZ1bmMoaW52ICppbnZvaWNlKSBib29sIHsKCQlpZiBpbnYucGF5ZXIgPT0gcGF5ZXIgJiYgaXNPdmVyZHVlKGludiwgbm93KSB7CgkJCWZvdW5kID0gdHJ1ZQoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gZm91bmQKfQoKLy8gLS0tIHJlYWQtb25seSBhY2Nlc3NvcnMgLS0tCgovLyBJbnZvaWNlSW5mbyBpcyB0aGUgd2hvbGUgcmVjb3JkLCBmb3IgYSBjYWxsZXIgdGhhdCB3YW50cyBvbmUgcmVhZC4KZnVuYyBJbnZvaWNlSW5mbyhpc3N1ZXIgYWRkcmVzcywgaWQgaW50NjQpIChwYXllciBhZGRyZXNzLCBhbW91bnQsIHBhaWQsIGR1ZUhlaWdodCwgaXNzdWVkQXQgaW50NjQsIHN0YXR1cyBzdHJpbmcpIHsKCWludiA6PSBtdXN0SW52b2ljZShpc3N1ZXIsIGlkKQoJcmV0dXJuIGludi5wYXllciwgaW52LmFtb3VudCwgaW52LnBhaWQsIGludi5kdWVIZWlnaHQsIGludi5pc3N1ZWRBdCwgaW52LnN0YXR1cwp9CgovLyBPdXRzdGFuZGluZyBpcyB3aGF0IGlzIHN0aWxsIG93ZWQgb24gb25lIGludm9pY2UuIFplcm8gZm9yIGEgc2V0dGxlZCBvcgovLyB2b2lkZWQgb25lIOKAlCBhIHZvaWRlZCBpbnZvaWNlIG93ZXMgbm90aGluZyBieSBkZWZpbml0aW9uLCB3aGljaCBpcyB0aGUKLy8gcG9pbnQgb2Ygdm9pZGluZyBpdC4KZnVuYyBPdXRzdGFuZGluZyhpc3N1ZXIgYWRkcmVzcywgaWQgaW50NjQpIGludDY0IHsKCWludiA6PSBtdXN0SW52b2ljZShpc3N1ZXIsIGlkKQoJaWYgaW52LnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGludi5hbW91bnQgLSBpbnYucGFpZAp9CgovLyBNZW1vIGlzIGFuIGludm9pY2UncyBmcmVlLXRleHQgbWVtbywgZXhhY3RseSBhcyB0aGUgaXNzdWVyIHdyb3RlIGl0LiBJdAovLyBpcyBVTlNBTklUSVpFRCBhbmQgY2FsbGVyLXN1cHBsaWVkOiBhIGNvbnN1bWVyIHRoYXQgcmVuZGVycyBpdCBvd2VzIGl0Ci8vIHRoZSBzYW1lIHRyZWF0bWVudCBSZW5kZXIgZ2l2ZXMgaXQgaGVyZS4KZnVuYyBNZW1vKGlzc3VlciBhZGRyZXNzLCBpZCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RJbnZvaWNlKGlzc3VlciwgaWQpLm1lbW8gfQoKLy8gU3RhdHVzT2YgaXMgYW4gaW52b2ljZSdzIHN0YXR1cy4KZnVuYyBTdGF0dXNPZihpc3N1ZXIgYWRkcmVzcywgaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0SW52b2ljZShpc3N1ZXIsIGlkKS5zdGF0dXMgfQoKLy8gSGFzSW52b2ljZSByZXBvcnRzIHdoZXRoZXIgYSByZWNvcmQgZXhpc3RzLCB3aXRob3V0IHBhbmlja2luZyBvbgovLyBhYnNlbmNlIOKAlCBldmVyeSBvdGhlciBpbnZvaWNlIGFjY2Vzc29yIHBhbmljcywgd2hpY2ggbWFrZXMgdGhlbSB1bnVzYWJsZQovLyBhcyBhbiBleGlzdGVuY2UgcHJvYmUuCmZ1bmMgSGFzSW52b2ljZShpc3N1ZXIgYWRkcmVzcywgaWQgaW50NjQpIGJvb2wgewoJcmV0dXJuIGludm9pY2VzLkdldChpbnZLZXkoaXNzdWVyLCBpZCkpICE9IG5pbAp9CgovLyBPcGVuT2YgaXMgdGhlIG51bWJlciBvZiBvcGVuIGludm9pY2VzIGFuIGlzc3VlciBob2xkcy4KZnVuYyBPcGVuT2YoaXNzdWVyIGFkZHJlc3MpIGludCB7CglpZiByIDo9IGdldElzc3Vlcihpc3N1ZXIuU3RyaW5nKCkpOyByICE9IG5pbCB7CgkJcmV0dXJuIHIub3BlbgoJfQoJcmV0dXJuIDAKfQoKLy8gUmVjb3Jkc09mIGlzIHRoZSBudW1iZXIgb2YgaW52b2ljZSByZWNvcmRzIGFuIGlzc3VlciBjdXJyZW50bHkgaGFzCi8vIHN0b3JlZCwgb2YgYW55IHN0YXR1cy4gVGhpcyDigJQgbm90IE9wZW5PZiDigJQgaXMgdGhlIGZpZ3VyZSBjYXBwZWQgYnkKLy8gTWF4UmVjb3Jkc1Blcklzc3Vlciwgc28gaXQgaXMgdGhlIG9uZSBhbiBpc3N1ZXIgbmVhciB0aGUgY2FwIG5lZWRzLgpmdW5jIFJlY29yZHNPZihpc3N1ZXIgYWRkcmVzcykgaW50IHsKCWlmIHIgOj0gZ2V0SXNzdWVyKGlzc3Vlci5TdHJpbmcoKSk7IHIgIT0gbmlsIHsKCQlyZXR1cm4gci5yZWNvcmRzCgl9CglyZXR1cm4gMAp9CgovLyBJc3N1ZWRPZiBpcyBob3cgbWFueSBpbnZvaWNlcyBhbiBhZGRyZXNzIGhhcyBldmVyIGlzc3VlZCwgYW5kIHRoZWlyCi8vIHRvdGFsIGZhY2UgdmFsdWUuIE5vdGUgdGhlIHRlbnNlOiBib3RoIGFyZSBsaWZldGltZSBmaWd1cmVzIGFuZCBuZWl0aGVyCi8vIGZhbGxzIHdoZW4gYW4gaW52b2ljZSBpcyBzZXR0bGVkLCB2b2lkZWQgb3IgcmVsZWFzZWQuCmZ1bmMgSXNzdWVkT2YoaXNzdWVyIGFkZHJlc3MpIChjb3VudCwgaW52b2ljZWQgaW50NjQpIHsKCWlmIHIgOj0gZ2V0SXNzdWVyKGlzc3Vlci5TdHJpbmcoKSk7IHIgIT0gbmlsIHsKCQlyZXR1cm4gci5pc3N1ZWQsIHIuaW52b2ljZWQKCX0KCXJldHVybiAwLCAwCn0KCi8vIEJhbGFuY2VPZiBpcyBhbiBpc3N1ZXIncyBzZXR0bGVkLCB1bmNsYWltZWQgYmFsYW5jZS4KZnVuYyBCYWxhbmNlT2YoaXNzdWVyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoaXNzdWVyLlN0cmluZygpKSB9CgovLyBSZWNvcmRzIGlzIHRoZSBudW1iZXIgb2YgaW52b2ljZSByZWNvcmRzIGN1cnJlbnRseSBzdG9yZWQsIG9wZW4gb3Igbm90LgovLyBJdCBmYWxscyBvbiBSZWxlYXNlLCBzbyBpdCBpcyBhIHN0b3JhZ2UgZmlndXJlIHJhdGhlciB0aGFuIGEgY291bnQgb2YKLy8gaW52b2ljZXMgdGhhdCBoYXZlIGV4aXN0ZWQuCmZ1bmMgUmVjb3JkcygpIGludCB7IHJldHVybiBpbnZvaWNlcy5TaXplKCkgfQoKLy8gSXNzdWVycyBpcyB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyB0aGF0IGhhdmUgZXZlciBpc3N1ZWQgYW4gaW52b2ljZS4KZnVuYyBJc3N1ZXJzKCkgaW50IHsgcmV0dXJuIGlzc3VlcnMuU2l6ZSgpIH0KCi8vIE5leHRJRCBpcyB0aGUgaWQgdGhlIG5leHQgSXNzdWUgd2lsbCBhbGxvY2F0ZS4gRXhwb3NlZCBzbyBhIGNhbGxlciBjYW4KLy8gdGVsbCBhIG5ldmVyLWlzc3VlZCBpZCBmcm9tIGEgcmVsZWFzZWQgb25lLgpmdW5jIE5leHRJRCgpIGludDY0IHsgcmV0dXJuIG5leHRJRCB9CgovLyBTZXR0bGVkVG90YWwgaXMgdGhlIHN1bSBvZiBldmVyeSBpc3N1ZXIncyB1bmNsYWltZWQgYmFsYW5jZS4KZnVuYyBTZXR0bGVkVG90YWwoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuVXNlcnNUb3RhbCgpIH0KCi8vIEZlZXNBY2NydWVkIGlzIHRoZSBmZWUgcG90IGF3YWl0aW5nIFdpdGhkcmF3RmVlcy4KZnVuYyBGZWVzQWNjcnVlZCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KCi8vIExpYWJpbGl0aWVzIGlzIGV2ZXJ5IGNvaW4gdGhpcyByZWFsbSBvd2VzIHRvIGFueW9uZTogdGhlIGxlZGdlcidzIG93bgovLyB0b3RhbCwgd2hpY2ggaXMgaXNzdWVyIGJhbGFuY2VzIHBsdXMgdGhlIGZlZSBwb3QuCi8vCi8vIFRoZXJlIGlzIG5vIHBvb2wgdGVybSwgYW5kIGl0cyBBQlNFTkNFIGlzIHRoZSB1bmZ1bmRlZCBwcm9wZXJ0eSB0aGlzCi8vIHJlYWxtIGV4aXN0cyB0byBtb2RlbCDigJQgc2VlIHRoZSBwYWNrYWdlIGRvYy4gRG8gbm90ICJmaXgiIHRoaXMgdG8gbWF0Y2gKLy8gcGF5cm9sbCdzIHNoYXBlLgpmdW5jIExpYWJpbGl0aWVzKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkxpYWJpbGl0aWVzKCkgfQoKLy8gSGVsZCBpcyB0aGUgcmVhbG0ncyBhY3R1YWwgdWdub3QgYmFsYW5jZSwgcmVhZCBmcm9tIHRoZSBjaGFpbi4KZnVuYyBIZWxkKCkgaW50NjQgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQoKLy8gU3VycGx1cyBpcyBjb2lucyBoZWxkIGJleW9uZCBldmVyeSBvYmxpZ2F0aW9uIOKAlCB3aGF0IFN3ZWVwU3VycGx1cyB3b3VsZAovLyBtb3ZlLiBJdCBpcyB6ZXJvIHdoZW4gZXZlcnkgY29pbiBhcnJpdmVkIHRocm91Z2ggYW4gZW50cnlwb2ludC4KZnVuYyBTdXJwbHVzKCkgaW50NjQgewoJaCwgbCA6PSBIZWxkKCksIExpYWJpbGl0aWVzKCkKCWlmIGggPD0gbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBoIC0gbAp9CgovLyBBZGRyZXNzIGlzIHRoaXMgcmVhbG0ncyBvd24gYWRkcmVzcy4KZnVuYyBBZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiBzZWxmIH0KCi8vIEhlaWdodCBpcyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQsIGV4cG9zZWQgc28gYSBjYWxsZXIgY2FuIGNvbXB1dGUgZHVlCi8vIGhlaWdodHMgYWdhaW5zdCB0aGUgc2FtZSBjbG9jayB0aGlzIHJlYWxtIHVzZXMuCmZ1bmMgSGVpZ2h0KCkgaW50NjQgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KCi8vIC0tLSBpbnRlcm5hbHMgLS0tCgovLyBpbnZLZXkgaXMgaXNzdWVyfHBhZGRlZElELiBUaGUgaWQgaXMgbGVmdC1wYWRkZWQgdG8gMTkgZGlnaXRzIOKAlCB0aGUKLy8gd2lkdGggb2YgTWF4SW50NjQg4oCUIHNvIHRoYXQgbGV4aWNvZ3JhcGhpYyBvcmRlciBvdmVyIGFuIGlzc3VlcidzIHByZWZpeAovLyBpcyBudW1lcmljIG9yZGVyIG92ZXIgdGhlaXIgaW52b2ljZSBpZHMuIEFuIHVucGFkZGVkIGRlY2ltYWwgd291bGQgc29ydAovLyAiMTAiIGJlZm9yZSAiOSIgYW5kIG1ha2UgYSBwcmVmaXggc2NhbiByZXR1cm4gdGhlbSBvdXQgb2Ygb3JkZXIuCmZ1bmMgaW52S2V5KGlzc3VlciBhZGRyZXNzLCBpZCBpbnQ2NCkgc3RyaW5nIHsKCXJldHVybiBpc3N1ZXIuU3RyaW5nKCkgKyAifCIgKyBwYWRJRChpZCkKfQoKZnVuYyBwYWRJRChpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDE5IHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKLy8gZWFjaE9mIGl0ZXJhdGVzIG9uZSBpc3N1ZXIncyBpbnZvaWNlIHJlY29yZHMgaW4gaWQgb3JkZXIuIFRoZSBjYWxsYmFjawovLyByZXR1cm5zIHRydWUgdG8gc3RvcCwgbWF0Y2hpbmcgYXZsJ3Mgb3duIGNvbnZlbnRpb24uCmZ1bmMgZWFjaE9mKGlzc3VlciBhZGRyZXNzLCBmbiBmdW5jKCppbnZvaWNlKSBib29sKSB7CglwcmVmaXggOj0gaXNzdWVyLlN0cmluZygpICsgInwiCglpbnZvaWNlcy5JdGVyYXRlKHByZWZpeCwgcHJlZml4KyJceGZmIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXJldHVybiBmbih2LigqaW52b2ljZSkpCgl9KQp9CgpmdW5jIGdldElzc3VlcihrZXkgc3RyaW5nKSAqaXNzdWVyUmVjIHsKCXYgOj0gaXNzdWVycy5HZXQoa2V5KQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqaXNzdWVyUmVjKQp9CgpmdW5jIG11c3RJbnZvaWNlKGlzc3VlciBhZGRyZXNzLCBpZCBpbnQ2NCkgKmludm9pY2UgewoJdiA6PSBpbnZvaWNlcy5HZXQoaW52S2V5KGlzc3VlciwgaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIGludm9pY2UiKQoJfQoJcmV0dXJuIHYuKCppbnZvaWNlKQp9CgovLyBtdXN0RGVjT3BlbiBkZWNyZW1lbnRzIGFuIGlzc3VlcidzIG9wZW4gY291bnQgYnkgb25lIGFuZCBSRUZVU0VTIHJhdGhlcgovLyB0aGFuIG1hc2tpbmcgaWYgaXQgY2Fubm90LgovLwovLyBCb3RoIGNhbGwgc2l0ZXMg4oCUIHNldHRsZW1lbnQgaW4gUGF5IGFuZCBmb3JnaXZlbmVzcyBpbiBWb2lkIOKAlCBoYXZlIGFscmVhZHkKLy8gcHJvdmVkIHRoZSBpbnZvaWNlIGV4aXN0cyBhbmQgd2FzIFN0YXR1c09wZW4sIHNvIG5laXRoZXIgYnJhbmNoIGJlbG93IGNhbgovLyBmaXJlLiBUaGUgZGVjcmVtZW50IGlzIHJlYWNoYWJsZSBvbmx5IHRocm91Z2ggYSBzdGF0dXMgdHJhbnNpdGlvbiBvdXQgb2YKLy8gU3RhdHVzT3BlbiwgZWFjaCBpbnZvaWNlIG1ha2VzIHRoYXQgdHJhbnNpdGlvbiBhdCBtb3N0IG9uY2UgKGJvdGggZ3VhcmRzCi8vIHJlcXVpcmUgU3RhdHVzT3BlbiBhbmQgYm90aCBzZXQgYSB0ZXJtaW5hbCBzdGF0dXMpLCBhbmQgSXNzdWUgaW5jcmVtZW50cwovLyBgb3BlbmAgZm9yIGV2ZXJ5IHJlY29yZCBpdCBzdG9yZXMuIFNvIGFuIG9wZW4gaW52b2ljZSBjb250cmlidXRlZCBleGFjdGx5Ci8vIG9uZSB0byB0aGlzIGNvdW50ZXIgYW5kIGhhcyBub3QgeWV0IHRha2VuIGl0IGJhY2suCi8vCi8vIFRoZSBlYXJsaWVyIHNwZWxsaW5nIHdhcyBgaWYgciA6PSBnZXRJc3N1ZXIoLi4uKTsgciAhPSBuaWwgJiYgci5vcGVuID4gMGAsCi8vIHdoaWNoIHJlYWRzIGFzIHBydWRlbmNlIGFuZCBpcyB0aGUgb3Bwb3NpdGUuIFRob3NlIGNsYXVzZXMgY2Fubm90IHByZXZlbnQKLy8gdGhlIGluY29uc2lzdGVuY3kg4oCUIHRoZSBzdGF0dXMgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIGJ5IHRoZSB0aW1lIHdlIGdldAovLyBoZXJlIOKAlCB0aGV5IGNhbiBvbmx5IGRlY2xpbmUgdG8gbm90aWNlIGl0LCBhbmQgdGhlbiBDT01NSVQgaXQuIEEgcGFuaWMKLy8gYWJvcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbiBhbmQgcmV2ZXJ0cyB0aGUgc3RhdHVzIHdyaXRlIHRvbywgd2hpY2gKLy8gbGVhdmVzIHRoZSByZWFsbSBjb25zaXN0ZW50OyBtYXNraW5nIGxlYXZlcyBpdCBpbmNvbnNpc3RlbnQgYW5kIHNpbGVudCwKLy8gYW5kIHRoZSBjb3VudGVyIGl0IGNvcnJ1cHRzIGlzIHRoZSBvbmUgTWF4UmVjb3Jkc1Blcklzc3VlciByZWFkcy4KLy8KLy8gU28gdGhlIGd1YXJkIGV4aXN0cyBmb3IgYSBmdXR1cmUgZWRpdCwgbm90IGZvciB0b2RheTogYSBwYXRoIHRoYXQgcmV0aXJlcwovLyBhbiBpbnZvaWNlIHdpdGhvdXQgY29taW5nIHRocm91Z2ggaGVyZSBmYWlscyBsb3VkbHkgb24gdGhlIG5leHQgb25lCi8vIGluc3RlYWQgb2YgcXVpZXRseSBsZWFraW5nIGEgc2xvdC4gQSBjaGVjayB0aGF0IGNhbiBuZXZlciBmaXJlIGFuZCBhCi8vIGNoZWNrIHRoYXQgYWx3YXlzIHBhc3NlcyBhcmUgdGhlIHNhbWUgYXJ0aWZhY3QgZnJvbSBhIHJlYWRlcidzIHNlYXQ7IHRoZQovLyBkaWZmZXJlbmNlIGlzIHdoYXQgZWFjaCBkb2VzIHdoZW4gaXQgaXMgd3JvbmcuCmZ1bmMgbXVzdERlY09wZW4oaXNzdWVyIGFkZHJlc3MpIHsKCXIgOj0gZ2V0SXNzdWVyKGlzc3Vlci5TdHJpbmcoKSkKCWlmIHIgPT0gbmlsIHx8IHIub3BlbiA9PSAwIHsKCQlwYW5pYygiaW52b2ljZXM6IGlzc3VlciBvcGVuIGNvdW50IGRlc3luY2hyb25pemVkIGZyb20gdGhlIGludm9pY2UgdHJlZSIpCgl9CglyLm9wZW4tLQp9CgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CgljIDo9IGEgKyBiCglpZiAoYiA+IDAgJiYgYyA8IGEpIHx8IChiIDwgMCAmJiBjID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGMsIHRydWUKfQoKZnVuYyBpdG9hKG4gaW50NjQpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChuLCAxMCkgfQoKLy8gLS0tIHJlbmRlciAtLS0KCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIGludm9pY2VzXG5cbiIpCgliLldyaXRlU3RyaW5nKCJPbi1jaGFpbiBhY2NvdW50cyByZWNlaXZhYmxlLiBBbiBpbnZvaWNlIGlzIHVuZnVuZGVkIGF0ICIpCgliLldyaXRlU3RyaW5nKCJjcmVhdGlvbjogdGhlIG9ibGlnYXRpb24gaXMgcmVjb3JkZWQgZmlyc3QsIGFuZCB0aGUgIikKCWIuV3JpdGVTdHJpbmcoIm1vbmV5IG1heSBuZXZlciBhcnJpdmUuXG5cbiIpCgoJaWYgcGF0aCA9PSAiIiB7CgkJYi5Xcml0ZVN0cmluZygiIyMgVG90YWxzXG5cbiIpCgkJYi5Xcml0ZVN0cmluZygifCBmaWVsZCB8IHZhbHVlIHxcbnwtLS18LS0tfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8IGlzc3VlcnMgfCAiICsgaXRvYShpbnQ2NChJc3N1ZXJzKCkpKSArICIgfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8IHN0b3JlZCByZWNvcmRzIHwgIiArIGl0b2EoaW50NjQoUmVjb3JkcygpKSkgKyAiIHxcbiIpCgkJYi5Xcml0ZVN0cmluZygifCBzZXR0bGVkLCB1bmNsYWltZWQgfCAiICsgaXRvYShTZXR0bGVkVG90YWwoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuIikKCQliLldyaXRlU3RyaW5nKCJ8IGZlZXMgYWNjcnVlZCB8ICIgKyBpdG9hKEZlZXNBY2NydWVkKCkpICsgIiAiICsgRGVub20gKyAiIHxcbiIpCgkJYi5Xcml0ZVN0cmluZygifCBoZWxkIHwgIiArIGl0b2EoSGVsZCgpKSArICIgIiArIERlbm9tICsgIiB8XG4iKQoJCWIuV3JpdGVTdHJpbmcoInwgc3VycGx1cyB8ICIgKyBpdG9hKFN1cnBsdXMoKSkgKyAiICIgKyBEZW5vbSArICIgfFxuXG4iKQoJCWIuV3JpdGVTdHJpbmcoIj4gQW55b25lIG1heSBpc3N1ZSBhbiBpbnZvaWNlIG5hbWluZyBhbnlvbmUsIHNvIGFuICIpCgkJYi5Xcml0ZVN0cmluZygidW5wYWlkIGludm9pY2UgaXMgYW4gdW52ZXJpZmllZCBjbGFpbSBieSBpdHMgaXNzdWVyLiAiKQoJCWIuV3JpdGVTdHJpbmcoIlRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBnbG9iYWwgXCJ3aGF0IGRvZXMgdGhpcyAiKQoJCWIuV3JpdGVTdHJpbmcoImFkZHJlc3Mgb3dlXCIgdG90YWw7IHJlYWQgT3V0c3RhbmRpbmdGcm9tLCB3aGljaCBpcyAiKQoJCWIuV3JpdGVTdHJpbmcoImlzc3Vlci1zY29wZWQuXG5cbiIpCgkJYi5Xcml0ZVN0cmluZygiQXBwZW5kIGFuIGlzc3VlciBhZGRyZXNzIHRvIHRoaXMgcGF0aCB0byBzZWUgdGhlaXIgYm9vay5cbiIpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCgl3aG8gOj0gc2FuaXRpemUuSW5saW5lVGV4dChwYXRoKQoJYi5Xcml0ZVN0cmluZygiIyMgQm9vayBvZiAiICsgd2hvICsgIlxuXG4iKQoJciA6PSBnZXRJc3N1ZXIocGF0aCkKCWlmIHIgPT0gbmlsIHsKCQliLldyaXRlU3RyaW5nKCJObyBpc3N1ZXIgcmVjb3JkIGF0IHRoYXQgYWRkcmVzcy5cbiIpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWIuV3JpdGVTdHJpbmcoIk9wZW46ICIgKyBpdG9hKGludDY0KHIub3BlbikpICsgIiwgIikKCWIuV3JpdGVTdHJpbmcoInN0b3JlZDogIiArIGl0b2EoaW50NjQoci5yZWNvcmRzKSkgKyAiLyIgKwoJCWl0b2EoaW50NjQoTWF4UmVjb3Jkc1Blcklzc3VlcikpICsgIiwgIikKCWIuV3JpdGVTdHJpbmcoImlzc3VlZCBhbGwgdGltZTogIiArIGl0b2Eoci5pc3N1ZWQpICsgIiwgIikKCWIuV3JpdGVTdHJpbmcoImZhY2UgdmFsdWUgYWxsIHRpbWU6ICIgKyBpdG9hKHIuaW52b2ljZWQpICsgIiAiICsgRGVub20gKyAiXG5cbiIpCgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJYi5Xcml0ZVN0cmluZygifCBpZCB8IHBheWVyIHwgYW1vdW50IHwgcGFpZCB8IGR1ZSB8IHN0YXR1cyB8IG1lbW8gfFxuIikKCWIuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJcHJlZml4IDo9IHBhdGggKyAifCIKCWludm9pY2VzLkl0ZXJhdGUocHJlZml4LCBwcmVmaXgrIlx4ZmYiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJaW52IDo9IHYuKCppbnZvaWNlKQoJCXN0YXRlIDo9IGludi5zdGF0dXMKCQlpZiBpc092ZXJkdWUoaW52LCBub3cpIHsKCQkJc3RhdGUgPSAiT1ZFUkRVRSIKCQl9CgkJYi5Xcml0ZVN0cmluZygifCAiICsgaXRvYShpbnYuaWQpKQoJCWIuV3JpdGVTdHJpbmcoIiB8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwoaW52LnBheWVyLlN0cmluZygpKSkKCQliLldyaXRlU3RyaW5nKCIgfCAiICsgaXRvYShpbnYuYW1vdW50KSkKCQliLldyaXRlU3RyaW5nKCIgfCAiICsgaXRvYShpbnYucGFpZCkpCgkJYi5Xcml0ZVN0cmluZygiIHwgIiArIGl0b2EoaW52LmR1ZUhlaWdodCkpCgkJYi5Xcml0ZVN0cmluZygiIHwgIiArIHN0YXRlKQoJCWIuV3JpdGVTdHJpbmcoIiB8ICIgKyBjZWxsKGludi5tZW1vKSArICIgfFxuIikKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBjZWxsIHByZXBhcmVzIGNhbGxlci1zdXBwbGllZCB0ZXh0IGZvciBhIEdGTSB0YWJsZSBjZWxsLCB0cnVuY2F0aW5nIGl0Ci8vIGZvciBkaXNwbGF5IGZpcnN0LgovLwovLyBUYWJsZUNlbGwgcmF0aGVyIHRoYW4gSW5saW5lVGV4dCwgYW5kIHRoZSBzbG90IGlzIHRoZSByZWFzb246IHRoZXNlCi8vIGJ5dGVzIGxhbmQgYmV0d2VlbiB0d28gYHxgIGRlbGltaXRlcnMsIGFuZCBhbiB1bmVzY2FwZWQgYHxgIGluIGEgbWVtbwovLyB3b3VsZCBvcGVuIGEgbmV3IGNvbHVtbiBhbmQgc2hpZnQgZXZlcnkgY29sdW1uIHRvIGl0cyByaWdodC4gSW5saW5lVGV4dAovLyBkb2VzIG5vdCBlc2NhcGUgdGhlIHBpcGUuIFRoZSBwYXllciBjZWxsIGFib3ZlIHVzZXMgdGhlIHNhbWUgaGVscGVyIGZvcgovLyB0aGUgc2FtZSBzbG90IGV2ZW4gdGhvdWdoIGEgYmVjaDMyIGFkZHJlc3MgY2Fubm90IGNvbnRhaW4gb25lIOKAlCBtYXRjaGluZwovLyB0aGUgaGVscGVyIHRvIHRoZSBzbG90IGlzIHRoZSBydWxlIHRoYXQgc3Vydml2ZXMgYSBsYXRlciBlZGl0LCB3aGVyZWFzCi8vICJ0aGlzIHBhcnRpY3VsYXIgdmFsdWUgaGFwcGVucyB0byBiZSBzYWZlIiBpcyBhIGZhY3QgYWJvdXQgdG9kYXkncwovLyBjaGFyc2V0LgovLwovLyBUUlVOQ0FURSBCRUZPUkUgRVNDQVBJTkcsIGFuZCBvbiBhIFJVTkUgYm91bmRhcnkuIEVzY2FwaW5nIGZpcnN0IGFuZAovLyBjdXR0aW5nIGFmdGVyd2FyZHMgY2FuIHNsaWNlIGEgYFx8YCBpbiBoYWxmIGFuZCBsZWF2ZSB0aGUgY2VsbCBlbmRpbmcgaW4KLy8gYSBiYXJlIGJhY2tzbGFzaDsgY3V0dGluZyBvbiBhIGJ5dGUgYm91bmRhcnkgY2FuIHNwbGl0IGEgbXVsdGktYnl0ZSBydW5lCi8vIGFuZCBlbWl0IGludmFsaWQgVVRGLTguIE5laXRoZXIgaXMgc29tZXRoaW5nIHRoZSBzYW5pdGl6ZXIgaXMgYXNrZWQgdG8KLy8gcmVwYWlyLCBiZWNhdXNlIGJ5IHRoZSB0aW1lIGl0IHNlZXMgdGhlIHN0cmluZyB0aGUgZGFtYWdlIGlzIHVwc3RyZWFtLgpmdW5jIGNlbGwocyBzdHJpbmcpIHN0cmluZyB7Cgljb25zdCBtYXhSdW5lcyA9IDQ4CglpZiByIDo9IFtdcnVuZShzKTsgbGVuKHIpID4gbWF4UnVuZXMgewoJCXMgPSBzdHJpbmcocls6bWF4UnVuZXNdKSArICLigKYiCgl9CglyZXR1cm4gc2FuaXRpemUuVGFibGVDZWxsKHMpCn0KIg0xMDAwMDAwMHVnbm90EhII4on9RhILMTQ4ODUwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQN/1fxuvoj2ydOHR83iOqW/9l4qh53CBxZuWKyR03p8tF4lRUIc4DpOcqdJR6Vmvbq0tfiwUZKOwb38zxbK1x3gaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}