{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "6kD9VWkuUp5ejOdKb5/ws3RDeF1/uBDfcYJhgxGqS5I=",
    "height": "1315542",
    "index": 1,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "150000000",
      "GasUsed": "127272256"
    },
    "tx": "Ctv9BQoML3ZtLm1fYWRkcGtnEsn9BQooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKM/QUKB2J1ZGdldHMSO2duby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9idWRnZXRzGqX/AgoLYnVkZ2V0cy5nbm8SlP8CLy8gUmVhbG0gYnVkZ2V0cyBpcyBhIGRlbGVnYXRlZC1idWRnZXQgdHJlYXN1cnkgaW4gR05PVDogYW4gb3duZXIgZnVuZHMgYQovLyBwb29sLCBncmFudHMgbmFtZWQgZGVsZWdhdGVzIGEgc3RhbmRpbmcsIHJhdGUtbGltaXRlZCwgcmV2b2NhYmxlCi8vIGF1dGhvcml0eSB0byBzcGVuZCBmcm9tIGl0LCBhbmQgZWFjaCBkZWxlZ2F0ZSB0aGVuIGRyYXdzIHdpdGhpbiB0aGF0Ci8vIGF1dGhvcml0eSB3aXRoIG5vIGZ1cnRoZXIgYXBwcm92YWwgZnJvbSBhbnlvbmUuCi8vCi8vIFdIWSBUSElTIEVYSVNUUyAoc2VlIERJU0NPVkVSWS5tZCk6IGV2ZXJ5IGRpc2J1cnNlbWVudCBwYXRoIG9uIGVpdGhlcgovLyBsaXZlIGNoYWluIGlzIG9uZSBvZiB0aHJlZSBzaGFwZXMg4oCUIGEgZnJlc2ggZ3JvdXAgZGVjaXNpb24gcGVyIHNwZW5kCi8vICh0aGlzIHBvcnRmb2xpbydzIHRyZWFzdXJ5X2JvYXJkLCBnbm8ubGFuZCdzIHIvZ292L2Rhby90cmVhc3VyeSwgdGhlCi8vIG1haW5uZXQgYnViYmxldHJlYXN1cnkpLCBhIGZpeGVkIHNjaGVkdWxlICh2ZXN0aW5nKSwgb3IgYSBwdWxsIGFnYWluc3QKLy8gYW4gYWxyZWFkeS1zZXR0bGVkIGVudGl0bGVtZW50IChmZWVfc3BsaXQsIHJldnNoYXJlLCBjcm93ZGZ1bmQsCi8vIHN1YnNjcmlwdGlvbnMpLiBOb25lIG9mIHRoZW0gbGV0cyBvbmUgcGFydHkgc3BlbmQgYW5vdGhlcidzIG1vbmV5IGF0Ci8vIGl0cyBvd24gZGlzY3JldGlvbiB3aXRoaW4gYSBib3VuZC4gVGhhdCBpcyB0aGUgZ2FwLCBhbmQKLy8gYnViYmxldHJlYXN1cnkg4oCUIGEgcmVhbCBtYWlubmV0IHRyZWFzdXJ5IHRoYXQgaGFuZC1yb2xsZWQgYSBzbGlkaW5nCi8vIHNwZW5kIHdpbmRvdyBpbnNpZGUgdGhlIHJlYWxtLCB3aXRoIGV2ZXJ5IHNwZW5kIHN0aWxsIGEgdG9rZW4taG9sZGVyCi8vIHByb3Bvc2FsIOKAlCBpcyB0aGUgZXZpZGVuY2Ugc29tZW9uZSB3YW50ZWQgaXQuCi8vCi8vIEl0IGlzIGFsc28sIGRlbGliZXJhdGVseSwgdGhlIEZJUlNUIENPTlNVTUVSIG9mIHNwZW5kYm9vayBvbiBhbnkKLy8gY2hhaW4uIEEgcHJpbWl0aXZlIHdpdGggbm8gY29uc3VtZXIgaGFzIHR3byBwcm9wZXJ0aWVzIHVucHJvdmVuIG5vCi8vIG1hdHRlciBob3cgbWFueSB1bml0IHRlc3RzIHBhc3M6IHRoYXQgaXRzIEFQSSBpcyB1c2FibGUgZnJvbSBhIHJlYWxtLAovLyBhbmQgdGhhdCBpdHMgc3RhdGUgc3Vydml2ZXMgYWNyb3NzIHRyYW5zYWN0aW9ucy4gT25seSBhIHJlYWxtIGNhbgovLyBhbnN3ZXIgZWl0aGVyLCBhbmQgdGhpcyBvbmUgaXMgdGhlIGFuc3dlci4KLy8KLy8gQ09NUE9TSVRJT046IHNwZW5kaW5nIGF1dGhvcml0eSBpcyBkZWxlZ2F0ZWQgZW50aXJlbHkgdG8gc3BlbmRib29rCi8vIChhbmNob3JlZCB3aW5kb3dzLCBsaWZldGltZSBjYXBzLCBleHBpcnksIG9uZS1zaWRlZCBhbWVuZG1lbnRzLAovLyByZXZvY2F0aW9uKSwgY29pbiBtb3ZlbWVudCB0byBjb2luaW8sIHBlci1kZWxlZ2F0ZSBjcmVkaXQgYW5kIHRoZSBmZWUKLy8gcG90IHRvIGZlZWxlZGdlciwgb3JkZXJlZCBzdG9yYWdlIHRvIHAvbnQvYXZsL3YwLCBhbmQgZnJlZS10ZXh0IHJlbmRlcgovLyBvdXRwdXQgdG8gcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MC4gVGhpcyByZWFsbSBvd25zIG9ubHkgdGhlIHBvb2wKLy8gYWNjb3VudGluZywgdGhlIGdyYW50IHJlY29yZHMsIGFuZCB0aGUgc29sdmVuY3kgcnVsZS4KLy8KLy8gIyBXaGF0IGEgYnVkZ2V0IGlzLCBhbmQgd2hhdCBpdCBpcyBub3QKLy8KLy8gQSBidWRnZXQgaXMgQVVUSE9SSVRZLCBub3QgYSByZXNlcnZhdGlvbi4gVGhyZWUgZ3JhbnRzIG9mIDEwMCBhZ2FpbnN0Ci8vIGEgcG9vbCBvZiAxMDAgYXJlIGFsbCB0aHJlZSB2YWxpZCwgYW5kIHRoZSBmaXJzdCBkZWxlZ2F0ZSB0byBkcmF3IGdldHMKLy8gdGhlIG1vbmV5LiBUaGlzIGlzIG5vdCBhIGRlZmVjdCB0byBiZSBmaXhlZCBieSByZXNlcnZpbmcgZnVuZHM6IGEKLy8gcmVzZXJ2YXRpb24gd291bGQgbWFrZSBhbiBvd25lciB1bmFibGUgdG8gZ3JhbnQgYSBzdGFuZGluZyBhbGxvd2FuY2UKLy8gd2l0aG91dCBwcmUtY29tbWl0dGluZyB0aGUgY2FwaXRhbCwgd2hpY2ggaXMgdGhlIHdob2xlIGNvbnZlbmllbmNlCi8vIGJlaW5nIGJvdWdodC4gV2hhdCB0aGUgcmVhbG0gZ3VhcmFudGVlcyBpbnN0ZWFkIGlzIHRoYXQgaXQgbmV2ZXIKLy8gUFJPTUlTRVMgd2hhdCBpdCBkb2VzIG5vdCBIT0xEOgovLwovLwlEcmF3IHJlZnVzZXMgdW5sZXNzIGFtb3VudCA8PSB0aGUgb3duZXIncyBvd24gdW5zcGVudCBwb29sLgovLwovLyBTbyBhIGRlbGVnYXRlIGlzIHRvbGQgIm5vIiBhdCBkcmF3IHRpbWUgcmF0aGVyIHRoYW4gY3JlZGl0ZWQgd2l0aAovLyBzb21ldGhpbmcgdW5jbGFpbWFibGUuIFRoZSBwb29sIGlzIHRoZSBzb2x2ZW5jeSBib3VuZCBhbmQgaXQgaXMKLy8gcGVyLW93bmVyLCB3aGljaCBpcyBzdHJpY3RseSBzdHJvbmdlciB0aGFuIGEgcmVhbG0td2lkZSBjaGVjazogb25lCi8vIG93bmVyJ3MgZ3JhbnRzIGNhbiBuZXZlciByZWFjaCBhbm90aGVyIG93bmVyJ3MgZnVuZHMuCi8vCi8vICMgQ3JlZGl0LCB0aGVuIHB1bGwKLy8KLy8gRHJhdyBtb3ZlcyBub3RoaW5nLiBJdCBjb25zdW1lcyB0aGUgYWxsb3dhbmNlLCBkZWJpdHMgdGhlIG93bmVyJ3MKLy8gcG9vbCwgYW5kIGNyZWRpdHMgdGhlIGRlbGVnYXRlIGluIHRoZSBsZWRnZXI7IHRoZSBkZWxlZ2F0ZSB0aGVuIHNpZ25zCi8vIGEgc2VwYXJhdGUgQ2xhaW0gdG8gcmVjZWl2ZSB0aGUgY29pbnMuIFRoaXMgaXMgbm90IHJpdHVhbC4gSWYgRHJhdwovLyBwYWlkIG91dCBkaXJlY3RseSwgYSBmYWlsaW5nIHBheW91dCBpbnNpZGUgdGhlIHNhbWUgdHJhbnNhY3Rpb24gd291bGQKLy8gbGVhdmUgYSBjb25zdW1lZCBhbGxvd2FuY2Ugd2l0aCBubyBtb25leSBkZWxpdmVyZWQsIG9yIGZvcmNlIHRoZQovLyBhbGxvd2FuY2UgY29uc3VtcHRpb24gdG8gaGFwcGVuIGFmdGVyIGFuIGVmZmVjdCDigJQgYW5kIHNwZW5kYm9vaydzIG93bgovLyBjb25zdW1lciBjb250cmFjdCBpdGVtIDMgc2F5cyBzdGF0ZSBmaXJzdCwgZWZmZWN0IHNlY29uZCwgZm9yIGV4YWN0bHkKLy8gdGhhdCByZWFzb24uIFNwbGl0dGluZyBpdCBhbHNvIG1lYW5zIGEgZGVsZWdhdGUgY2FuIGRyYXcgcmVwZWF0ZWRseQovLyBhbmQgY2xhaW0gb25jZSwgd2hpY2ggaXMgY2hlYXBlciB0aGFuIGNsYWltaW5nIHBlciBkcmF3LgovLwovLyAjIExJRkVDWUNMRQovLwovLwlGdW5kIChvd25lciwgK3NlbmQpICAgICAgIDogYWRkcyByZWFsIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gcG9vbC4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFueW9uZSBtYXkgZnVuZDsgZnVuZGluZyBtYWtlcyB5b3UgYW4KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLiBNaW5pbXVtIE1pbkZ1bmRpbmcuCi8vCVdpdGhkcmF3UG9vbCAob3duZXIpICAgICAgOiBwdWxscyB1bnNwZW50IHBvb2wgYmFjayBvdXQsIGFueSBhbW91bnQsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgdGltZS4gU2VlICJ0aGUgb3duZXIgY2FuIGFsd2F5cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmUiIGJlbG93LgovLwlXaXRoZHJhd1Bvb2xBbGwgKG93bmVyKSAgIDogdGhlIHdob2xlIHBvb2wuCi8vCUdyYW50IChvd25lcikgICAgICAgICAgICAgOiBvcGVucyBvbmUgc3BlbmRib29rIGFsbG93YW5jZSBmb3Igb25lCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSBhbmQgcmV0dXJucyB0aGUgZ3JhbnQgaWQuIFRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdyBmZWUgaXMgc25hcHNob3R0ZWQgaGVyZS4KLy8JQW1lbmQgKG93bmVyKSAgICAgICAgICAgICA6IGNoYW5nZXMgdGhlIGdyYW50J3MgdGVybXMuIFRpZ2h0ZXItb3ItCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCBhcHBsaWVzIG5vdzsgbG9vc2VyIHdhaXRzIGZvciB0aGUKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgd2luZG93IGJvdW5kYXJ5LiBQZXJpb2RMZW5ndGggaXMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVCBhIHBhcmFtZXRlciDigJQgc3BlbmRib29rIG1ha2VzIGl0Ci8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGUgYW5kIHRoaXMgcmVhbG0gbWFrZXMgdGhhdAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbC4KLy8JUmV2b2tlIChvd25lcikgICAgICAgICAgICA6IGltbWVkaWF0ZSwgYW5kIHRoZSBpZCBpcyBuZXZlciByZXVzZWQuCi8vCURyYXcgKERFTEVHQVRFKSAgICAgICAgICAgOiBjb25zdW1lcyBhdXRob3JpdHksIGRlYml0cyB0aGUgcG9vbCwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRpdHMgdGhlIGRlbGVnYXRlIG5ldCBvZiB0aGUgZmVlLgovLwlDbGFpbSAoREVMRUdBVEUpICAgICAgICAgIDogcGF5cyB0aGUgZGVsZWdhdGUncyB3aG9sZSBjcmVkaXQgb3V0LgovLwlSZWFwIChBTllPTkUpICAgICAgICAgICAgIDogcmVtb3ZlcyBhbiBFWFBJUkVEIGdyYW50LCBmcmVlaW5nIGl0cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC4gUGVybWlzc2lvbmxlc3MgYmVjYXVzZSBhbiBleHBpcmVkCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UgY2FuIGF1dGhvcml6ZSBub3RoaW5nLCBzbwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZyBmcm9tIGFueW9uZS4KLy8JV2l0aGRyYXdGZWVzIChBTllPTkUpICAgICA6IHBheXMgdGhlIGZlZSBwb3QgdG8gdGhlIGNvbXBpbGUtdGltZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVlQ29sbGVjdG9yLiBGaXhlZCBkZXN0aW5hdGlvbiwgc28KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RlZXIuCi8vCVN3ZWVwU3VycGx1cyAoQU5ZT05FKSAgICAgOiBvdXQtb2YtYmFuZCBjb2lucyB0byB0aGUgRmVlQ29sbGVjdG9yLAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV2ZXIgdG91Y2hpbmcgdHJhY2tlZCBsaWFiaWxpdGllcy4KLy8KLy8gIyBUaGUgb3duZXIgY2FuIGFsd2F5cyBsZWF2ZSwgYW5kIHRoYXQgaXMgdGhlIGRlc2lnbgovLwovLyBXaXRoZHJhd1Bvb2wgaGFzIG5vIGxvY2ssIG5vIG5vdGljZSBwZXJpb2QsIGFuZCBubyBjaGVjayBhZ2FpbnN0Ci8vIG91dHN0YW5kaW5nIGdyYW50cy4gQW4gb3duZXIgY2FuIGVtcHR5IHRoZSBwb29sIHVuZGVyIGEgbGl2ZSBncmFudCBhbmQKLy8gdGhlIGRlbGVnYXRlJ3MgbmV4dCBEcmF3IHdpbGwgZmFpbCBvbiBzb2x2ZW5jeS4gVGhpcyBpcyBzdGF0ZWQgcGxhaW5seQovLyByYXRoZXIgdGhhbiBidXJpZWQ6IHRoZSBtb25leSBpcyB0aGUgb3duZXIncywgUmV2b2tlIGlzIHRoZSBjbGVhbiB3YXkKLy8gdG8gZW5kIGEgcmVsYXRpb25zaGlwLCBhbmQgYSByZWFsbSB0aGF0IGNvdWxkIHRyYXAgYW4gb3duZXIncyBjYXBpdGFsCi8vIGJlaGluZCBhIGdyYW50IHRoZXkgcmVncmV0IHdvdWxkIGJlIGEgd29yc2UgcmVhbG0uIEEgZGVsZWdhdGUgd2hvCi8vIG5lZWRzIGEgZ3VhcmFudGVlIG9mIGZ1bmRzIGRvZXMgbm90IHdhbnQgYSBidWRnZXQg4oCUIHRoZXkgd2FudCBlc2Nyb3csCi8vIHdoaWNoIGlzIGEgZGlmZmVyZW50IGFydGlmYWN0LgovLwovLyBXaGF0IHRoZSBvd25lciBDQU5OT1QgZG8gaXMgdW5kbyB3b3JrIGFscmVhZHkgYXV0aG9yaXplZDogY3JlZGl0Ci8vIGFscmVhZHkgZHJhd24gaW50byB0aGUgbGVkZ2VyIGlzIHRoZSBkZWxlZ2F0ZSdzLCBhbmQgUmV2b2tlIGRvZXMgbm90Ci8vIGNsYXcgaXQgYmFjay4gUmV2b2tpbmcgYSBncmFudCBlbmRzIGZ1dHVyZSBhdXRob3JpdHkgb25seS4KLy8KLy8gIyBUSEUgRkVFLCBwcmVjaXNlbHkKLy8KLy8gZmVlQnBzIGlzIHNuYXBzaG90dGVkIGludG8gdGhlIGdyYW50IGF0IEdyYW50IHRpbWUgZnJvbSB0aGUKLy8gY29tcGlsZS10aW1lIERyYXdGZWVCcHMsIHNvIGEgZGVsZWdhdGUncyB0ZXJtcyBhcmUgZml4ZWQgd2hlbiB0aGUKLy8gZ3JhbnQgaXMgY3JlYXRlZCBhbmQgdmlzaWJsZSBpbiBHcmFudEluZm8gZnJvbSB0aGF0IG1vbWVudC4gVGhlIGZlZSBpcwovLyBjaGFyZ2VkIE9OQ0UgcGVyIGRyYXcsIG9uIHRoZSBncm9zcyBhbW91bnQsIHdpdGggZmVlbGVkZ2VyJ3MgZmxvb3IKLy8gcm91bmRpbmcgKHJvdW5kaW5nIGZhdm9ycyB0aGUgZGVsZWdhdGUpLiBUaGUgb3duZXIncyBwb29sIGlzIGRlYml0ZWQKLy8gdGhlIEdST1NTIGFtb3VudCBhbmQgdGhlIGRlbGVnYXRlIGlzIGNyZWRpdGVkIHRoZSBuZXQg4oCUIHRoZSBmZWUgaXMKLy8gcGFpZCBieSB0aGUgb3duZXIgb3V0IG9mIHRoZSBidWRnZXQsIG5vdCB0YWtlbiBvdXQgb2YgdGhlIGRlbGVnYXRlJ3MKLy8gYXV0aG9yaXR5LCBzbyBhIGdyYW50IG9mIFBlclBlcmlvZCBtZWFucyBQZXJQZXJpb2Qgb2YgdGhlIG93bmVyJ3MKLy8gbW9uZXkgbGVhdmVzIHRoZSBwb29sIHBlciB3aW5kb3csIHdoaWNoIGlzIHRoZSBmaWd1cmUgYW4gb3duZXIKLy8gYWN0dWFsbHkgY2FyZXMgYWJvdXQgYm91bmRpbmcuIFRoZSBsZWRnZXIgaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUKLy8gY29tcGlsZS10aW1lIE1heEZlZUJwcyBjYXAsIHNvIGEgZmVlIGFib3ZlIHRoZSBjYXAgaXMgcmVmdXNlZCBieSB0aGUKLy8gcHJpbWl0aXZlLCBub3QgYnkgYSBjaGVjayBpbiB0aGlzIGZpbGUuIFRoZXJlIGlzIG5vIGZlZSBvbiBmdW5kaW5nLCBvbgovLyB3aXRoZHJhd2luZyBhbiB1bnNwZW50IHBvb2wsIG9yIG9uIGNsYWltaW5nLgovLwovLyAjIFRIRVJFIElTIE5PIEFETUlOCi8vCi8vIFRoZSBmZWUgcmF0ZSwgdGhlIGZlZSBjb2xsZWN0b3IsIGV2ZXJ5IGJvdW5kIGFuZCBldmVyeSBjYXAgYXJlCi8vIGNvbXBpbGUtdGltZSBjb25zdGFudHMuIE5vIGFkZHJlc3MgY2FuIGNoYW5nZSB0ZXJtcywgcGF1c2UgdGhlIHJlYWxtLAovLyB0b3VjaCBhIHBvb2wgaXQgZGlkIG5vdCBmdW5kLCBvciBtb3ZlIGEgZ3JhbnQgaXQgZGlkIG5vdCBjcmVhdGUuIFRoZQovLyBkZXBsb3llciBoYXMgbm8gcHJpdmlsZWdlIG9mIGFueSBraW5kIGFmdGVyIGRlcGxveW1lbnQuCi8vCi8vICMgTU9ORVRBUlkgSU5WQVJJQU5UIChjb25zZXJ2YXRpb24pCi8vCi8vIExldCBIIGJlIHRoZSB1Z25vdCBoZWxkIGF0IHRoaXMgcmVhbG0ncyBhZGRyZXNzLCBQIHRoZSBzdW0gb2YgYWxsCi8vIG93bmVyIHBvb2xzICh0cmFja2VkIE8oMSkgYXMgdG90YWxQb29sZWQpLCBMIHRoZSBsZWRnZXIncyBsaWFiaWxpdGllcwovLyAodW5jbGFpbWVkIGRlbGVnYXRlIGNyZWRpdCBwbHVzIHRoZSBmZWUgcG90KSwgYW5kIFMgPj0gMCB0aGUKLy8gb3V0LW9mLWJhbmQgc3VycGx1czoKLy8KLy8JSCA9PSBQICsgTCArIFMKLy8KLy8gRXZlcnkgdHJhbnNpdGlvbiBtb3ZlcyB2YWx1ZSBiZXR3ZWVuIGV4YWN0bHkgdHdvIHRlcm1zIGluc2lkZSBvbmUKLy8gdHJhbnNhY3Rpb24uIEZ1bmQgcmFpc2VzIEggYW5kIFAgdG9nZXRoZXIgKGNvaW5pby5SZWNlaXZlIGlzIHRoZQovLyByZWNlaXB0LWd1YXJhbnRlZWQgc2hhcGUpLiBXaXRoZHJhd1Bvb2wgZGViaXRzIFAgYmVmb3JlIHRoZSBpZGVudGljYWwKLy8gYW1vdW50IGxlYXZlcyBILiBEcmF3IG1vdmVzIGdyb3NzIG91dCBvZiBQIGFuZCBpbnRvIEwsIHNwbGl0IGludG8gdGhlCi8vIGRlbGVnYXRlJ3MgY3JlZGl0IGFuZCB0aGUgZmVlIOKAlCBIIGRvZXMgbm90IG1vdmUgYXQgYWxsLCB3aGljaCBpcyB3aHkKLy8gRHJhdyBoYXMgbm8gcGF5b3V0IHRvIGZhaWwuIENsYWltIGFuZCBXaXRoZHJhd0ZlZXMgZGViaXQgTCBiZWZvcmUKLy8gdGhlaXIgcGF5b3V0LiBBbnkgcGFuaWMgYWJvcnRzIHRoZSB3aG9sZSB0cmFuc2FjdGlvbjsgdGhpcyByZWFsbSBuZXZlcgovLyBpc3N1ZXMgb3IgcmVtb3ZlcyBjb2lucy4KLy8KLy8gIyBPTkxZIEdOT1QgSVMgQUNDRVBURUQKLy8KLy8gRnVuZCByZWplY3RzIGFueSBlbnZlbG9wZSB0aGF0IGlzIG5vdCBleGFjdGx5IG9uZSBwb3NpdGl2ZSB1Z25vdCBjb2luCi8vIChjb2luaW8uUmVjZWl2ZSkuIEV2ZXJ5IG90aGVyIGVudHJ5cG9pbnQgcmVqZWN0cyBhdHRhY2hlZCBjb2lucwovLyBvdXRyaWdodCByYXRoZXIgdGhhbiBjb252ZXJ0aW5nIHRoZW0gaW50byBzd2VlcGFibGUgc3VycGx1cy4KLy8KLy8gIyBBVVRIT1JJWkFUSU9OCi8vCi8vIEV2ZXJ5IGlkZW50aXR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgY3Jvc3NpbmcgZW50cnlwb2ludCdzCi8vIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKS4gTm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIgaWRlbnRpdHkgYXMgYQovLyBwYXJhbWV0ZXIsIHNvIGZ1bmRpbmcgYW5vdGhlciBvd25lcidzIHBvb2wsIGRyYXdpbmcgYW5vdGhlciBkZWxlZ2F0ZSdzCi8vIGJ1ZGdldCwgY2xhaW1pbmcgYW5vdGhlciBkZWxlZ2F0ZSdzIGNyZWRpdCwgb3IgYW1lbmRpbmcgYSBncmFudCB5b3UgZG8KLy8gbm90IG93biBpcyBpbXBvc3NpYmxlIGJ5IGNvbnN0cnVjdGlvbi4gVGhpcyBpcyBzcGVuZGJvb2sgY29uc3VtZXIKLy8gY29udHJhY3QgaXRlbSAyLCBjbG9zZWQgc3RydWN0dXJhbGx5LgovLwovLyBUaGUgY2xvY2sgaXMgcnVudGltZS5DaGFpbkhlaWdodCgpLCBuZXZlciBhbiBhcmd1bWVudC4gVGhhdCBpcwovLyBzcGVuZGJvb2sgY29uc3VtZXIgY29udHJhY3QgaXRlbSAxOiBhIHJlYWxtIHRoYXQgbGV0IGEgY2FsbGVyIGNob29zZQovLyBgbm93YCB3b3VsZCBoYXZlIGhhbmRlZCB0aGUgZGVsZWdhdGUgdGhlIHBvd2VyIHRvIHJvbGwgdGhlIHdpbmRvdyBhdAovLyB3aWxsLCBkZWZlYXRpbmcgZXZlcnkgY2FwIGluIHRoZSBwcmltaXRpdmUuCi8vCi8vICMgU1RPUkFHRQovLwovLyBBIHBvb2wgZW50cnkgaXMgcGFpZCBmb3IgYnkgdGhlIG93bmVyJ3Mgb3duIGZ1bmRpbmcgdHJhbnNhY3Rpb247IGEKLy8gZ3JhbnQgcmVjb3JkIGFuZCBpdHMgYWxsb3dhbmNlIGJ5IHRoZSBvd25lcidzIEdyYW50LiBSZXZva2UgYW5kIFJlYXAKLy8gYm90aCByZW1vdmUgdGhlIGdyYW50IHJlY29yZCBhbmQgdGhlIGFsbG93YW5jZSBpbiB0aGUgc2FtZSBjYWxsLCBhbmQKLy8gdGhlIGNoYWluIHJlZnVuZHMgdGhlIGZyZWVkIHN0b3JhZ2UgZGVwb3NpdCB0byB0aGUgdHJhbnNhY3Rpb24gdGhhdAovLyBmcmVlcyBpdCDigJQgd2hpY2ggaXMgdGhlIHN0YW5kaW5nIGluY2VudGl2ZSB0byBjYWxsIFJlYXAgb24gc29tZW9uZQovLyBlbHNlJ3MgZXhwaXJlZCBncmFudC4KcGFja2FnZSBidWRnZXRzCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvY29pbmlvIgoJImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9mZWVsZWRnZXIiCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NwZW5kYm9vayIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBSZWFsbVBhdGggaXMgdGhpcyByZWFsbSdzIG93biBwYXRoLCB1c2VkIHRvIGJ1aWxkIFJlbmRlciBsaW5rcy4KY29uc3QgUmVhbG1QYXRoID0gIi9yL2cxcXA1cHQ4Y2RxMmY2a2ZkYW1uM3l1eHdnNnF1cW5mcHlld3p6MzkvYnVkZ2V0cyIKCi8vIERlbm9tIGlzIHRoZSBvbmx5IGFzc2V0IHRoaXMgcmVhbG0gaG9sZHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIGNlaWxpbmcgb24gYW55IGRyYXcgZmVlIHRoaXMgcmVhbG0gY291bGQgZXZlcgovLyBjaGFyZ2UsIGVuZm9yY2VkIGJ5IHRoZSBmZWVsZWRnZXIgdGhlIHJlYWxtIGlzIGNvbnN0cnVjdGVkIHdpdGgg4oCUIGEKLy8gZmVlQnBzIGFib3ZlIGl0IGlzIHJlZnVzZWQgYnkgdGhlIHByaW1pdGl2ZSdzIG93biB2YWxpZGF0aW9uLCBub3QgYnkgYQovLyBjaGVjayBpbiB0aGlzIGZpbGUuIDUwMCBicHMgPSA1JS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoNTAwKQoKLy8gRHJhd0ZlZUJwcyBpcyB0aGUgZmVlIGFjdHVhbGx5IHNuYXBzaG90dGVkIGludG8gZXZlcnkgZ3JhbnQ6IDEwMCBicHMgPQovLyAxJSwgY2hhcmdlZCBvbmNlIHBlciBkcmF3IG9uIHRoZSBncm9zcyBhbW91bnQsIGZsb29yLXJvdW5kZWQgaW4gdGhlCi8vIGRlbGVnYXRlJ3MgZmF2b3IuIFRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBsaXZlIGZlZSBpbiB0aGlzIHBvcnRmb2xpbwovLyAoZmVlX3NwbGl0LCBjcm93ZGZ1bmQpIGlzIGFsc28gMSUuCmNvbnN0IERyYXdGZWVCcHMgPSBpbnQ2NCgxMDApCgovLyBGZWVDb2xsZWN0b3IgcmVjZWl2ZXMgd2l0aGRyYXduIGZlZXMgYW5kIHN3ZXB0IHN1cnBsdXMuIENvbXBpbGUtdGltZQovLyBjb25zdGFudDogdGhlcmUgaXMgbm8gc2V0dGVyIGFuZCBubyB0cmFuc2ZlciBwYXRoLiBJdCBpcyB0aGUgZGVwbG95aW5nCi8vIG5hbWVzcGFjZSdzIGFkZHJlc3Mg4oCUIHN0YXRlZCBwbGFpbmx5OiB0aGUgb3BlcmF0b3Igb2YgdGhpcyByZWFsbS4KY29uc3QgRmVlQ29sbGVjdG9yID0gYWRkcmVzcygiZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOSIpCgovLyBNaW5GdW5kaW5nIGtlZXBzIGR1c3QgcG9vbHMgb3V0OiAxIEdOT1QgcGVyIEZ1bmQgY2FsbC4KY29uc3QgTWluRnVuZGluZyA9IGludDY0KDFfMDAwXzAwMCkKCi8vIE1pblBlclBlcmlvZCBpcyB0aGUgc21hbGxlc3QgcGVyLXdpbmRvdyBjYXAgYSBncmFudCBtYXkgY2FycnkuIEl0Ci8vIGV4aXN0cyBzbyBhIGdyYW50IGNhbm5vdCBiZSBjcmVhdGVkIHRoYXQgbm8gZHJhdyBjb3VsZCBldmVyIHNhdGlzZnksCi8vIGFuZCBpdCBpcyB0aGUgT05MWSBsb3dlciBib3VuZCBpbiB0aGUgZHJhdyBwYXRoIOKAlCB0aGVyZSBpcwovLyBkZWxpYmVyYXRlbHkgbm8gbWluaW11bSBEcmF3IGFtb3VudCwgYmVjYXVzZSBhIG1pbmltdW0gZHJhdyBhYm92ZSBhCi8vIGdyYW50J3MgUGVyUGVyaW9kIHdvdWxkIG1ha2UgdGhlIGdyYW50IHNpbGVudGx5IHVuZHJhd2FibGUuCmNvbnN0IE1pblBlclBlcmlvZCA9IGludDY0KDFfMDAwKQoKLy8gTWluUGVyaW9kQmxvY2tzIGlzIHRoZSBzaG9ydGVzdCByb2xsaW5nIHdpbmRvdyBhIGdyYW50IG1heSB1c2UuIEEKLy8gd2luZG93IG9mIGEgaGFuZGZ1bCBvZiBibG9ja3MgaXMgYSByYXRlLCBub3QgYSBidWRnZXQsIGFuZCBpdCBtYWtlcwovLyBQZXJQZXJpb2QgbWVhbmluZ2xlc3MgYXMgYSBib3VuZCBvbiB3b3JzdC1jYXNlIGxvc3MuIEEgcGVyaW9kTGVuZ3RoIG9mCi8vIDAgaXMgc3RpbGwgYWNjZXB0ZWQgYW5kIG1lYW5zIE9ORSBMSUZFVElNRSBXSU5ET1cgdGhhdCBuZXZlciByZWZpbGxzCi8vIChzcGVuZGJvb2sncyBvd24gc2VtYW50aWNzKS4KY29uc3QgTWluUGVyaW9kQmxvY2tzID0gaW50NjQoMTAwKQoKLy8gTWF4TGl2ZUdyYW50cyBjYXBzIHNpbXVsdGFuZW91c2x5IGxpdmUgZ3JhbnRzLCB2aWEgc3BlbmRib29rJ3Mgb3duCi8vIGNvbnN0cnVjdGlvbiBib3VuZC4gR3JhbnQgaXMgcGVybWlzc2lvbmxlc3MgdG8gYW55b25lIHdpdGggYSBmdW5kZWQKLy8gcG9vbCwgc28gdGhlIGNhcCBpcyBleGhhdXN0aWJsZSBpbiBwcmluY2lwbGUsIGFuZCB0aGF0IEFWQUlMQUJJTElUWQovLyBCT1VORCBpcyBkb2N1bWVudGVkIHJhdGhlciB0aGFuIGhpZGRlbi4KLy8KLy8gSXQgaXMgZG9jdW1lbnRlZCBoZXJlIGluIGl0cyBDT1JSRUNURUQgZm9ybS4gQW4gZWFybGllciB2ZXJzaW9uIG9mCi8vIHRoaXMgY29tbWVudCBjbGFpbWVkIHRoZSBtaXRpZ2F0aW9uIHdhcyAiTWF4R3JhbnRzUGVyT3duZXIgcGx1cyB0aGUKLy8gY29zdCBvZiBiZWNvbWluZyBhbiBvd25lciBhdCBhbGwgKE1pbkZ1bmRpbmcgcGVyIHBvb2wpLCBhbmQgUmVhcCBpcwovLyBwZXJtaXNzaW9ubGVzcyBzbyBleHBpcmVkIGdyYW50cyBjYW5ub3QgYWNjdW11bGF0ZSIuIEFuIGFkdmVyc2FyaWFsCi8vIGF1ZGl0IChmaW5kaW5nIFkxLCBESVNDT1ZFUlkubWQgwqcgOSkgc2hvd2VkIEJPVEggSEFMVkVTIHdlcmUgZmFsc2UuIEEKLy8gd3JvbmcgbWl0aWdhdGlvbiBpcyB3b3JzZSB0aGFuIGFuIGFja25vd2xlZGdlZCBib3VuZCwgYmVjYXVzZSBhIHJlYWRlcgovLyBzaXplcyB0aGUgcmlzayBmcm9tIGl0IGFuZCBzdG9wcyBsb29raW5nOgovLwovLyAgIC0gTWluRnVuZGluZyBpcyBOT1QgYSBjYXBpdGFsIGJvdW5kLiBUaGUgZnVuZGVkLXBvb2wgcmVxdWlyZW1lbnQgaXMKLy8gICAgIGNoZWNrZWQgYXQgR3JhbnQgdGltZSBvbmx5LCBhbmQgV2l0aGRyYXdQb29sIGhhcyBubyBsb2NrLCBzbyBvbmUKLy8gICAgIGFkZHJlc3MgZnVuZHMgYSBwb29sLCBvcGVucyBNYXhHcmFudHNQZXJPd25lciBncmFudHMsIHdpdGhkcmF3cwovLyAgICAgdGhlIHBvb2wgaW4gZnVsbCwgYW5kIHRoZSBncmFudHMgc3Vydml2ZSBob2xkaW5nIHRoZWlyIHNsb3RzLgovLyAgICAgVGVzdE93bmVyQ2FuQWx3YXlzTGVhdmUgcGlucyBleGFjdGx5IHRoYXQgc2VxdWVuY2UsIGFzIGludGVuZGVkCi8vICAgICBiZWhhdmlvciDigJQgdGhlIGF0dGFjayBpcyBidWlsdCBvdXQgb2YgYSBkb2N1bWVudGVkIGZlYXR1cmUuCi8vICAgLSBSZWFwIGlzIGluZXJ0IGFnYWluc3QgaXQuIFJlYXAgcmVxdWlyZXMgc3BlbmRib29rJ3MgSXNFeHBpcmVkLAovLyAgICAgd2hpY2ggaXMgbmV2ZXIgdHJ1ZSBmb3IgZXhwaXJlc0F0ID09IDAsIHNvIGFuIGF0dGFja2VyIG9taXRzIHRoZQovLyAgICAgZXhwaXJ5IGFuZCBubyB0aGlyZCBwYXJ0eSBjYW4gcmVtb3ZlIHRoZSBncmFudC4KLy8KLy8gV2hhdCB0aGUgY29zdCBBQ1RVQUxMWSBpczogZ2FzIGZvciBvbmUgRnVuZCwgTWF4R3JhbnRzUGVyT3duZXIgR3JhbnRzCi8vIGFuZCBvbmUgV2l0aGRyYXdQb29sQWxsIHBlciBhZGRyZXNzIOKAlCBhYm91dCBNYXhMaXZlR3JhbnRzKjE3LzE2Ci8vIHRyYW5zYWN0aW9ucyB0byBmaWxsIHRoZSBjYXAg4oCUIHBsdXMgdGhlIHN0b3JhZ2UgZGVwb3NpdCBvbiBldmVyeSBncmFudAovLyByZWNvcmQsIHdoaWNoIHRoZSBjaGFpbiBob2xkcyBmb3IgYXMgbG9uZyBhcyB0aGUgZ3JhbnQgZG9lcyBhbmQKLy8gcmVmdW5kcyBvbmx5IHdoZW4gaXQgaXMgcmVtb3ZlZC4gVGhhdCBpcyByZWFsIGFuZCB1bnJlY292ZXJhYmxlIHdoaWxlCi8vIHRoZSBncmllZiBsYXN0cy4gSXQgaXMgbm90IHRoZSBsb2NrZWQgcG9vbCBjYXBpdGFsIHRoZSBvbGQgY29tbWVudAovLyBwcm9taXNlZCwgYW5kIGl0IGlzIHByaWNlZCBpbiBnYXMgYW5kIHN0b3JhZ2UgcmF0aGVyIHRoYW4gaW4gY2FwaXRhbC4KLy8KLy8gTm8gY2FwaXRhbCBib3VuZCB3YXMgYWRkZWQsIGJlY2F1c2UgdGhlIG9idmlvdXMgb25lIGRvZXMgbm90IHdvcmsuCi8vIFJlcXVpcmluZyBhbiBvd25lciB3aXRoIGxpdmUgZ3JhbnRzIHRvIHJldGFpbiBNaW5GdW5kaW5nIGlzIGRlZmVhdGVkCi8vIGZvciB0aGUgcHJpY2Ugb2YgdGhlIGRyYXcgZmVlOiBub3RoaW5nIGZvcmJpZHMgZ3JhbnRpbmcgdG8gWU9VUlNFTEYsCi8vIHNvIHRoZSBhdHRhY2tlciBkcmF3cyBpdHMgb3duIHBvb2wgdG8gemVybyB0aHJvdWdoIGl0cyBvd24gZ3JhbnQgYW5kCi8vIENsYWltcyB0aGUgY3JlZGl0IGJhY2ssIHJlY292ZXJpbmcgYWxsIGJ1dCBEcmF3RmVlQnBzIG9mIGl0IHdoaWxlIHRoZQovLyByZXRlbnRpb24gcnVsZSBzdGlsbCByZWFkcyBhcyBzYXRpc2ZpZWQuIENsb3NpbmcgVEhBVCB3b3VsZCBtZWFuCi8vIGJvdW5kaW5nIERyYXcgYmVsb3cgTWluRnVuZGluZyDigJQgdGhlIHJlYWxtIHJlZnVzaW5nIHRvIGxldCBhIGRlbGVnYXRlCi8vIHNwZW5kIHRoZSBidWRnZXQsIHdoaWNoIGlzIHRoZSBmZWF0dXJlLiBUaGUgcmVtYWluaW5nIGFsdGVybmF0aXZlLCBhCi8vIG5vbi1yZWZ1bmRhYmxlIHBlci1ncmFudCBmZWUsIHRheGVzIGV2ZXJ5IGhvbmVzdCBvd25lciB0byBwcmljZSBhCi8vIGdyaWVmLCBhbmQgYXQgYSBmZWUgaGlnaCBlbm91Z2ggdG8gZGV0ZXIgb25lIGl0IGlzIGEgdGVudGggb2YKLy8gTWluRnVuZGluZyBwZXIgZ3JhbnQuCi8vCi8vIFRoZSBibGFzdCByYWRpdXMgaXMgbmFycm93IGFuZCB0aGF0IGlzIHRoZSByZWFzb24gdGhpcyBpcyBkaXNjbG9zZWQKLy8gcmF0aGVyIHRoYW4gcmVkZXNpZ25lZDogYSBmdWxsIGJvb2sgYmxvY2tzIE5FVyBncmFudHMgb25seS4gRXZlcnkKLy8gZXhpc3RpbmcgZ3JhbnQsIHBvb2wsIGRyYXcsIGNyZWRpdCBhbmQgY2xhaW0ga2VlcHMgd29ya2luZywgbm8gdmFsdWUKLy8gaXMgYXQgcmlzaywgYW5kIGFueSBvd25lciBjYW4gZnJlZSB0aGVpciBvd24gc2xvdHMgd2l0aCBSZXZva2UuCi8vCi8vIFRoZSBmaWd1cmUgd2FzIDEwMjQgdW50aWwgdGhhdCBhdWRpdCwgYW5kIDEwMjQgd2FzIGNvbnNlcnZhdGl2ZSByYXRoZXIKLy8gdGhhbiBtZWFzdXJlZDogbm90aGluZyBpbiB0aGlzIHJlYWxtIGl0ZXJhdGVzIHRoZSBib29rIChSZW5kZXIgaXMKLy8gYm91bmRlZCBieSBNYXhSZW5kZXJSb3dzLCBldmVyeSB3cml0ZSBwYXRoIGlzIGEgc2luZ2xlIGF2bCBsb29rdXApIGFuZAovLyBhIGdyYW50IHJlY29yZCdzIHN0b3JhZ2UgaXMgcGFpZCBmb3IgYnkgd2hvZXZlciBjcmVhdGVzIGl0LgovLyBRdWFkcnVwbGluZyBpdCBxdWFkcnVwbGVzIHRoZSBjb3N0IG9mIGZpbGxpbmcgdGhlIGNhcCBhbmQgY29zdHMgYW4KLy8gaG9uZXN0IG93bmVyIG5vdGhpbmcuIHNwZW5kYm9vaydzIG93biBNYXhMaXZlTGltaXQgaXMgMTAwMDAuCmNvbnN0IE1heExpdmVHcmFudHMgPSA0MDk2CgovLyBNYXhHcmFudHNQZXJPd25lciBib3VuZHMgaG93IG11Y2ggb2YgdGhlIGdsb2JhbCBjYXAgb25lIG93bmVyIGNhbgovLyBvY2N1cHkuIHNwZW5kYm9vaydzIG93biBwYWNrYWdlIGRvY3VtZW50YXRpb24gbmFtZXMgdGhpcyBhcyB0aGUgZ2FwIGEKLy8gY29uc3VtaW5nIHJlYWxtIG11c3QgY2xvc2Ug4oCUICJtYXhMaXZlIGlzIGEgc2luZ2xlIGdsb2JhbCBmaWd1cmUsIHNvCi8vIGFueSBvd25lciBwZXJtaXR0ZWQgdG8gT3BlbiBjYW4gZXhoYXVzdCBpdCBhbmQgbG9jayBvdXQgdGhlIHJlc3Qg4oCmCi8vIHRoZSBjb25zdW1pbmcgcmVhbG0gZGVjaWRlcyB3aG8gbWF5IE9wZW4sIGFuZCBhIEJvb2sgc2hhcmVkIGFjcm9zcwovLyBtdXR1YWxseSB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24gdG9wIG9mIHRoaXMKLy8gb25lLiIgVGhpcyBpcyB0aGF0IGNhcC4gKHBlcm1pc3Npb25fcmVnaXN0cnkgZmluZGluZyBSMSBpcyB0aGUgc2FtZQovLyBsZXNzb24gZnJvbSB0aGlzIHBvcnRmb2xpbydzIG93biBoaXN0b3J5LikKY29uc3QgTWF4R3JhbnRzUGVyT3duZXIgPSBpbnQ2NCgxNikKCi8vIE1heExhYmVsTGVuIGJvdW5kcyB0aGUgZ3JhbnQncyBmcmVlLXRleHQgbGFiZWwsIHdoaWNoIGlzIHNhbml0aXplZAovLyBiZWZvcmUgcmVhY2hpbmcgbWFya2Rvd24uCmNvbnN0IE1heExhYmVsTGVuID0gNjQKCi8vIE1heFJlbmRlclJvd3MgYm91bmRzIHRoZSBncmFudCBsaXN0IG9uIHRoZSBpbmRleCBwYWdlLgpjb25zdCBNYXhSZW5kZXJSb3dzID0gMjAKCnR5cGUgZ3JhbnQgc3RydWN0IHsKCWlkICAgICAgICBpbnQ2NAoJb3duZXIgICAgIGFkZHJlc3MKCXNwZW5kZXIgICBhZGRyZXNzCglhbGxvd0lEICAgdWludDY0IC8vIHRoZSBzcGVuZGJvb2sgYWxsb3dhbmNlIGJhY2tpbmcgdGhpcyBncmFudAoJZmVlQnBzICAgIGludDY0ICAvLyBzbmFwc2hvdHRlZCBhdCBHcmFudAoJbGFiZWwgICAgIHN0cmluZwoJY3JlYXRlZEF0IGludDY0CgoJZHJhd24gaW50NjQgLy8gbGlmZXRpbWUgZ3Jvc3MgZHJhd24gdW5kZXIgdGhpcyBncmFudAoJZHJhd3MgaW50NjQgLy8gbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgZHJhd3MKfQoKdmFyICgKCXNlbGYgYWRkcmVzcwoKCS8vIGdyYW50cyBob2xkcyBvbmUgcmVjb3JkIHBlciBsaXZlIGdyYW50LiBSZXZva2UgYW5kIFJlYXAgcmVtb3ZlIHRoZQoJLy8gcmVjb3JkOyBpZHMgYXJlIG5ldmVyIHJldXNlZC4KCWdyYW50cyA9IGF2bC5OZXdUcmVlKCkgLy8gcGFkSUQoaWQpIC0+ICpncmFudAoJbmV4dElEIGludDY0CgoJLy8gcG9vbHMgaXMgZWFjaCBvd25lcidzIHVuc3BlbnQgZnVuZGVkIGJhbGFuY2U6CgkvLyBhZGRyZXNzIHN0cmluZyAtPiBpbnQ2NCAoPiAwKS4gVGhpcyBpcyB0aGUgUCB0ZXJtLgoJcG9vbHMgPSBhdmwuTmV3VHJlZSgpCgoJLy8gb3BlbkJ5T3duZXIgdHJhY2tzIGVhY2ggb3duZXIncyBsaXZlIGdyYW50IGNvdW50OgoJLy8gYWRkcmVzcyBzdHJpbmcgLT4gaW50NjQgKD4gMCkuCglvcGVuQnlPd25lciA9IGF2bC5OZXdUcmVlKCkKCgkvLyB0b3RhbFBvb2xlZCBpcyB0aGUgUCB0ZXJtIG9mIEggPT0gUCArIEwgKyBTLCBtYWludGFpbmVkIE8oMSkuCgl0b3RhbFBvb2xlZCBpbnQ2NAoKCS8vIGxpZmV0aW1lIGNvdW50ZXJzLCByZW5kZXJlZCBmb3Igb3BlcmF0b3JzLgoJbGlmZXRpbWVGdW5kZWQgICBpbnQ2NAoJbGlmZXRpbWVEcmF3biAgICBpbnQ2NCAvLyBncm9zcywgYmVmb3JlIHRoZSBmZWUKCWxpZmV0aW1lQ2xhaW1lZCAgaW50NjQgLy8gbmV0LCBwYWlkIHRvIGRlbGVnYXRlcwoJbGlmZXRpbWVSZXR1cm5lZCBpbnQ2NCAvLyB1bnNwZW50IHBvb2wgd2l0aGRyYXduIGJ5IG93bmVycwoKCS8vIGxlZGdlciBob2xkcyBlYWNoIGRlbGVnYXRlJ3MgdW5jbGFpbWVkIGNyZWRpdCBhbmQgdGhlIGZlZSBwb3QuIEl0cwoJLy8gTGlhYmlsaXRpZXMoKSBpcyB0aGUgTCB0ZXJtIGFuZCB0aGUgcmVzZXJ2ZSBTd2VlcFN1cnBsdXMgcHJvdGVjdHMuCglsZWRnZXIgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCgoJLy8gYm9vayBob2xkcyBvbmUgbGl2ZSBhbGxvd2FuY2UgcGVyIGxpdmUgZ3JhbnQuIEV2ZXJ5IGJvdW5kIG9uCgkvLyBhdXRob3JpdHkg4oCUIHdpbmRvd3MsIGNhcHMsIGV4cGlyeSwgYW1lbmRtZW50IGRpcmVjdGlvbiDigJQgaXMgdGhlCgkvLyBwcmltaXRpdmUncywgbm90IHRoaXMgZmlsZSdzLgoJYm9vayA9IHNwZW5kYm9vay5NdXN0TmV3KE1heExpdmVHcmFudHMpCikKCmZ1bmMgaW5pdCgpIHsKCXNlbGYgPSB1bnNhZmUuQ3VycmVudFJlYWxtKCkuQWRkcmVzcygpCn0KCi8vIHJlamVjdFN0cmF5U2VuZCBhYm9ydHMgd2hlbiBjb2lucyBhcmUgYXR0YWNoZWQgdG8gYSBub24tcGF5YWJsZSBjYWxsLgovLyBUaGlzIHJlYWxtIGhvbGRzIGZ1bmRzLCBzbyBhIHN0cmF5IHNlbmQgd291bGQgYmVjb21lIHN3ZWVwYWJsZQovLyBzdXJwbHVzLCBzaWxlbnRseSBjb252ZXJ0aW5nIGEgdXNlcidzIGNvaW5zIGludG8gb3BlcmF0b3IgZnVuZHMuCi8vIEFib3J0aW5nIHJldmVydHMgdGhlIHRyYW5zZmVyIGluc3RlYWQuIEd1YXJkZWQgb24gSXNVc2VyQ2FsbCwgbm90Ci8vIElzVXNlciwgYmVjYXVzZSBhIE1zZ1J1biBlcGhlbWVyYWwgY2FuIGNvbnN1bWUgdGhlIE9yaWdpblNlbmQgZW52ZWxvcGUKLy8gYmVmb3JlIGZvcndhcmRpbmcgY29udHJvbDsgZm9yIGEgcmVhbG0tcm91dGVkIGNhbGwgdGhlIGVudmVsb3BlIGxhbmRzCi8vIGF0IHRoZSBpbnRlcm1lZGlhcnksIHNvIHRoZXJlIGlzIG5vdGhpbmcgaGVyZSB0byByZWplY3QgYW5kIHRoZSBndWFyZAovLyBkZWxpYmVyYXRlbHkgZmFpbHMgb3BlbiAoY3Jvd2RmdW5kIGFuZCB0cmVhc3VyeV9ib2FyZCBkb2N1bWVudCB0aGUKLy8gc2FtZSBzY29wZSkuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJLy8gRXZlcnkgY2FsbCBzaXRlIGZvcndhcmRzIGEgY3Jvc3NpbmcgZW50cnlwb2ludCdzIG93biBsaXZlIGN1ciwKCQkvLyBzbyB0aGlzIGNhbm5vdCBmaXJlIHRvZGF5OyBpdCBleGlzdHMgc28gYSBmdXR1cmUgcmVmYWN0b3IgdGhhdAoJCS8vIGhhbmRzIHRoaXMgZ3VhcmQgYSBzdGFsZSByZWFsbSB2YWx1ZSBmYWlscyBjbG9zZWQsIG5vdCBvcGVuCgkJLy8gKGNvaW5pbyBuYW1lcyBJc0N1cnJlbnQgYXMgdGhlIGd1YXJkIHNlY29uZGFyeSByZWFsbQoJCS8vIHBhcmFtZXRlcnMgcmVxdWlyZSwgYW5kIHRoaXMgaGVscGVyIGZvbGxvd3MgdGhhdCBkaXNjaXBsaW5lKS4KCQlwYW5pYygiYnVkZ2V0czogcmVhbG0gY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgZW50cnlwb2ludCBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyAtLS0gdGhlIHBvb2wgLS0tCgovLyBGdW5kIGFkZHMgdGhlIGF0dGFjaGVkIGNvaW5zIHRvIHRoZSBjYWxsZXIncyBvd24gcG9vbC4gRGlyZWN0IEVPQQovLyBjYWxscyB3aXRoIC1zZW5kIG9ubHkgKHRoZSByZWNlaXB0LWd1YXJhbnRlZWQgc2hhcGUpOyBleGFjdGx5IG9uZQovLyBwb3NpdGl2ZSB1Z25vdCBjb2luLCBhdCBsZWFzdCBNaW5GdW5kaW5nLiBBbnlvbmUgbWF5IGZ1bmQ7IGZ1bmRpbmcgaXMKLy8gd2hhdCBtYWtlcyBhbiBhZGRyZXNzIGFuIG93bmVyLgpmdW5jIEZ1bmQoY3VyIHJlYWxtKSBpbnQ2NCB7Cglvd25lciwgYW1vdW50IDo9IGNvaW5pby5SZWNlaXZlKDAsIGN1ciwgRGVub20pCglpZiBhbW91bnQgPCBNaW5GdW5kaW5nIHsKCQlwYW5pYygiZnVuZCBhdCBsZWFzdCAiICsgaXRvYShNaW5GdW5kaW5nKSArIERlbm9tKQoJfQoJa2V5IDo9IG93bmVyLlN0cmluZygpCgoJbmV3UG9vbCwgb2sgOj0gY2hlY2tlZEFkZChwb29sT2Yoa2V5KSwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygicG9vbCB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdUb3RhbCwgb2sgOj0gY2hlY2tlZEFkZCh0b3RhbFBvb2xlZCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygidG90YWwgcG9vbGVkIHdvdWxkIG92ZXJmbG93IikKCX0KCW5ld0xpZmV0aW1lLCBvayA6PSBjaGVja2VkQWRkKGxpZmV0aW1lRnVuZGVkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBmdW5kZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoKCXNldFBvb2woa2V5LCBuZXdQb29sKQoJdG90YWxQb29sZWQgPSBuZXdUb3RhbAoJbGlmZXRpbWVGdW5kZWQgPSBuZXdMaWZldGltZQoKCWNoYWluLkVtaXQoIkZ1bmRlZCIsICJvd25lciIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG9vbCIsIGl0b2EobmV3UG9vbCkpCglyZXR1cm4gbmV3UG9vbAp9CgovLyBXaXRoZHJhd1Bvb2wgcmV0dXJucyBwYXJ0IG9mIHRoZSBjYWxsZXIncyB1bnNwZW50IHBvb2wgYW5kIHJlcG9ydHMgdGhlCi8vIHBvb2wgUkVNQUlOSU5HIGFmdGVyd2FyZHMuIFRoZXJlIGlzIG5vIGxvY2sgYW5kIG5vIGNoZWNrIGFnYWluc3QKLy8gb3V0c3RhbmRpbmcgZ3JhbnRzOiB0aGUgbW9uZXkgaXMgdGhlIG93bmVyJ3MsIGFuZCBhIGRlbGVnYXRlJ3MKLy8gYXV0aG9yaXR5IGlzIG5vdCBhIGNsYWltIG9uIGl0IChzZWUgdGhlIHBhY2thZ2UgZG9jLCAidGhlIG93bmVyIGNhbgovLyBhbHdheXMgbGVhdmUiKS4gUmV2b2tlIGlzIHRoZSBjbGVhbiB3YXkgdG8gZW5kIGEgZ3JhbnQuCmZ1bmMgV2l0aGRyYXdQb29sKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCXJldHVybiBwYXlPdXRQb29sKGN1ciwgb3duZXIsIGFtb3VudCkKfQoKLy8gV2l0aGRyYXdQb29sQWxsIHJldHVybnMgdGhlIGNhbGxlcidzIGVudGlyZSB1bnNwZW50IHBvb2wgYW5kIHJlcG9ydHMgdGhlCi8vIGFtb3VudCBXSVRIRFJBV04uCi8vCi8vIFRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSB0d28gd2l0aGRyYXcgZW50cnlwb2ludHMgYXJlIGRlbGliZXJhdGVseQovLyBhc3ltbWV0cmljLCB3aGljaCBpcyB3b3J0aCBuYW1pbmcgcmF0aGVyIHRoYW4gbGV0dGluZyBhIGNhbGxlciBkaXNjb3ZlcjoKLy8gZWFjaCByZXR1cm5zIHRoZSBmaWd1cmUgaXRzIGNhbGxlciBkb2VzIG5vdCBhbHJlYWR5IGhhdmUuIFdpdGhkcmF3UG9vbAovLyB3YXMgdG9sZCB0aGUgYW1vdW50IGFuZCB3YW50cyB0byBrbm93IHdoYXQgaXMgbGVmdDsgV2l0aGRyYXdQb29sQWxsCi8vIGtub3dzIHdoYXQgaXMgbGVmdCAobm90aGluZykgYW5kIHdhbnRzIHRvIGtub3cgd2hhdCBpdCBnb3QuIFJldHVybmluZwovLyB0aGUgcmVtYWluZGVyIGhlcmUgd291bGQgaGFuZCBldmVyeSBjYWxsZXIgYSBjb25zdGFudCAwLgpmdW5jIFdpdGhkcmF3UG9vbEFsbChjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCA6PSBwb29sT2Yob3duZXIuU3RyaW5nKCkpCglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vIHBvb2wgdG8gd2l0aGRyYXciKQoJfQoJcGF5T3V0UG9vbChjdXIsIG93bmVyLCBhbW91bnQpCglyZXR1cm4gYW1vdW50Cn0KCi8vIHBheU91dFBvb2wgaXMgdGhlIHNoYXJlZCBkZWJpdC10aGVuLXNlbmQgcGF0aDogdGhlIHBvb2wgYW5kIHRoZSBQIHRlcm0KLy8gYXJlIHJlZHVjZWQgYmVmb3JlIHRoZSBpZGVudGljYWwgYW1vdW50IGxlYXZlcyB0aGUgcmVhbG0KLy8gKGNoZWNrcy1lZmZlY3RzLWludGVyYWN0aW9ucykuCmZ1bmMgcGF5T3V0UG9vbChjdXIgcmVhbG0sIG93bmVyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgaW50NjQgewoJa2V5IDo9IG93bmVyLlN0cmluZygpCglwb29sIDo9IHBvb2xPZihrZXkpCglpZiBhbW91bnQgPiBwb29sIHsKCQlwYW5pYygiYW1vdW50IGV4Y2VlZHMgcG9vbCIpCgl9CgluZXdSZXR1cm5lZCwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZVJldHVybmVkLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSByZXR1cm5lZCB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJc2V0UG9vbChrZXksIHBvb2wtYW1vdW50KQoJdG90YWxQb29sZWQgLT0gYW1vdW50CglsaWZldGltZVJldHVybmVkID0gbmV3UmV0dXJuZWQKCgljb2luaW8uUGF5b3V0KDAsIGN1ciwgb3duZXIsIERlbm9tLCBhbW91bnQpCgoJY2hhaW4uRW1pdCgiUG9vbFdpdGhkcmF3biIsICJvd25lciIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkicG9vbCIsIGl0b2EocG9vbC1hbW91bnQpKQoJcmV0dXJuIHBvb2wgLSBhbW91bnQKfQoKLy8gLS0tIGdyYW50cyAtLS0KCi8vIEdyYW50IG9wZW5zIGEgc3RhbmRpbmcgc3BlbmRpbmcgYXV0aG9yaXR5IGZvciBvbmUgZGVsZWdhdGUgYW5kIHJldHVybnMKLy8gdGhlIGdyYW50IGlkLiBUaGUgY2FsbGVyIGJlY29tZXMgdGhlIGdyYW50J3Mgb3duZXIgYW5kIG11c3QgYWxyZWFkeQovLyBoYXZlIGEgZnVuZGVkIHBvb2wg4oCUIG5vdCBiZWNhdXNlIHRoZSBncmFudCByZXNlcnZlcyBhbnl0aGluZyAoaXQgZG9lcwovLyBub3QpLCBidXQgYmVjYXVzZSBhIGdyYW50IGZyb20gYW4gYWRkcmVzcyB0aGF0IGhhcyBuZXZlciBmdW5kZWQKLy8gYW55dGhpbmcgaXMgYSBwcm9taXNlIHdpdGggbm90aGluZyBiZWhpbmQgaXQsIGFuZCB0aGlzIHJlYWxtIGRlY2xpbmVzCi8vIHRvIHJlY29yZCBvbmUuCi8vCi8vIFRlcm1zLCBhbGwgaW4gdGhlIGNoYWluJ3Mgb3duIHVuaXRzOgovLwovLwlwZXJQZXJpb2QgICAgdGhlIGNhcCBwZXIgd2luZG93LCBhdCBsZWFzdCBNaW5QZXJQZXJpb2QuIFJlcXVpcmVkLgovLwlwZXJpb2RMZW5ndGggYmxvY2tzIHBlciB3aW5kb3cuIDAgbWVhbnMgT05FIExJRkVUSU1FIFdJTkRPVyB0aGF0Ci8vCSAgICAgICAgICAgICBuZXZlciByZWZpbGxzOyBvdGhlcndpc2UgYXQgbGVhc3QgTWluUGVyaW9kQmxvY2tzLgovLwl0b3RhbCAgICAgICAgbGlmZXRpbWUgY2FwIGFjcm9zcyBldmVyeSB3aW5kb3cuIDAgbWVhbnMgdW5saW1pdGVkLgovLwlleHBpcmVzQXQgICAgYWJzb2x1dGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIGF1dGhvcml0eSBlbmRzLiAwIG1lYW5zCi8vCSAgICAgICAgICAgICBubyBleHBpcnkuCi8vCi8vIEV2ZXJ5IGJvdW5kIGFib3ZlIGV4Y2VwdCB0aGUgdHdvIHJlYWxtIG1pbmltdW1zIGlzIHZhbGlkYXRlZCBhbmQKLy8gZW5mb3JjZWQgYnkgc3BlbmRib29rLCBhbmQgYW4gaW52YWxpZCBjb21iaW5hdGlvbiBzdXJmYWNlcyBhcyB0aGF0Ci8vIHBhY2thZ2UncyBvd24gc2VudGluZWwgZXJyb3IuCmZ1bmMgR3JhbnQoY3VyIHJlYWxtLCBzcGVuZGVyIGFkZHJlc3MsIGxhYmVsIHN0cmluZywKCXBlclBlcmlvZCwgcGVyaW9kTGVuZ3RoLCB0b3RhbCwgZXhwaXJlc0F0IGludDY0KSBpbnQ2NCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJLy8gVGhlIGxvd2VyY2FzZSBjbGF1c2UgaXMgbG9hZC1iZWFyaW5nLCBub3QgZGVjb3JhdGlvbiwgYW5kIHRoZSByZWFzb24KCS8vIHdhcyBtZWFzdXJlZCBvbiB0aGlzIHRvb2xjaGFpbiByYXRoZXIgdGhhbiBhcmd1ZWQ6IGFkZHJlc3MuSXNWYWxpZCgpCgkvLyBkZWZlcnMgdG8gY3J5cHRvLkFkZHJlc3NGcm9tQmVjaDMyLCB3aG9zZSBkZWNvZGVyIGxvd2VyY2FzZXMgdGhlCgkvLyBpbnB1dCBCRUZPUkUgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSwgc28gaXQgcmV0dXJucyB0cnVlIGZvciB0aGUKCS8vIGFsbC11cHBlcmNhc2Ugc3BlbGxpbmcgb2YgYSB2YWxpZCBhZGRyZXNzLiBIZXJlIHRoZSBoYXphcmQgaXMgbm90IGEKCS8vIGRvdWJsZSBjb3VudCAoYXMgaW4gZmVlX3NwbGl0L3YyIGFuZCB0cmVhc3VyeV9ib2FyZCwgd2hlcmUgdGhlCgkvLyBhZGRyZXNzIHdhcyBhIHZvdGUtYmVhcmluZyBrZXkpIGJ1dCBhIEJSSUNLRUQgR1JBTlQ6IERyYXcKCS8vIGF1dGhlbnRpY2F0ZXMgYWdhaW5zdCBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIHdoaWNoIGlzIGFsd2F5cwoJLy8gY2Fub25pY2FsLCBzbyBhbiB1cHBlcmNhc2Utc3BlbGxlZCBkZWxlZ2F0ZSBjb3VsZCBuZXZlciBkcmF3LCB3aGlsZQoJLy8gdGhlIGdyYW50IHN0aWxsIG9jY3VwaWVkIGEgTWF4R3JhbnRzUGVyT3duZXIgc2xvdCBhbmQgYSBzdG9yYWdlCgkvLyBkZXBvc2l0LiBUaGUgY2hlY2sgaXMgY29tcGxldGUgYXMgd2VsbCBhcyBuZWNlc3Nhcnkg4oCUIHRoYXQgZGVjb2RlcgoJLy8gcmVqZWN0cyBtaXhlZCBjYXNlIG91dHJpZ2h0LCBzbyBhIHZhbGlkIGFkZHJlc3MgaGFzIGV4YWN0bHkgdHdvCgkvLyBzcGVsbGluZ3MgYW5kIHJlamVjdGluZyBldmVyeSBub24tbG93ZXIgb25lIGxlYXZlcyBwcmVjaXNlbHkgdGhlCgkvLyBjYW5vbmljYWwgb25lLgoJaWYgIXNwZW5kZXIuSXNWYWxpZCgpIHx8IHN0cmluZyhzcGVuZGVyKSAhPSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5nKHNwZW5kZXIpKSB7CgkJcGFuaWMoInNwZW5kZXIgaXMgbm90IGEgdmFsaWQgYWRkcmVzcyBpbiBjYW5vbmljYWwgKGxvd2VyY2FzZSkgZm9ybSIpCgl9CglpZiBsZW4obGFiZWwpID4gTWF4TGFiZWxMZW4gewoJCXBhbmljKCJsYWJlbCBleGNlZWRzICIgKyBzdHJjb252Lkl0b2EoTWF4TGFiZWxMZW4pICsgIiBieXRlcyIpCgl9CglpZiBwZXJQZXJpb2QgPCBNaW5QZXJQZXJpb2QgewoJCXBhbmljKCJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJQZXJpb2QpICsgRGVub20pCgl9CglpZiBwZXJpb2RMZW5ndGggIT0gMCAmJiBwZXJpb2RMZW5ndGggPCBNaW5QZXJpb2RCbG9ja3MgewoJCXBhbmljKCJwZXJpb2RMZW5ndGggbXVzdCBiZSAwIChsaWZldGltZSkgb3IgYXQgbGVhc3QgIiArCgkJCWl0b2EoTWluUGVyaW9kQmxvY2tzKSArICIgYmxvY2tzIikKCX0KCglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCWlmIHBvb2xPZihrZXkpID09IDAgewoJCXBhbmljKCJmdW5kIGEgcG9vbCBiZWZvcmUgZ3JhbnRpbmciKQoJfQoJaWYgb3duZXJPcGVuKGtleSkgPj0gTWF4R3JhbnRzUGVyT3duZXIgewoJCXBhbmljKCJvd25lciBhbHJlYWR5IGhhcyAiICsgaXRvYShNYXhHcmFudHNQZXJPd25lcikgKyAiIGxpdmUgZ3JhbnRzIikKCX0KCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglhbGxvd0lELCBlcnIgOj0gYm9vay5PcGVuKGtleSwgc3BlbmRlci5TdHJpbmcoKSwgbm93LCBzcGVuZGJvb2suVGVybXN7CgkJUGVyUGVyaW9kOiAgICBwZXJQZXJpb2QsCgkJUGVyaW9kTGVuZ3RoOiBwZXJpb2RMZW5ndGgsCgkJVG90YWw6ICAgICAgICB0b3RhbCwKCQlFeHBpcmVzQXQ6ICAgIGV4cGlyZXNBdCwKCX0pCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJaWQgOj0gbmV4dElEICsgMQoJbmV4dElEID0gaWQKCWdyYW50cy5TZXQocGFkSUQoaWQpLCAmZ3JhbnR7CgkJaWQ6ICAgICAgICBpZCwKCQlvd25lcjogICAgIG93bmVyLAoJCXNwZW5kZXI6ICAgc3BlbmRlciwKCQlhbGxvd0lEOiAgIGFsbG93SUQsCgkJZmVlQnBzOiAgICBEcmF3RmVlQnBzLAoJCWxhYmVsOiAgICAgbGFiZWwsCgkJY3JlYXRlZEF0OiBub3csCgl9KQoJc2V0T3duZXJPcGVuKGtleSwgb3duZXJPcGVuKGtleSkrMSkKCgljaGFpbi5FbWl0KCJHcmFudGVkIiwgImlkIiwgaXRvYShpZCksICJvd25lciIsIGtleSwKCQkic3BlbmRlciIsIHNwZW5kZXIuU3RyaW5nKCksICJwZXJQZXJpb2QiLCBpdG9hKHBlclBlcmlvZCksCgkJInBlcmlvZExlbmd0aCIsIGl0b2EocGVyaW9kTGVuZ3RoKSwgInRvdGFsIiwgaXRvYSh0b3RhbCksCgkJImV4cGlyZXNBdCIsIGl0b2EoZXhwaXJlc0F0KSwgImZlZUJwcyIsIGl0b2EoRHJhd0ZlZUJwcykpCglyZXR1cm4gaWQKfQoKLy8gQW1lbmQgY2hhbmdlcyBhIGdyYW50J3MgdGVybXMuIE93bmVyIG9ubHkuIFRoZSByZXR1cm5lZCBib29sIHJlcG9ydHMKLy8gd2hldGhlciB0aGUgbmV3IHRlcm1zIGFyZSBpbiBmb3JjZSBOT1cgKGEgdGlnaHRlci1vci1lcXVhbCBhbWVuZG1lbnQpCi8vIG9yIHF1ZXVlZCBmb3IgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5IChhIGxvb3NlciBvbmUpIOKAlCBzcGVuZGJvb2sncwovLyBvbmUtc2lkZWQgcnVsZSwgYW5kIHRoZSBkaXN0aW5jdGlvbiB3b3J0aCBrbm93aW5nLgovLwovLyBwZXJpb2RMZW5ndGggaXMgTk9UIGEgcGFyYW1ldGVyLiBzcGVuZGJvb2sgbWFrZXMgaXQgaW1tdXRhYmxlIGJlY2F1c2UKLy8gbW92aW5nIGl0IHdvdWxkIG1vdmUgZXZlcnkgZnV0dXJlIGJvdW5kYXJ5LCB3aGljaCBpcyBhbiBlbmxhcmdlbWVudAovLyB2ZWN0b3Igd2VhcmluZyBhIGRpZmZlcmVudCBoYXQ7IHRoaXMgcmVhbG0gcmVhZHMgdGhlIGdyYW50J3Mgb3duCi8vIHBlcmlvZExlbmd0aCBhbmQgcGFzc2VzIGl0IHVuY2hhbmdlZCwgc28gY2hhbmdpbmcgaXQgaXMgbm90IG1lcmVseQovLyByZWZ1c2VkLCBpdCBpcyB1bmV4cHJlc3NpYmxlLgpmdW5jIEFtZW5kKGN1ciByZWFsbSwgaWQgaW50NjQsIHBlclBlcmlvZCwgdG90YWwsIGV4cGlyZXNBdCBpbnQ2NCkgYm9vbCB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglnIDo9IG11c3RHZXQoaWQpCglpZiBvd25lciAhPSBnLm93bmVyIHsKCQlwYW5pYygib3duZXIgb25seSIpCgl9CglpZiBwZXJQZXJpb2QgPCBNaW5QZXJQZXJpb2QgewoJCXBhbmljKCJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJQZXJpb2QpICsgRGVub20pCgl9CgoJYSwgZXJyIDo9IGJvb2suR2V0KGcuYWxsb3dJRCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWFwcGxpZWQsIGVyciA6PSBib29rLkFtZW5kKGcuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCksIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwKCQlzcGVuZGJvb2suVGVybXN7CgkJCVBlclBlcmlvZDogICAgcGVyUGVyaW9kLAoJCQlQZXJpb2RMZW5ndGg6IGEuVGVybXMuUGVyaW9kTGVuZ3RoLCAvLyBpbW11dGFibGUKCQkJVG90YWw6ICAgICAgICB0b3RhbCwKCQkJRXhwaXJlc0F0OiAgICBleHBpcmVzQXQsCgkJfSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljaGFpbi5FbWl0KCJBbWVuZGVkIiwgImlkIiwgaXRvYShnLmlkKSwgIm93bmVyIiwgb3duZXIuU3RyaW5nKCksCgkJInBlclBlcmlvZCIsIGl0b2EocGVyUGVyaW9kKSwgInRvdGFsIiwgaXRvYSh0b3RhbCksCgkJImV4cGlyZXNBdCIsIGl0b2EoZXhwaXJlc0F0KSwgImFwcGxpZWQiLCBib29sc3RyKGFwcGxpZWQpKQoJcmV0dXJuIGFwcGxpZWQKfQoKLy8gUmV2b2tlIGVuZHMgYSBncmFudCBpbW1lZGlhdGVseS4gT3duZXIgb25seS4gVGhlIGlkIGlzIG5ldmVyIHJldXNlZCwKLy8gc28gYSByZXZva2VkIGdyYW50IGNhbm5vdCBiZSByZXN1cnJlY3RlZCBhbmQgYSBsYXRlciBEcmF3IGFnYWluc3QgaXQKLy8gZmFpbHMgYXMgdW5rbm93bi4KLy8KLy8gUmV2b2tpbmcgZG9lcyBOT1QgY2xhdyBiYWNrIGNyZWRpdCB0aGUgZGVsZWdhdGUgaGFzIGFscmVhZHkgZHJhd24g4oCUCi8vIHRoYXQgaXMgdGhlaXJzIGFuZCBzdGF5cyBjbGFpbWFibGUuIFJldm9rZSBlbmRzIGZ1dHVyZSBhdXRob3JpdHkuCmZ1bmMgUmV2b2tlKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWcgOj0gbXVzdEdldChpZCkKCWlmIG93bmVyICE9IGcub3duZXIgewoJCXBhbmljKCJvd25lciBvbmx5IikKCX0KCS8vIE93bmVyLWdhdGVkIHR3aWNlIG9uIHB1cnBvc2U6IHRoZSBjaGVjayBhYm92ZSBpcyBmb3IgdGhlIGVycm9yCgkvLyBtZXNzYWdlLCB0aGUgcHJpbWl0aXZlJ3MgaXMgdGhlIGF1dGhvcml0YXRpdmUgb25lLgoJaWYgZXJyIDo9IGJvb2suUmV2b2tlKGcuYWxsb3dJRCwgb3duZXIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cglkcm9wKGcpCgoJY2hhaW4uRW1pdCgiUmV2b2tlZCIsICJpZCIsIGl0b2EoZy5pZCksICJvd25lciIsIG93bmVyLlN0cmluZygpLAoJCSJzcGVuZGVyIiwgZy5zcGVuZGVyLlN0cmluZygpLCAiZHJhd24iLCBpdG9hKGcuZHJhd24pKQp9CgovLyBSZWFwIHJlbW92ZXMgYSBncmFudCB3aG9zZSBhdXRob3JpdHkgaGFzIEVYUElSRUQsIGZyZWVpbmcgaXRzIHNsb3QgYW5kCi8vIGl0cyBzdG9yYWdlLiBBbnlvbmUgbWF5IGNhbGwgaXQsIGFuZCB0aGUgcmVhc29uaW5nIGlzIHNwZW5kYm9vaydzIG93bjoKLy8gYW4gZXhwaXJlZCBhbGxvd2FuY2UgY2FuIG5ldmVyIGF1dGhvcml6ZSBhbm90aGVyIGRyYXcsIHNvIHJlbW92aW5nIGl0Ci8vIHRha2VzIG5vdGhpbmcgZnJvbSB0aGUgb3duZXIgYW5kIGdyYW50cyBub3RoaW5nIHRvIHRoZSBjYWxsZXIuIFRoZQovLyBjaGFpbiByZWZ1bmRzIHRoZSBmcmVlZCBzdG9yYWdlIGRlcG9zaXQgdG8gdGhlIHJlYXBpbmcgdHJhbnNhY3Rpb24sCi8vIHdoaWNoIGlzIHRoZSBzdGFuZGluZyBpbmNlbnRpdmUuCi8vCi8vIEEgZ3JhbnQgd2l0aCBubyBleHBpcnkgY2FuIG5ldmVyIGJlIHJlYXBlZDsgb25seSBpdHMgb3duZXIgY2FuIGVuZCBpdC4KZnVuYyBSZWFwKGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglnIDo9IG11c3RHZXQoaWQpCglpZiBlcnIgOj0gYm9vay5SZWFwKGcuYWxsb3dJRCwgcnVudGltZS5DaGFpbkhlaWdodCgpKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJZHJvcChnKQoKCWNoYWluLkVtaXQoIlJlYXBlZCIsICJpZCIsIGl0b2EoZy5pZCksICJvd25lciIsIGcub3duZXIuU3RyaW5nKCksCgkJImJ5IiwgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpKQp9CgovLyAtLS0gZHJhd2luZyAtLS0KCi8vIERyYXcgc3BlbmRzIGFtb3VudCBmcm9tIHRoZSBncmFudCdzIGJ1ZGdldC4gREVMRUdBVEUgT05MWTogdGhlIHNwZW5kZXIKLy8gaXMgdGhlIGNhbGxpbmcgYWRkcmVzcywgbmV2ZXIgYW4gYXJndW1lbnQuIE5vdGhpbmcgaXMgcGFpZCBvdXQgaGVyZSDigJQKLy8gdGhlIGRlbGVnYXRlIGlzIGNyZWRpdGVkIG5ldCBvZiB0aGUgZmVlIGFuZCBjbGFpbXMgc2VwYXJhdGVseS4KLy8KLy8gVGhyZWUgdGhpbmdzIG11c3QgYWxsIGhvbGQgYW5kIHRoZXkgZmFpbCBpbiB0aGlzIG9yZGVyLCB3aGljaCBtYXR0ZXJzOgovLyB0aGUgY2FsbGVyIG11c3QgYmUgdGhlIGdyYW50J3MgZGVsZWdhdGUgYW5kIHRoZSBhbW91bnQgbXVzdCBiZSB3aXRoaW4KLy8gZXZlcnkgc3BlbmRib29rIGJvdW5kICh3aW5kb3cgY2FwLCBsaWZldGltZSBjYXAsIGV4cGlyeSwgc3RhcnQpOyBhbmQKLy8gdGhlIG93bmVyJ3MgcG9vbCBtdXN0IGNvdmVyIHRoZSBHUk9TUyBhbW91bnQuIFRoZSBzb2x2ZW5jeSBjaGVjayBydW5zCi8vIEJFRk9SRSB0aGUgYWxsb3dhbmNlIGlzIGNvbnN1bWVkLCBzbyBhIGRyYXcgcmVmdXNlZCBmb3IgaW5zb2x2ZW5jeQovLyBsZWF2ZXMgdGhlIGJ1ZGdldCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gYnVybmluZyB3aW5kb3cgY2FwYWNpdHkgb24gYQovLyBkcmF3IHRoYXQgZGlkIG5vdCBoYXBwZW4uCmZ1bmMgRHJhdyhjdXIgcmVhbG0sIGlkIGludDY0LCBhbW91bnQgaW50NjQpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzcGVuZGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJZyA6PSBtdXN0R2V0KGlkKQoJaWYgc3BlbmRlciAhPSBnLnNwZW5kZXIgewoJCXBhbmljKCJkZWxlZ2F0ZSBvbmx5IikKCX0KCWlmIGFtb3VudCA8PSAwIHsKCQlwYW5pYygiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiKQoJfQoKCW93bmVyS2V5IDo9IGcub3duZXIuU3RyaW5nKCkKCXBvb2wgOj0gcG9vbE9mKG93bmVyS2V5KQoJaWYgYW1vdW50ID4gcG9vbCB7CgkJLy8gQSBidWRnZXQgaXMgYXV0aG9yaXR5LCBub3QgYSByZXNlcnZhdGlvbiAocGFja2FnZSBkb2MpLiBUaGUKCQkvLyBob25lc3QgZmFpbHVyZSBpcyBoZXJlLCBhdCBkcmF3IHRpbWUsIHJhdGhlciB0aGFuIGEgY3JlZGl0IHRoZQoJCS8vIGRlbGVnYXRlIGNvdWxkIG5vdCBjbGFpbS4KCQlwYW5pYygib3duZXIncyBwb29sIGNhbm5vdCBjb3ZlciB0aGlzIGRyYXciKQoJfQoKCS8vIEF1dGhvcml0eS4gc3BlbmRib29rIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZQoJLy8gaW4gdGhpcyBvbmUgY2FsbCwgYmVmb3JlIHJldHVybmluZzsgb24gYW55IGVycm9yIG5vdGhpbmcgaXMKCS8vIGNvbnN1bWVkLiBJdHMgc2VudGluZWwgZXJyb3JzIG5hbWUgdGhlIHJlYXNvbi4KCWlmIGVyciA6PSBib29rLlNwZW5kKGcuYWxsb3dJRCwgc3BlbmRlci5TdHJpbmcoKSwKCQlydW50aW1lLkNoYWluSGVpZ2h0KCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgluZXdEcmF3biwgb2sgOj0gY2hlY2tlZEFkZChnLmRyYXduLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJncmFudCBkcmF3biB0b3RhbCB3b3VsZCBvdmVyZmxvdyIpCgl9CgluZXdMaWZldGltZSwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZURyYXduLCBhbW91bnQpCglpZiAhb2sgewoJCXBhbmljKCJsaWZldGltZSBkcmF3biB3b3VsZCBvdmVyZmxvdyIpCgl9CgoJLy8gTW92ZSB0aGUgZ3Jvc3Mgb3V0IG9mIFAgYW5kIGludG8gTC4gSCBkb2VzIG5vdCBtb3ZlLCB3aGljaCBpcyB3aHkKCS8vIHRoaXMgdHJhbnNpdGlvbiBoYXMgbm8gcGF5b3V0IHRvIGZhaWwuCglzZXRQb29sKG93bmVyS2V5LCBwb29sLWFtb3VudCkKCXRvdGFsUG9vbGVkIC09IGFtb3VudAoJY3JlZGl0ZWQsIGZlZSA6PSBsZWRnZXIuTXVzdERlcG9zaXQoc3BlbmRlci5TdHJpbmcoKSwgYW1vdW50LCBnLmZlZUJwcykKCWcuZHJhd24gPSBuZXdEcmF3bgoJZy5kcmF3cysrCglsaWZldGltZURyYXduID0gbmV3TGlmZXRpbWUKCgljaGFpbi5FbWl0KCJEcmF3biIsICJpZCIsIGl0b2EoZy5pZCksICJzcGVuZGVyIiwgc3BlbmRlci5TdHJpbmcoKSwKCQkiZ3Jvc3MiLCBpdG9hKGFtb3VudCksICJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLCAiZmVlIiwgaXRvYShmZWUpLAoJCSJwb29sIiwgaXRvYShwb29sLWFtb3VudCkpCglyZXR1cm4gY3JlZGl0ZWQKfQoKLy8gQ2xhaW0gcGF5cyB0aGUgY2FsbGVyJ3MgZW50aXJlIGFjY3J1ZWQgY3JlZGl0IG91dC4gREVMRUdBVEUgT05MWTogdGhlCi8vIGFjY291bnQgaXMgdGhlIGNhbGxpbmcgYWRkcmVzcy4gQ3JlZGl0IGZyb20gYSBncmFudCB0aGF0IGhhcyBzaW5jZQovLyBiZWVuIHJldm9rZWQsIGV4cGlyZWQgb3IgcmVhcGVkIGlzIHN0aWxsIGNsYWltYWJsZSDigJQgaXQgd2FzIGVhcm5lZAovLyB1bmRlciBhIGxpdmUgYXV0aG9yaXR5IGFuZCB0aGlzIHJlYWxtIGRvZXMgbm90IHJldmlzaXQgdGhhdC4KZnVuYyBDbGFpbShjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglhY2NvdW50IDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJa2V5IDo9IGFjY291bnQuU3RyaW5nKCkKCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoa2V5KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJubyBjcmVkaXQgdG8gY2xhaW0iKQoJfQoJbmV3Q2xhaW1lZCwgb2sgOj0gY2hlY2tlZEFkZChsaWZldGltZUNsYWltZWQsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoImxpZmV0aW1lIGNsYWltZWQgd291bGQgb3ZlcmZsb3ciKQoJfQoJbGlmZXRpbWVDbGFpbWVkID0gbmV3Q2xhaW1lZAoKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBhY2NvdW50LCBEZW5vbSwgYW1vdW50KQoKCWNoYWluLkVtaXQoIkNsYWltZWQiLCAiYWNjb3VudCIsIGtleSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKCXJldHVybiBhbW91bnQKfQoKLy8gLS0tIGZlZXMgYW5kIHN1cnBsdXMgLS0tCgovLyBXaXRoZHJhd0ZlZXMgcGF5cyB0aGUgZW50aXJlIGFjY3J1ZWQgZmVlIHBvdCB0byB0aGUgY29tcGlsZS10aW1lCi8vIEZlZUNvbGxlY3Rvci4gQW55b25lIG1heSBjYWxsIGl0OiB0aGUgZGVzdGluYXRpb24gaXMgZml4ZWQsIHNvIHRoZXJlCi8vIGlzIG5vdGhpbmcgZm9yIGEgY2FsbGVyIHRvIHN0ZWVyLgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglmZWVzIDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJaWYgZmVlcyA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBGZWVDb2xsZWN0b3IsIERlbm9tLCBmZWVzKQoJY2hhaW4uRW1pdCgiRmVlc1dpdGhkcmF3biIsICJ0byIsIEZlZUNvbGxlY3Rvci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoZmVlcykpCglyZXR1cm4gZmVlcwp9CgovLyBTd2VlcFN1cnBsdXMgc2VuZHMgb3V0LW9mLWJhbmQgY29pbnMgdG8gdGhlIEZlZUNvbGxlY3RvcjogZm9yIHRoZSBwb29sCi8vIGRlbm9tLCBldmVyeXRoaW5nIGFib3ZlIHRyYWNrZWQgbGlhYmlsaXRpZXM7IGZvciBhbnkgZm9yZWlnbiBkZW5vbSwKLy8gdGhlIGZ1bGwgYmFsYW5jZS4gT3duZXIgcG9vbHMsIGRlbGVnYXRlIGNyZWRpdCBhbmQgdGhlIGZlZSBwb3QgYXJlCi8vIHVudG91Y2hhYmxlIGJ5IGNvbnN0cnVjdGlvbiAoY29pbmlvLlN3ZWVwIHJlZnVzZXMgdG8gZGlwIGJlbG93IHRoZQovLyByZXNlcnZlKS4gQW55b25lIG1heSBjYWxsIGl0LgovLwovLyBXaXRoIG5vdGhpbmcgb3V0IG9mIGJhbmQgdGhpcyBBQk9SVFMgKCJjb2luaW86IG5vIHN1cnBsdXMgdG8gc3dlZXAgZm9yCi8vIDxkZW5vbT4iKSByYXRoZXIgdGhhbiByZXR1cm5pbmcgMC4gVGhhdCBpcyB0aGUgcHJpbWl0aXZlJ3MgY2hvaWNlIGFuZAovLyB0aGUgcmlnaHQgb25lOiBhIHN3ZWVwIGlzIGEgdHJhbnNmZXIsIGFuZCBhIHRyYW5zZmVyIG9mIG5vdGhpbmcgdGhhdAovLyByZXBvcnRzIHN1Y2Nlc3MgaXMgaG93IGEgY2FsbGVyIGNvbWVzIHRvIGJlbGlldmUgYSBiYWxhbmNlIHdhcyBtb3ZlZC4KZnVuYyBTd2VlcFN1cnBsdXMoY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIGludDY0IHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglyZXNlcnZlIDo9IGludDY0KDApCglpZiBkZW5vbSA9PSBEZW5vbSB7CgkJcmVzZXJ2ZSA9IExpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIEZlZUNvbGxlY3RvciwgZGVub20sIHJlc2VydmUpCgljaGFpbi5FbWl0KCJTd2VwdCIsICJkZW5vbSIsIGRlbm9tLCAidG8iLCBGZWVDb2xsZWN0b3IuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2Eoc3dlcHQpKQoJcmV0dXJuIHN3ZXB0Cn0KCi8vIC0tLSB2aWV3cyAtLS0KCi8vIEdyYW50SW5mbyByZXR1cm5zIGEgZ3JhbnQncyBwYXJ0aWVzIGFuZCB0aGUgdGVybXMgY3VycmVudGx5IFJFQ09SREVECi8vIGZvciBpdC4gcGVyUGVyaW9kIHJlZmxlY3RzIGEgdGlnaHRlbmluZyBhbWVuZG1lbnQgaW1tZWRpYXRlbHk7IGEKLy8gcXVldWVkIGxvb3NlbmluZyBzaG93cyBpbiBQZW5kaW5nVGVybXMgdW50aWwgaXRzIGJvdW5kYXJ5IGFycml2ZXMuCi8vCi8vIENBVkVBVCAoYXVkaXQgMjAyNi0xMS0wNCwgTjEpOiBwYXN0IHRoZSBmaXJzdCB3aW5kb3cgYm91bmRhcnkgYWZ0ZXIgYQovLyBsb29zZW5pbmcgd2FzIHF1ZXVlZCwgdGhlIFBFTkRJTkcgdGVybXMgYWxyZWFkeSBnb3Zlcm4gZW5mb3JjZW1lbnQgLS0KLy8gc3BlbmRib29rJ3MgYXQoKSBhcHBsaWVzIHRoZW0gd2hldGhlciBvciBub3QgYW55IHdyaXRlIG9ic2VydmVkIHRoZQovLyByb2xsIC0tIHdoaWxlIHRoaXMgZnVuY3Rpb24gc3RpbGwgcmV0dXJucyB0aGUgc3RvcmVkIHJlY29yZCB1bnRpbCB0aGUKLy8gbmV4dCBkcmF3IG9yIGFtZW5kbWVudC4gRm9yIHRoZSBnb3Zlcm5pbmcgZmlndXJlcywgcmVhZCBHcmFudFVzYWdlIC8KLy8gRHJhd2FibGUgKGFsd2F5cyBib3VuZGFyeS1jb3JyZWN0KSBvciB0aGUgZ3JhbnQgcGFnZSwgd2hpY2ggZGVyaXZlcwovLyBpdHMgdGVybXMgZXhhY3RseSBhcyB0aGUgZ2F0ZSBkb2VzLgpmdW5jIEdyYW50SW5mbyhpZCBpbnQ2NCkgKG93bmVyLCBzcGVuZGVyIGFkZHJlc3MsIHBlclBlcmlvZCwgcGVyaW9kTGVuZ3RoLAoJdG90YWwsIGV4cGlyZXNBdCwgYW5jaG9yLCBjcmVhdGVkQXQsIGZlZUJwcyBpbnQ2NCkgewoJZyA6PSBtdXN0R2V0KGlkKQoJYSA6PSBtdXN0QWxsb3dhbmNlKGcpCglyZXR1cm4gZy5vd25lciwgZy5zcGVuZGVyLCBhLlRlcm1zLlBlclBlcmlvZCwgYS5UZXJtcy5QZXJpb2RMZW5ndGgsCgkJYS5UZXJtcy5Ub3RhbCwgYS5UZXJtcy5FeHBpcmVzQXQsIGEuQW5jaG9yLCBnLmNyZWF0ZWRBdCwgZy5mZWVCcHMKfQoKLy8gR3JhbnRVc2FnZSByZXR1cm5zIGEgZ3JhbnQncyBjb25zdW1wdGlvbiBBVCBUSEUgQ1VSUkVOVCBIRUlHSFQ6IHdoYXQgdGhlCi8vIHdpbmRvdyB0aGUgY2hhaW4gaXMgaW4gcmlnaHQgbm93IGhhcyBzcGVudCwgdGhlIGxpZmV0aW1lIGdyb3NzLCB0aGF0Ci8vIHdpbmRvdydzIGluZGV4LCBhbmQgaG93IG1hbnkgZHJhd3MgdGhlcmUgaGF2ZSBiZWVuLgovLwovLyBUaGUgdHdvIHdpbmRvdyBmaWd1cmVzIGFyZSBjb21wdXRlZCByYXRoZXIgdGhhbiByZWFkIHN0cmFpZ2h0IG9mZiB0aGUKLy8gcmVjb3JkLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2Ygd2luZG93QXQgYmVsb3c6IGEgd2luZG93IHRoYXQgaGFzCi8vIHJvbGxlZCB3aXRoIG5vIGRyYXcgc2luY2UgbGVhdmVzIEFsbG93YW5jZS5XaW5kb3dJbmRleCBuYW1pbmcgYSB3aW5kb3cKLy8gdGhlIGNoYWluIGhhcyBhbHJlYWR5IGxlZnQsIGFuZCBBbGxvd2FuY2UuU3BlbnRXaW5kb3cgaG9sZGluZyB0aGUKLy8gcHJldmlvdXMgd2luZG93J3Mgc3BlbmQuIHNwZW50VG90YWwgYW5kIGRyYXdzIGFyZSBjdW11bGF0aXZlIGFuZCBuZXZlcgovLyBnbyBzdGFsZS4KZnVuYyBHcmFudFVzYWdlKGlkIGludDY0KSAoc3BlbnRXaW5kb3csIHNwZW50VG90YWwsIHdpbmRvd0luZGV4LCBkcmF3cyBpbnQ2NCkgewoJZyA6PSBtdXN0R2V0KGlkKQoJYSA6PSBtdXN0QWxsb3dhbmNlKGcpCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglyZXR1cm4gc3BlbnRJbldpbmRvdyhhLCBub3cpLCBhLlNwZW50VG90YWwsIHdpbmRvd0F0KGEsIG5vdyksIGcuZHJhd3MKfQoKLy8gR3JhbnRMYWJlbCByZXR1cm5zIGEgZ3JhbnQncyByYXcgbGFiZWwgKHVuc2FuaXRpemVkOiBjYWxsZXJzIHJlbmRlcmluZwovLyBpdCBpbnRvIG1hcmtkb3duIG11c3Qgc2FuaXRpemUsIGFzIHRoaXMgcmVhbG0ncyBSZW5kZXIgZG9lcykuCmZ1bmMgR3JhbnRMYWJlbChpZCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RHZXQoaWQpLmxhYmVsIH0KCi8vIFJlbWFpbmluZyBpcyB0aGUgQVVUSE9SSVRZIGZpZ3VyZTogd2hhdCB0aGUgZ3JhbnQncyB0ZXJtcyBwZXJtaXQgcmlnaHQKLy8gbm93LCBpZ25vcmluZyB3aGV0aGVyIHRoZSBvd25lcidzIHBvb2wgY2FuIGNvdmVyIGl0LgpmdW5jIFJlbWFpbmluZyhpZCBpbnQ2NCkgaW50NjQgewoJZyA6PSBtdXN0R2V0KGlkKQoJcmV0dXJuIGJvb2suUmVtYWluaW5nKGcuYWxsb3dJRCwgcnVudGltZS5DaGFpbkhlaWdodCgpKQp9CgovLyBEcmF3YWJsZSBpcyB0aGUgSE9ORVNUIGZpZ3VyZSwgYW5kIHRoZSBvbmUgYSBkZWxlZ2F0ZSBzaG91bGQgcmVhZDogdGhlCi8vIGxlc3NlciBvZiB3aGF0IHRoZSBncmFudCBhdXRob3JpemVzIGFuZCB3aGF0IHRoZSBvd25lcidzIHBvb2wgaG9sZHMuCi8vIFRoaXMgZGlzdGluY3Rpb24gaXMgdGhlIHJlYWxtJ3Mgb3duIOKAlCBzcGVuZGJvb2sgYm91bmRzIHBlcm1pc3Npb24gYW5kCi8vIHNheXMgc28sIG5ldmVyIHNvbHZlbmN5LgpmdW5jIERyYXdhYmxlKGlkIGludDY0KSBpbnQ2NCB7CglnIDo9IG11c3RHZXQoaWQpCglhdXRob3JpemVkIDo9IGJvb2suUmVtYWluaW5nKGcuYWxsb3dJRCwgcnVudGltZS5DaGFpbkhlaWdodCgpKQoJcG9vbCA6PSBwb29sT2YoZy5vd25lci5TdHJpbmcoKSkKCWlmIHBvb2wgPCBhdXRob3JpemVkIHsKCQlyZXR1cm4gcG9vbAoJfQoJcmV0dXJuIGF1dGhvcml6ZWQKfQoKLy8gUGVuZGluZ1Rlcm1zIHJldHVybnMgYSBxdWV1ZWQgbG9vc2VuaW5nIGFtZW5kbWVudCBhbmQgd2hldGhlciB0aGVyZSBpcwovLyBvbmUuIEFuIGFtZW5kbWVudCBpcyBxdWV1ZWQgb25seSB3aGVuIGl0IHdvdWxkIHdpZGVuIHRoZSBsaXZlIHdpbmRvdywKLy8gYW5kIGl0IHRha2VzIGVmZmVjdCBhdCB0aGUgbmV4dCB3aW5kb3cgYm91bmRhcnkuCmZ1bmMgUGVuZGluZ1Rlcm1zKGlkIGludDY0KSAocGVyUGVyaW9kLCB0b3RhbCwgZXhwaXJlc0F0IGludDY0LCBwZW5kaW5nIGJvb2wpIHsKCWEgOj0gbXVzdEFsbG93YW5jZShtdXN0R2V0KGlkKSkKCWlmICFhLkhhc1BlbmRpbmcgewoJCXJldHVybiAwLCAwLCAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuUGVuZGluZy5QZXJQZXJpb2QsIGEuUGVuZGluZy5Ub3RhbCwgYS5QZW5kaW5nLkV4cGlyZXNBdCwgdHJ1ZQp9CgovLyBJc0V4cGlyZWQgcmVwb3J0cyB3aGV0aGVyIGEgZ3JhbnQncyBhdXRob3JpdHkgaGFzIGxhcHNlZCwgd2hpY2ggaXMKLy8gYWxzbyB0aGUgY29uZGl0aW9uIHVuZGVyIHdoaWNoIGFueW9uZSBtYXkgUmVhcCBpdC4KZnVuYyBJc0V4cGlyZWQoaWQgaW50NjQpIGJvb2wgewoJcmV0dXJuIG11c3RBbGxvd2FuY2UobXVzdEdldChpZCkpLklzRXhwaXJlZChydW50aW1lLkNoYWluSGVpZ2h0KCkpCn0KCi8vIFBvb2xPZiByZXR1cm5zIGFuIG93bmVyJ3MgdW5zcGVudCBwb29sLgpmdW5jIFBvb2xPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIHBvb2xPZihhZGRyLlN0cmluZygpKSB9CgovLyBDcmVkaXRPZiByZXR1cm5zIGEgZGVsZWdhdGUncyBkcmF3bi1idXQtdW5jbGFpbWVkIGNyZWRpdC4KZnVuYyBDcmVkaXRPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYWRkci5TdHJpbmcoKSkgfQoKLy8gR3JhbnRzT2YgcmV0dXJucyBob3cgbWFueSBsaXZlIGdyYW50cyBhbiBvd25lciBjdXJyZW50bHkgaG9sZHMuCmZ1bmMgR3JhbnRzT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBvd25lck9wZW4oYWRkci5TdHJpbmcoKSkgfQoKLy8gTnVtR3JhbnRzIHJldHVybnMgaG93IG1hbnkgZ3JhbnRzIGhhdmUgZXZlciBiZWVuIGNyZWF0ZWQuIElkcyBhcmUKLy8gbmV2ZXIgcmV1c2VkLCBzbyB0aGlzIG9ubHkgZ3Jvd3MuCmZ1bmMgTnVtR3JhbnRzKCkgaW50NjQgeyByZXR1cm4gbmV4dElEIH0KCi8vIExpdmVHcmFudHMgcmV0dXJucyBob3cgbWFueSBncmFudHMgYXJlIGN1cnJlbnRseSBsaXZlLCBmcm9tIHRoZQovLyBwcmltaXRpdmUncyBvd24gY291bnQuCmZ1bmMgTGl2ZUdyYW50cygpIGludDY0IHsgcmV0dXJuIGludDY0KGJvb2suQ291bnQoKSkgfQoKLy8gVG90YWxQb29sZWQgcmV0dXJucyB0aGUgUCB0ZXJtOiB1bnNwZW50IG93bmVyIGZ1bmRzLgpmdW5jIFRvdGFsUG9vbGVkKCkgaW50NjQgeyByZXR1cm4gdG90YWxQb29sZWQgfQoKLy8gVW5jbGFpbWVkQ3JlZGl0IHJldHVybnMgdGhlIGRlbGVnYXRlcycgc2hhcmUgb2YgdGhlIEwgdGVybS4KZnVuYyBVbmNsYWltZWRDcmVkaXQoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuVXNlcnNUb3RhbCgpIH0KCi8vIEZlZXNBY2NydWVkIHJldHVybnMgdGhlIGZlZSBwb3Q6IGNoYXJnZWQsIG5vdCB5ZXQgd2l0aGRyYXduLgpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkZlZXNBY2NydWVkKCkgfQoKLy8gTGlhYmlsaXRpZXMgcmV0dXJucyBQICsgTCDigJQgZXZlcnl0aGluZyB0aGlzIHJlYWxtIG93ZXMuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiB0b3RhbFBvb2xlZCArIGxlZGdlci5MaWFiaWxpdGllcygpIH0KCi8vIEhlbGQgcmV0dXJucyBIOiB0aGUgdWdub3QgYWN0dWFsbHkgYXQgdGhpcyByZWFsbSdzIGFkZHJlc3MuCmZ1bmMgSGVsZCgpIGludDY0IHsgcmV0dXJuIGNvaW5pby5IZWxkQXQoc2VsZiwgRGVub20pIH0KCi8vIFN1cnBsdXMgcmV0dXJucyBIIC0gKFAgKyBMKSDigJQgb3V0LW9mLWJhbmQgY29pbnMsIHN3ZWVwYWJsZS4KZnVuYyBTdXJwbHVzKCkgaW50NjQgeyByZXR1cm4gSGVsZCgpIC0gTGlhYmlsaXRpZXMoKSB9CgovLyBBZGRyZXNzIHJldHVybnMgdGhpcyByZWFsbSdzIG93biBhZGRyZXNzLgpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHNlbGYgfQoKLy8gSGVpZ2h0IHJldHVybnMgdGhlIGN1cnJlbnQgY2hhaW4gaGVpZ2h0OiB0aGUgY2xvY2sgZXZlcnkgd2luZG93IGFuZAovLyBleHBpcnkgaXMgbWVhc3VyZWQgYWdhaW5zdCwgYW5kIHRoZSBvbmUgbm8gY2FsbGVyIGNhbiBjaG9vc2UuCmZ1bmMgSGVpZ2h0KCkgaW50NjQgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KCi8vIC0tLSByZW5kZXIgLS0tCgovLyBSZW5kZXIgc2hvd3MgdGhlIHJlYWxtIGF0ICIiIGFuZCBhIGdyYW50IHBhZ2UgYXQgIjxpZD4iLiBMYWJlbHMgYXJlCi8vIGZyZWUgdGV4dCBhbmQgcGFzcyB0aHJvdWdoIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyIGJlZm9yZSBoaXR0aW5nCi8vIG1hcmtkb3duLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiByZW5kZXJHcmFudChwYXRoKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaGVsZCA6PSBIZWxkKCkKCWxpYWIgOj0gTGlhYmlsaXRpZXMoKQoJY29uc2VydmF0aW9uIDo9ICJPSyIKCWlmIGhlbGQgPCBsaWFiIHsKCQljb25zZXJ2YXRpb24gPSAiVklPTEFURUQiCgl9CgoJb3V0IDo9ICIjIEJ1ZGdldHNcblxuIgoJb3V0ICs9ICJEZWxlZ2F0ZWQgc3BlbmRpbmcgaW4gR05PVC4gRnVuZCBhIHBvb2wsIGdyYW50IGEgZGVsZWdhdGUgYSAiICsKCQkic3RhbmRpbmcgcmF0ZS1saW1pdGVkIGF1dGhvcml0eSBvdmVyIGl0LCBhbmQgdGhleSBkcmF3IHdpdGhpbiAiICsKCQkidGhhdCBib3VuZCB3aXRob3V0IGFza2luZyBhbnlvbmUuIFJldm9jYWJsZSBpbW1lZGlhdGVseTsgdGhlICIgKwoJCSJ3aW5kb3dzIGFyZSBhbmNob3JlZCwgc28gbm9ib2R5IHJlc2V0cyBhIGNhcCBieSBjaG9vc2luZyB3aGVuICIgKwoJCSJ0byBjYWxsLlxuXG4iCglvdXQgKz0gIiMjIFRlcm1zIChmaXhlZCBhdCBkZXBsb3k7IG5vIGFkbWluLCBubyBzZXR0ZXJzKVxuXG4iCglvdXQgKz0gIi0gZHJhdyBmZWU6ICIgKyBicHMoRHJhd0ZlZUJwcykgKyAiIG9mIHRoZSBncm9zcyBkcmF3LCBwYWlkIGZyb20gdGhlIG93bmVyJ3MgYnVkZ2V0IChoYXJkIGNhcCAiICsgYnBzKE1heEZlZUJwcykgKyAiKVxuIgoJb3V0ICs9ICItIG5vIGZlZSBvbiBmdW5kaW5nLCBvbiB3aXRoZHJhd2luZyBhbiB1bnNwZW50IHBvb2wsIG9yIG9uIGNsYWltaW5nXG4iCglvdXQgKz0gIi0gbWluaW11bSBmdW5kaW5nOiAiICsgaXRvYShNaW5GdW5kaW5nKSArIERlbm9tICsgIiBwZXIgY2FsbFxuIgoJb3V0ICs9ICItIG1pbmltdW0gcGVyLXdpbmRvdyBjYXA6ICIgKyBpdG9hKE1pblBlclBlcmlvZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSB3aW5kb3cgbGVuZ3RoOiAwIChvbmUgbGlmZXRpbWUgd2luZG93KSBvciBhdCBsZWFzdCAiICsgaXRvYShNaW5QZXJpb2RCbG9ja3MpICsgIiBibG9ja3NcbiIKCW91dCArPSAiLSBsaXZlIGdyYW50czogIiArIGl0b2EoTGl2ZUdyYW50cygpKSArICIgb2YgIiArIHN0cmNvbnYuSXRvYShNYXhMaXZlR3JhbnRzKSArCgkJIiAocGVyIG93bmVyOiAiICsgaXRvYShNYXhHcmFudHNQZXJPd25lcikgKyAiKVxuIgoJb3V0ICs9ICItIGN1cnJlbnQgaGVpZ2h0OiAiICsgaXRvYShub3cpICsgIlxuXG4iCglvdXQgKz0gIiMjIEFjY291bnRpbmcgKEggPT0gUCArIEwgKyBTKVxuXG4iCglvdXQgKz0gIi0gcG9vbGVkIChQKTogIiArIGl0b2EodG90YWxQb29sZWQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gdW5jbGFpbWVkIGRlbGVnYXRlIGNyZWRpdDogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWUgcG90OiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBoZWxkIChIKTogIiArIGl0b2EoaGVsZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBzdXJwbHVzIChTKTogIiArIGl0b2EoaGVsZC1saWFiKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGNvbnNlcnZhdGlvbjogIiArIGNvbnNlcnZhdGlvbiArICJcbiIKCW91dCArPSAiLSBsaWZldGltZSBmdW5kZWQgLyBkcmF3biAvIGNsYWltZWQgLyByZXR1cm5lZDogIiArCgkJaXRvYShsaWZldGltZUZ1bmRlZCkgKyAiIC8gIiArIGl0b2EobGlmZXRpbWVEcmF3bikgKyAiIC8gIiArCgkJaXRvYShsaWZldGltZUNsYWltZWQpICsgIiAvICIgKyBpdG9hKGxpZmV0aW1lUmV0dXJuZWQpICsgRGVub20gKyAiXG5cbiIKCW91dCArPSAiIyMgTGl2ZSBncmFudHNcblxuIgoJaWYgZ3JhbnRzLlNpemUoKSA9PSAwIHsKCQlvdXQgKz0gIk5vbmUgeWV0LiBGdW5kIGEgcG9vbCwgdGhlbiBHcmFudCBhIGRlbGVnYXRlLlxuIgoJfSBlbHNlIHsKCQlzaG93biA6PSAwCgkJZXhwaXJlZCA6PSAwCgkJZ3JhbnRzLlJldmVyc2VJdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCQlnIDo9IHYuKCpncmFudCkKCQkJYSwgYWVyciA6PSBib29rLkdldChnLmFsbG93SUQpCgkJCXN0YXRlIDo9ICJsaXZlIgoJCQlpZiBhZXJyICE9IG5pbCB7CgkJCQlzdGF0ZSA9ICJtaXNzaW5nIgoJCQl9IGVsc2UgaWYgYS5Jc0V4cGlyZWQobm93KSB7CgkJCQlzdGF0ZSA9ICJleHBpcmVkIChyZWFwYWJsZSkiCgkJCQlleHBpcmVkKysKCQkJfQoJCQlvdXQgKz0gIi0gWyMiICsgaXRvYShnLmlkKSArICJdKCIgKyBSZWFsbVBhdGggKyAiOiIgKyBpdG9hKGcuaWQpICsKCQkJCSIpIFsiICsgc3RhdGUgKyAiXSAiICsgc2FuaXRpemUuSW5saW5lVGV4dChsYWJlbE9yKGcpKSArCgkJCQkiIOKAlCBkcmF3YWJsZSAiICsgaXRvYShEcmF3YWJsZShnLmlkKSkgKyBEZW5vbSArICJcbiIKCQkJc2hvd24rKwoJCQlyZXR1cm4gc2hvd24gPj0gTWF4UmVuZGVyUm93cwoJCX0pCgkJaWYgc2hvd24gPCBncmFudHMuU2l6ZSgpIHsKCQkJb3V0ICs9ICJcbj4gWyFOT1RFXVxuPiBTaG93aW5nIHRoZSAiICsgc3RyY29udi5JdG9hKHNob3duKSArCgkJCQkiIG1vc3QgcmVjZW50IG9mICIgKyBzdHJjb252Lkl0b2EoZ3JhbnRzLlNpemUoKSkgKwoJCQkJIiBsaXZlIGdyYW50cyAoIiArIGl0b2EobmV4dElEKSArCgkJCQkiIGV2ZXIgY3JlYXRlZDsgcmV2b2tlZCBhbmQgcmVhcGVkIHJlY29yZHMgYXJlIHJlbW92ZWQpLiAiICsKCQkJCSJVc2UgR3JhbnRJbmZvKGlkKSBmb3IgYW55IHNwZWNpZmljIGdyYW50LlxuIgoJCX0KCQlpZiBleHBpcmVkID4gMCB7CgkJCW91dCArPSAiXG4jIyBLZWVwZXIgd29ya1xuXG5BbnlvbmUgbWF5IFJlYXAoaWQpIGFuIGV4cGlyZWQgZ3JhbnQgIiArCgkJCQkidG8gZnJlZSBpdHMgc2xvdCBhbmQgcmVjbGFpbSBpdHMgc3RvcmFnZSBkZXBvc2l0OiAiICsKCQkJCXN0cmNvbnYuSXRvYShleHBpcmVkKSArICIgb2YgdGhlIGdyYW50cyBhYm92ZSBhcmUgcmVhcGFibGUuXG4iCgkJfQoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlckdyYW50KHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHBhdGgsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IGludmFsaWQgZ3JhbnQgaWRcbiIKCX0KCXYgOj0gZ3JhbnRzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gdW5rbm93biBncmFudCBpZCAobmV2ZXIgY3JlYXRlZCwgb3IgcmV2b2tlZC9yZWFwZWQpXG4iCgl9CglnIDo9IHYuKCpncmFudCkKCWEsIGdlcnIgOj0gYm9vay5HZXQoZy5hbGxvd0lEKQoJaWYgZ2VyciAhPSBuaWwgewoJCS8vIFVucmVhY2hhYmxlOiBkcm9wKCkgcmVtb3ZlcyB0aGUgcmVjb3JkIGFuZCB0aGUgYWxsb3dhbmNlCgkJLy8gdG9nZXRoZXIsIGluIG9uZSBjYWxsLiBSZW5kZXJlZCByYXRoZXIgdGhhbiBwYW5pY2tlZCBzbyBhCgkJLy8gY29ycnVwdGVkIHBhaXIgaXMgdmlzaWJsZSBpbnN0ZWFkIG9mIGJyZWFraW5nIHRoZSBwYWdlLgoJCXJldHVybiAiPiBbIUNBVVRJT05dXG4+IGdyYW50ICMiICsgaXRvYShnLmlkKSArCgkJCSIgaGFzIG5vIGJhY2tpbmcgYWxsb3dhbmNlOyB0aGlzIGlzIGEgYnVnLiBSZWFzb246ICIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KGdlcnIuRXJyb3IoKSkgKyAiXG4iCgl9Cglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgoJb3V0IDo9ICIjIEdyYW50ICMiICsgaXRvYShnLmlkKQoJaWYgZy5sYWJlbCAhPSAiIiB7CgkJb3V0ICs9ICI6ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGcubGFiZWwpCgl9CglvdXQgKz0gIlxuXG4iCglvdXQgKz0gIi0gb3duZXI6IGAiICsgZy5vd25lci5TdHJpbmcoKSArICJgXG4iCglvdXQgKz0gIi0gZGVsZWdhdGU6IGAiICsgZy5zcGVuZGVyLlN0cmluZygpICsgImBcbiIKCXRlcm1zLCBwZW5kaW5nR292ZXJucyA6PSB0ZXJtc0F0KGEsIG5vdykKCW91dCArPSAiLSBwZXItd2luZG93IGNhcDogIiArIGl0b2EodGVybXMuUGVyUGVyaW9kKSArIERlbm9tICsgIlxuIgoJaWYgdGVybXMuUGVyaW9kTGVuZ3RoID09IDAgewoJCW91dCArPSAiLSB3aW5kb3c6IG9uZSBsaWZldGltZSB3aW5kb3c7IHRoZSBjYXAgbmV2ZXIgcmVmaWxsc1xuIgoJfSBlbHNlIHsKCQlvdXQgKz0gIi0gd2luZG93OiAiICsgaXRvYSh0ZXJtcy5QZXJpb2RMZW5ndGgpICsKCQkJIiBibG9ja3MsIGFuY2hvcmVkIGF0ICIgKyBpdG9hKGEuQW5jaG9yKSArCgkJCSIgKG5vdyBpbiB3aW5kb3cgIiArIGl0b2Eod2luZG93QXQoYSwgbm93KSkgKyAiKVxuIgoJfQoJaWYgdGVybXMuVG90YWwgPT0gMCB7CgkJb3V0ICs9ICItIGxpZmV0aW1lIGNhcDogbm9uZVxuIgoJfSBlbHNlIHsKCQlvdXQgKz0gIi0gbGlmZXRpbWUgY2FwOiAiICsgaXRvYSh0ZXJtcy5Ub3RhbCkgKyBEZW5vbSArCgkJCSIgKCIgKyBpdG9hKGEuU3BlbnRUb3RhbCkgKyAiIHVzZWQpXG4iCgl9CglpZiB0ZXJtcy5FeHBpcmVzQXQgPT0gMCB7CgkJb3V0ICs9ICItIGV4cGlyeTogbm9uZSAob25seSB0aGUgb3duZXIgY2FuIGVuZCBpdClcbiIKCX0gZWxzZSB7CgkJb3V0ICs9ICItIGV4cGlyeTogYmxvY2sgIiArIGl0b2EodGVybXMuRXhwaXJlc0F0KSArICJcbiIKCX0KCW91dCArPSAiLSBkcmF3IGZlZTogIiArIGJwcyhnLmZlZUJwcykgKyAiIChzbmFwc2hvdHRlZCBhdCBncmFudCB0aW1lKVxuIgoJb3V0ICs9ICItIHNwZW50IHRoaXMgd2luZG93OiAiICsgaXRvYShzcGVudEluV2luZG93KGEsIG5vdykpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZHJhd24gaW4gdG90YWw6ICIgKyBpdG9hKGcuZHJhd24pICsgRGVub20gKyAiIG92ZXIgIiArCgkJaXRvYShnLmRyYXdzKSArICIgZHJhd3NcbiIKCW91dCArPSAiLSBjcmVhdGVkIGF0IGJsb2NrOiAiICsgaXRvYShnLmNyZWF0ZWRBdCkgKyAiXG4iCglvdXQgKz0gIi0gY3VycmVudCBoZWlnaHQ6ICIgKyBpdG9hKG5vdykgKyAiXG5cbiIKCglhdXRob3JpemVkIDo9IGEuUmVtYWluaW5nKG5vdykKCXBvb2wgOj0gcG9vbE9mKGcub3duZXIuU3RyaW5nKCkpCglvdXQgKz0gIiMjIFdoYXQgY2FuIGJlIGRyYXduIHJpZ2h0IG5vd1xuXG4iCglvdXQgKz0gIi0gYXV0aG9yaXplZCBieSB0aGUgdGVybXM6ICIgKyBpdG9hKGF1dGhvcml6ZWQpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gb3duZXIncyB1bnNwZW50IHBvb2w6ICIgKyBpdG9hKHBvb2wpICsgRGVub20gKyAiXG4iCglkcmF3YWJsZSA6PSBhdXRob3JpemVkCglpZiBwb29sIDwgZHJhd2FibGUgewoJCWRyYXdhYmxlID0gcG9vbAoJfQoJb3V0ICs9ICItICoqZHJhd2FibGU6ICIgKyBpdG9hKGRyYXdhYmxlKSArIERlbm9tICsgIioqICh0aGUgbGVzc2VyIG9mIHRoZSB0d28pXG5cbiIKCglzd2l0Y2ggewoJY2FzZSBhLklzRXhwaXJlZChub3cpOgoJCW91dCArPSAiVGhpcyBncmFudCBoYXMgKipleHBpcmVkKiouIEFueW9uZSBtYXkgUmVhcCgiICsgaXRvYShnLmlkKSArCgkJCSIpIHRvIGZyZWUgaXRzIHNsb3QgYW5kIHJlY2xhaW0gaXRzIHN0b3JhZ2UgZGVwb3NpdC5cbiIKCWNhc2UgZHJhd2FibGUgPT0gMCAmJiBhdXRob3JpemVkID09IDA6CgkJb3V0ICs9ICJOb3RoaW5nIGF1dGhvcml6ZWQgYXQgdGhpcyBoZWlnaHQg4oCUIHRoZSB3aW5kb3cgY2FwIGlzIHNwZW50LCAiICsKCQkJInRoZSBsaWZldGltZSBjYXAgaXMgcmVhY2hlZCwgb3IgdGhlIGdyYW50IGhhcyBub3Qgc3RhcnRlZC5cbiIKCWNhc2UgZHJhd2FibGUgPT0gMDoKCQlvdXQgKz0gIkF1dGhvcml6ZWQgYnV0ICoqbm90IGZ1bmRlZCoqOiB0aGUgb3duZXIncyBwb29sIGNhbm5vdCBjb3ZlciAiICsKCQkJImEgZHJhdy4gQSBidWRnZXQgaXMgYXV0aG9yaXR5LCBub3QgYSByZXNlcnZhdGlvbi5cbiIKCWRlZmF1bHQ6CgkJb3V0ICs9ICJUaGUgZGVsZWdhdGUgbWF5IERyYXcoIiArIGl0b2EoZy5pZCkgKyAiLCBhbW91bnQpIHVwIHRvIHRoZSAiICsKCQkJImRyYXdhYmxlIGZpZ3VyZSwgdGhlbiBDbGFpbSgpIHRvIHJlY2VpdmUgaXQuXG4iCgl9CglpZiBhLkhhc1BlbmRpbmcgewoJCWlmIHBlbmRpbmdHb3Zlcm5zIHsKCQkJb3V0ICs9ICJcbj4gWyFOT1RFXVxuPiBBICoqbG9vc2VyKiogYW1lbmRtZW50IGNyb3NzZWQgaXRzIHdpbmRvdyAiICsKCQkJCSJib3VuZGFyeSBhbmQgTk9XIEdPVkVSTlM7IHRoZSB0ZXJtcyBhYm92ZSBhcmUgdGhlIGFtZW5kZWQgIiArCgkJCQkib25lcy4gVGhlIHN0b3JlZCByZWNvcmQgdXBkYXRlcyBvbiB0aGUgbmV4dCBkcmF3IG9yICIgKwoJCQkJImFtZW5kbWVudCwgd2hpY2ggY2hhbmdlcyBub3RoaW5nIGFib3V0IHdoYXQgaXMgZW5mb3JjZWQuXG4iCgkJfSBlbHNlIHsKCQkJb3V0ICs9ICJcbj4gWyFOT1RFXVxuPiBBICoqbG9vc2VyKiogYW1lbmRtZW50IGlzIHF1ZXVlZCBhbmQgdGFrZXMgIiArCgkJCQkiZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeTogcGVyLXdpbmRvdyBjYXAgIiArCgkJCQlpdG9hKGEuUGVuZGluZy5QZXJQZXJpb2QpICsgRGVub20gKyAiLCBsaWZldGltZSBjYXAgIiArCgkJCQlpdG9hKGEuUGVuZGluZy5Ub3RhbCkgKyAiLCBleHBpcnkgIiArIGl0b2EoYS5QZW5kaW5nLkV4cGlyZXNBdCkgKwoJCQkJIiAoMCBtZWFucyBub25lKS4gVW50aWwgdGhlbiB0aGUgdGVybXMgYWJvdmUgYXJlIHdoYXQgZ292ZXJuLlxuIgoJCX0KCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmZ1bmMgbXVzdEdldChpZCBpbnQ2NCkgKmdyYW50IHsKCXYgOj0gZ3JhbnRzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gZ3JhbnQgaWQiKQoJfQoJcmV0dXJuIHYuKCpncmFudCkKfQoKLy8gbXVzdEFsbG93YW5jZSBmZXRjaGVzIHRoZSBzcGVuZGJvb2sgYWxsb3dhbmNlIGJlaGluZCBhIGdyYW50LiBUaGUgcGFpcgovLyBpcyBjcmVhdGVkIGFuZCByZW1vdmVkIHRvZ2V0aGVyLCBzbyBhIG1pc3NpbmcgYWxsb3dhbmNlIGlzIGEgYnVnIGluCi8vIHRoaXMgcmVhbG0gcmF0aGVyIHRoYW4gYSB1c2VyIGVycm9yLCBhbmQgaXQgcGFuaWNzIHJhdGhlciB0aGFuCi8vIHJlcG9ydGluZyBhIHplcm8gdmFsdWUgdGhhdCBhIHJlYWRlciB3b3VsZCB0YWtlIGZvciAibm8gYXV0aG9yaXR5Ii4KZnVuYyBtdXN0QWxsb3dhbmNlKGcgKmdyYW50KSBzcGVuZGJvb2suQWxsb3dhbmNlIHsKCWEsIGVyciA6PSBib29rLkdldChnLmFsbG93SUQpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYQp9CgovLyB3aW5kb3dBdCByZXR1cm5zIHRoZSBhbmNob3JlZCB3aW5kb3cgaW5kZXggY29udGFpbmluZyBub3csIGFuZAovLyBzcGVudEluV2luZG93IHdoYXQgdGhhdCB3aW5kb3cgaGFzIHNwZW50LgovLwovLyBUaGVzZSBkdXBsaWNhdGUgYSBsaW5lIG9mIHNwZW5kYm9vaywgYW5kIHRoZSBkdXBsaWNhdGlvbiBpcyBkZWxpYmVyYXRlLAovLyBib3VuZGVkLCBhbmQgd29ydGgganVzdGlmeWluZyBiZWNhdXNlIHRoZSBwcmltaXRpdmUncyBvd24gYXQoKSBjb21tZW50Ci8vIHdhcm5zIGFnYWluc3QgZXhhY3RseSB0aGlzLiBXaGF0IGlzIE5PVCByZWltcGxlbWVudGVkIGlzIHRoZSBwYXJ0IHRoYXQKLy8gd2FybmluZyBpcyBhYm91dDogd2hpY2ggdGVybXMgYXJlIGluIGZvcmNlIGFmdGVyIGEgYm91bmRhcnksIGFuZAovLyB0aGVyZWZvcmUgZXZlcnkgYXV0aG9yaXR5IGZpZ3VyZSB0aGlzIHJlYWxtIHJlcG9ydHMg4oCUIFJlbWFpbmluZyBhbmQKLy8gRHJhd2FibGUgYm90aCBjYWxsIHRocm91Z2ggdG8gdGhlIHByaW1pdGl2ZSwgYW5kIG5vdGhpbmcgaGVyZSBzZWNvbmQtCi8vIGd1ZXNzZXMgdGhlbS4KLy8KLy8gV2hhdCBpcyBjb3BpZWQgaXMgcHVyZSBpbmRleCBhcml0aG1ldGljIG92ZXIgdGhyZWUgRVhQT1JURUQgZmllbGRzIHBsdXMKLy8gdGhlIGFscmVhZHktZG9jdW1lbnRlZCBmYWN0IHRoYXQgdGhlIGluLXdpbmRvdyBzcGVuZCBSRVNFVFMgcmF0aGVyIHRoYW4KLy8gY2Fycmllcy4gVGhlIGFsdGVybmF0aXZlIGlzIHdvcnNlIHRoYW4gdGhlIGR1cGxpY2F0aW9uOiBBbGxvd2FuY2UncwovLyBXaW5kb3dJbmRleCBhbmQgU3BlbnRXaW5kb3cgYXJlIHRoZSBsYXN0LVdSSVRURU4gcGFpciwgc28gYmV0d2VlbiBhCi8vIGJvdW5kYXJ5IGFuZCB0aGUgbmV4dCBkcmF3IHRoZXkgZGVzY3JpYmUgYSB3aW5kb3cgdGhlIGNoYWluIGhhcyBsZWZ0LCBhbmQKLy8gYSBSZW5kZXIgcHVibGlzaGluZyB0aGVtIHdvdWxkIHByaW50ICJzcGVudCB0aGlzIHdpbmRvdzogMTAwMDAwIgovLyBpbW1lZGlhdGVseSBhYm92ZSAiYXV0aG9yaXplZCBieSB0aGUgdGVybXM6IDEwMDAwMCIuCi8vCi8vIFRoZSB0d28gYXJlIHBpbm5lZCB0byB0aGUgcHJpbWl0aXZlIGJ5IFRlc3RXaW5kb3dSZWZpbGxzQXRBbmNob3JlZEJvdW5kYXJ5Ci8vIHJhdGhlciB0aGFuIGJ5IGluc3BlY3Rpb246IGl0IGRyYXdzIGFmdGVyIGNyb3NzaW5nIGEgYm91bmRhcnkgYW5kIGFzc2VydHMKLy8gc3BlbnRXaW5kb3cgZXF1YWxzIHRoYXQgZHJhdywgd2hpY2ggY2FuIG9ubHkgaG9sZCBpZiB3aW5kb3dBdCBhZ3JlZWQgd2l0aAovLyBzcGVuZGJvb2sncyBvd24gaW5kZXggYXQgdGhlIG1vbWVudCBvZiB0aGUgd3JpdGUuCi8vIHRlcm1zQXQgbWlycm9ycyBzcGVuZGJvb2sncyBvd24gYXQoKSByZXNvbHV0aW9uIGZvciBESVNQTEFZOiBhIHF1ZXVlZAovLyBsb29zZW5pbmcgR09WRVJOUyBlbmZvcmNlbWVudCBmcm9tIHRoZSBmaXJzdCBib3VuZGFyeSBhZnRlciBpdCB3YXMKLy8gcXVldWVkLCB3aGV0aGVyIG9yIG5vdCBhbnkgd3JpdGUgaGFzIG9ic2VydmVkIHRoZSByb2xsLiBUaGUgcGFnZSBtdXN0Ci8vIGRlcml2ZSBpdHMgdGVybXMgZXhhY3RseSBhcyB0aGUgZ2F0ZSBkb2VzLCBvciBpdCB1bmRlcnN0YXRlcyB0aGUKLy8gb3duZXIncyBleHBvc3VyZSBpbiB0aGUgd2luZG93IHdoZXJlIHRoYXQgdW5kZXJzdGF0ZW1lbnQgbWF0dGVycyBtb3N0Ci8vIChhdWRpdCAyMDI2LTExLTA0LCBOMSAtLSB0aGUgcmVhbG0gZml4ZWQgdGhpcyBzdGFsZW5lc3MgY2xhc3MgZm9yCi8vIFNwZW50V2luZG93L1dpbmRvd0luZGV4IHZpYSB3aW5kb3dBdC9zcGVudEluV2luZG93IGFuZCBsZWZ0IHRoZSBUZXJtcwovLyBkaXNwbGF5IHVuY292ZXJlZCkuIFNlY29uZCByZXR1cm4gcmVwb3J0cyB3aGV0aGVyIHRoZSBwZW5kaW5nIHRlcm1zCi8vIGFyZSB0aGUgZ292ZXJuaW5nIG9uZXMuCmZ1bmMgdGVybXNBdChhIHNwZW5kYm9vay5BbGxvd2FuY2UsIG5vdyBpbnQ2NCkgKHNwZW5kYm9vay5UZXJtcywgYm9vbCkgewoJaWYgYS5IYXNQZW5kaW5nICYmIHdpbmRvd0F0KGEsIG5vdykgIT0gYS5XaW5kb3dJbmRleCB7CgkJcmV0dXJuIGEuUGVuZGluZywgdHJ1ZQoJfQoJcmV0dXJuIGEuVGVybXMsIGZhbHNlCn0KCmZ1bmMgd2luZG93QXQoYSBzcGVuZGJvb2suQWxsb3dhbmNlLCBub3cgaW50NjQpIGludDY0IHsKCWlmIGEuVGVybXMuUGVyaW9kTGVuZ3RoID09IDAgfHwgbm93IDwgYS5BbmNob3IgewoJCXJldHVybiAwCgl9CglyZXR1cm4gKG5vdyAtIGEuQW5jaG9yKSAvIGEuVGVybXMuUGVyaW9kTGVuZ3RoCn0KCmZ1bmMgc3BlbnRJbldpbmRvdyhhIHNwZW5kYm9vay5BbGxvd2FuY2UsIG5vdyBpbnQ2NCkgaW50NjQgewoJaWYgd2luZG93QXQoYSwgbm93KSAhPSBhLldpbmRvd0luZGV4IHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGEuU3BlbnRXaW5kb3cKfQoKLy8gZHJvcCByZW1vdmVzIGEgZ3JhbnQgcmVjb3JkIGFuZCBkZWNyZW1lbnRzIGl0cyBvd25lcidzIGxpdmUgY291bnQuIFRoZQovLyBhbGxvd2FuY2UgaXRzZWxmIGlzIHJlbW92ZWQgYnkgdGhlIHNwZW5kYm9vayBjYWxsIHRoYXQgcHJlY2VkZXMgZXZlcnkKLy8gY2FsbGVyIG9mIHRoaXMgaGVscGVyLgpmdW5jIGRyb3AoZyAqZ3JhbnQpIHsKCWdyYW50cy5SZW1vdmUocGFkSUQoZy5pZCkpCglkZWNPd25lck9wZW4oZy5vd25lci5TdHJpbmcoKSkKfQoKZnVuYyBsYWJlbE9yKGcgKmdyYW50KSBzdHJpbmcgewoJaWYgZy5sYWJlbCA9PSAiIiB7CgkJcmV0dXJuICIobm8gbGFiZWwpIgoJfQoJcmV0dXJuIGcubGFiZWwKfQoKZnVuYyBwb29sT2Yoa2V5IHN0cmluZykgaW50NjQgewoJdiA6PSBwb29scy5HZXQoa2V5KQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdi4oaW50NjQpCn0KCmZ1bmMgc2V0UG9vbChrZXkgc3RyaW5nLCBuIGludDY0KSB7CglpZiBuIDw9IDAgewoJCXBvb2xzLlJlbW92ZShrZXkpCgkJcmV0dXJuCgl9Cglwb29scy5TZXQoa2V5LCBuKQp9CgpmdW5jIG93bmVyT3BlbihrZXkgc3RyaW5nKSBpbnQ2NCB7Cgl2IDo9IG9wZW5CeU93bmVyLkdldChrZXkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB2LihpbnQ2NCkKfQoKZnVuYyBzZXRPd25lck9wZW4oa2V5IHN0cmluZywgbiBpbnQ2NCkgewoJaWYgbiA8PSAwIHsKCQlvcGVuQnlPd25lci5SZW1vdmUoa2V5KQoJCXJldHVybgoJfQoJb3BlbkJ5T3duZXIuU2V0KGtleSwgbikKfQoKZnVuYyBkZWNPd25lck9wZW4oa2V5IHN0cmluZykgeyBzZXRPd25lck9wZW4oa2V5LCBvd25lck9wZW4oa2V5KS0xKSB9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CgpmdW5jIGJvb2xzdHIoYiBib29sKSBzdHJpbmcgewoJaWYgYiB7CgkJcmV0dXJuICJ0cnVlIgoJfQoJcmV0dXJuICJmYWxzZSIKfQoKLy8gYnBzIHJlbmRlcnMgYSBiYXNpcy1wb2ludCBmaWd1cmUgYXMgYSBodW1hbiBwZXJjZW50YWdlLCBleGFjdGx5LgpmdW5jIGJwcyhuIGludDY0KSBzdHJpbmcgewoJd2hvbGUgOj0gbiAvIDEwMAoJZnJhYyA6PSBuICUgMTAwCglpZiBmcmFjID09IDAgewoJCXJldHVybiBpdG9hKHdob2xlKSArICIlIgoJfQoJaWYgZnJhYyUxMCA9PSAwIHsKCQlyZXR1cm4gaXRvYSh3aG9sZSkgKyAiLiIgKyBpdG9hKGZyYWMvMTApICsgIiUiCgl9CglwYWQgOj0gIiIKCWlmIGZyYWMgPCAxMCB7CgkJcGFkID0gIjAiCgl9CglyZXR1cm4gaXRvYSh3aG9sZSkgKyAiLiIgKyBwYWQgKyBpdG9hKGZyYWMpICsgIiUiCn0KCi8vIHBhZElEIGVuY29kZXMgYW4gaWQgc28gYXZsJ3MgbGV4aWNhbCBvcmRlciBtYXRjaGVzIG51bWVyaWMgb3JkZXIuCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWNvbnN0IHdpZHRoID0gMjAKCWlmIGxlbihzKSA+PSB3aWR0aCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiB6ZXJvc1s6d2lkdGgtbGVuKHMpXSArIHMKfQoKY29uc3QgemVyb3MgPSAiMDAwMDAwMDAwMDAwMDAwMDAwMDAiCgovLyBjaGVja2VkQWRkIHJldHVybnMgYStiIGFuZCByZXBvcnRzIHdoZXRoZXIgdGhlIGFkZGl0aW9uIGRpZCBub3QKLy8gb3ZlcmZsb3cgaW50NjQuCmZ1bmMgY2hlY2tlZEFkZChhLCBiIGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXN1bSA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHN1bSA8IGEpIHx8IChiIDwgMCAmJiBzdW0gPiBhKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCB0cnVlCn0KGpH8AgoQYnVkZ2V0c190ZXN0LmdubxL7+wJwYWNrYWdlIGJ1ZGdldHMKCmltcG9ydCAoCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJjaGFpbiIKCgkiZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2NvaW5pbyIKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCnZhciAoCglvd25lcjEgICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJnb3duZXIxIikKCW93bmVyMiAgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYmdvd25lcjIiKQoJZGVsZWdhdGUxID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJiZ2RlbGVnMSIpCglkZWxlZ2F0ZTIgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJnZGVsZWcyIikKCW1hbGxvcnkgICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYmdtYWxsb3J5IikKKQoKLy8gSEFSTkVTUyBOT1RFUywgY2FycmllZCBmcm9tIHRoZSBjcm93ZGZ1bmQsIHRyZWFzdXJ5X2JvYXJkIGFuZCB2ZXN0aW5nCi8vIHN1aXRlcyAobWVhc3VyZWQgdGhlcmUsIHJlbGllZCBvbiBoZXJlKToKLy8KLy8gICAtIHRlc3RpbmcuU2V0UmVhbG0gcmVjb3JkcyB0aGUgb3ZlcnJpZGUgcGVyIEZSQU1FIElOREVYOiBzdGFnZSB0aGUKLy8gICAgIGNhbGxlciBJTkxJTkUgaW4gdGhpcyB0ZXN0IGZ1bmN0aW9uJ3Mgb3duIGZyYW1lIGJlZm9yZSBhIHVhc3NlcnQKLy8gICAgIGNhbGwsIG9yIGluc2lkZSBhIGhlbHBlciB0aGF0IHN0YWdlcyBhbmQgY2FsbHMgaW4gb25lIGZyYW1lIG9mIGl0cwovLyAgICAgb3duLiBOZXZlciBpbnNpZGUgYSB1YXNzZXJ0IGNsb3N1cmUg4oCUIHRoYXQgc3RhZ2luZyBkb2VzIG5vdCB0YWtlLgovLwovLyAgIC0gdGVzdGluZy5Ta2lwSGVpZ2h0cyBSRVBMQUNFUyB0aGUgd2hvbGUgY29udGV4dCAoT3JpZ2luQ2FsbGVyLAovLyAgICAgQ3VycmVudFJlYWxtLCBPcmlnaW5TZW5kIGluY2x1ZGVkKS4gUmUtc3RhZ2UgYWZ0ZXIgZXZlcnkgc2tpcC4KLy8KLy8gICAtIFJlYWxtIGdsb2JhbHMgUEVSU0lTVCBhY3Jvc3MgdGVzdHMgd2hpbGUgYmFua2VyIHN0YXRlIHJlc2V0cyBwZXIKLy8gICAgIHRlc3QuIGJlZ2luKCkgZGlzYXJtcyBhbnkgbGVmdG92ZXIgZW52ZWxvcGUgYW5kIHJlLXNlZWRzIHRoZQovLyAgICAgcmVhbG0ncyBiYW5rIHRvIGl0cyBjYXJyaWVkIGxpYWJpbGl0aWVzLCBzbyBzb2x2ZW5jeSBpcyBhc3NlcnRlZCBpbgovLyAgICAgREVMVEEgZm9ybSBhbmQgZXZlcnkgdGVzdCB0aWRpZXMgdXAgYWZ0ZXIgaXRzZWxmLgovLwovLyAgIC0gQSBwYW5pYyBjYXVnaHQgYnkgdWFzc2VydCBkb2VzIE5PVCByb2xsIGJhY2sgcmVhbG0gZ2xvYmFscyBoZXJlLAovLyAgICAgd2hlcmVhcyBvbi1jaGFpbiB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gcmV2ZXJ0cy4gRXZlcnkgYWJvcnQKLy8gICAgIGFzc2VydGVkIGJlbG93IGhhcHBlbnMgc3RyaWN0bHkgQkVGT1JFIHRoaXMgcmVhbG0gd3JpdGVzIHN0YXRlLCBhbmQKLy8gICAgIHRoZSBvbmUgY2FzZSB3aGVyZSB0aGF0IGlzIHRoZSBQT0lOVCBvZiB0aGUgdGVzdAovLyAgICAgKFRlc3REcmF3U29sdmVuY3lSZWZ1c2FsQ29uc3VtZXNOb3RoaW5nKSBhc3NlcnRzIHRoZSB1bnRvdWNoZWQKLy8gICAgIHN0YXRlIGRpcmVjdGx5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYSByb2xsYmFjayB0aGF0IGRvZXMgbm90Ci8vICAgICBoYXBwZW4gaW4gdGhpcyBoYXJuZXNzLgovLwovLyAgIC0gVGhlIFNFTkQgZW52ZWxvcGUgaXMgcHJvY2Vzcy1nbG9iYWw6IGEgc3RhZ2VkIGVudmVsb3BlIG11c3QgYmUKLy8gICAgIGNsZWFyZWQgKFNldE9yaWdpblNlbmQobmlsKSkgYmVmb3JlIHRoZSBuZXh0IG5vbi1wYXlhYmxlIGNhbGwsIG9yCi8vICAgICByZWplY3RTdHJheVNlbmQgZmlyZXMgYW5kIHRoZSB0ZXN0IGFzc2VydHMgdGhlIGhhcm5lc3MgbGVhayBpbnN0ZWFkCi8vICAgICBvZiB0aGUgZ3VhcmQuCi8vCi8vIHVuc2FmZS5DdXJyZW50UmVhbG0oKSBpcyBub3QgYXZhaWxhYmxlIHRvIGEgdW5pdCB0ZXN0LCBzbyBgc2VsZmAgaXMKLy8gc2VlZGVkIGZyb20gdGhlIHBhY2thZ2UgcGF0aCB0aGUgc2FtZSB3YXkgdGhlIGNoYWluIGRlcml2ZXMgaXQuCmZ1bmMgaW5pdCgpIHsKCXNlbGYgPSBjaGFpbi5QYWNrYWdlQWRkcmVzcygKCQkiZ25vLmxhbmQvci9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L2J1ZGdldHMiKQp9Cgp0eXBlIGJhc2VsaW5lIHN0cnVjdCB7CgloZWxkICAgaW50NjQKCXBvb2xlZCBpbnQ2NAoJY3JlZGl0IGludDY0CglmZWVzICAgaW50NjQKfQoKZnVuYyBiZWdpbigpIGJhc2VsaW5lIHsKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglpZiBsIDo9IExpYWJpbGl0aWVzKCk7IGwgPiAwIHsKCQl0ZXN0aW5nLklzc3VlQ29pbnMoQWRkcmVzcygpLCB1Z25vdChsKSkKCX0KCXJldHVybiBiYXNlbGluZXsKCQloZWxkOiAgIEhlbGQoKSwKCQlwb29sZWQ6IFRvdGFsUG9vbGVkKCksCgkJY3JlZGl0OiBVbmNsYWltZWRDcmVkaXQoKSwKCQlmZWVzOiAgIEZlZXNBY2NydWVkKCksCgl9Cn0KCmZ1bmMgdWdub3QobiBpbnQ2NCkgY2hhaW4uQ29pbnMgewoJcmV0dXJuIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4oRGVub20sIG4pKQp9CgovLyBhc3NlcnRTb2x2ZW50IGFzc2VydHMgdGhlIHR3byBoYWx2ZXMgb2YgSCA9PSBQICsgTCArIFMgdGhhdCBjYW4gYWN0dWFsbHkKLy8gRkFJTC4gVGhlIGlkZW50aXR5IGl0c2VsZiBpcyBkZWZpbml0aW9uYWwgaGVyZSwgYmVjYXVzZSBTdXJwbHVzKCkgaXMKLy8gZGVmaW5lZCBhcyBIZWxkKCkgLSBMaWFiaWxpdGllcygpLCBzbyBhc3NlcnRpbmcgaXQgd291bGQgYmUgYSB0YXV0b2xvZ3kKLy8gZHJlc3NlZCBhcyBhIGNoZWNrLiBXaGF0IGNhbiBmYWlsIGlzIHRoYXQgdGhlIHJlYWxtIG93ZXMgbW9yZSB0aGFuIGl0Ci8vIGhvbGRzLCBhbmQgdGhhdCBMIGRlY29tcG9zZXMgZXhhY3RseSBpbnRvIGRlbGVnYXRlIGNyZWRpdCBwbHVzIHRoZSBmZWUKLy8gcG90IOKAlCBuZWl0aGVyIG9mIHdoaWNoIGZvbGxvd3MgZnJvbSBhbnkgZGVmaW5pdGlvbiBpbiB0aGlzIGZpbGUuCi8vIEl0IGFsc28gcmUtZGVyaXZlcyB0aGUgUCB0ZXJtIHRoZSBzbG93IHdheS4gdG90YWxQb29sZWQgaXMgbWFpbnRhaW5lZAovLyBPKDEpIGZvciBSZW5kZXIncyBzYWtlLCBzbyBpdCBpcyBhIENBQ0hFIG9mIHRoZSBwb29scyB0cmVlLCBhbmQgbm90aGluZwovLyBpbiB0aGUgcmVhbG0gZXZlciByZWNvbXB1dGVzIGl0IOKAlCBleGFjdGx5IHRoZSBzaGFwZSB0aGF0IGRyaWZ0cyBzaWxlbnRseS4KLy8gU2Fib3RhZ2UgZm91bmQgdGhpcyBnYXAgcmF0aGVyIHRoYW4gcmV2aWV3OiBkaXNhYmxpbmcgdGhlIHBlci1vd25lciBkZWJpdAovLyBpbiBEcmF3IHdoaWxlIGxlYXZpbmcgdG90YWxQb29sZWQgY29ycmVjdCB3YXMgZGV0ZWN0ZWQgb25seSBieSBhIGxhdGVyCi8vIG5hdGl2ZS1HbyBiYW5rZXIgcGFuaWMsIG5ldmVyIGJ5IGFuIGFzc2VydGlvbi4KZnVuYyBhc3NlcnRTb2x2ZW50KHQgKnRlc3RpbmcuVCkgewoJdWFzc2VydC5UcnVlKHQsIEhlbGQoKSA+PSBMaWFiaWxpdGllcygpKQoJdWFzc2VydC5FcXVhbCh0LCBUb3RhbFBvb2xlZCgpK1VuY2xhaW1lZENyZWRpdCgpK0ZlZXNBY2NydWVkKCksIExpYWJpbGl0aWVzKCkpCgoJc3VtIDo9IGludDY0KDApCglwb29scy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCW4gOj0gdi4oaW50NjQpCgkJLy8gc2V0UG9vbCByZW1vdmVzIGEgemVyb2VkIGVudHJ5IHJhdGhlciB0aGFuIHN0b3JpbmcgaXQsIHNvIGV2ZXJ5CgkJLy8gc3Vydml2aW5nIGVudHJ5IG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmUuCgkJdWFzc2VydC5UcnVlKHQsIG4gPiAwKQoJCXN1bSArPSBuCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCBzdW0sIFRvdGFsUG9vbGVkKCkpCn0KCi8vIGZ1bmRBcyBzdGFnZXMgYSBkaXJlY3QgRU9BIGNhbGwgd2l0aCAtc2VuZCBhbmQgbWlycm9ycyB0aGUgZW52ZWxvcGUgaW50bwovLyB0aGUgcmVhbG0ncyBiYW5rLCBhcyB0aGUgY2hhaW4gd291bGQuCmZ1bmMgZnVuZEFzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCBhbW91bnQgaW50NjQpIGludDY0IHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoYW1vdW50KSkKCXRlc3RpbmcuSXNzdWVDb2lucyhBZGRyZXNzKCksIHVnbm90KGFtb3VudCkpCgluIDo9IEZ1bmQoY3Jvc3MoY3VyKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCglyZXR1cm4gbgp9CgpmdW5jIGdyYW50QXMoY3VyIHJlYWxtLCBmcm9tLCBzcGVuZGVyIGFkZHJlc3MsCglwZXJQZXJpb2QsIHBlcmlvZExlbmd0aCwgdG90YWwsIGV4cGlyZXNBdCBpbnQ2NCkgaW50NjQgewoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShmcm9tKSkKCXJldHVybiBHcmFudChjcm9zcyhjdXIpLCBzcGVuZGVyLCAiIiwgcGVyUGVyaW9kLCBwZXJpb2RMZW5ndGgsIHRvdGFsLCBleHBpcmVzQXQpCn0KCmZ1bmMgZHJhd0FzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzLCBpZCwgYW1vdW50IGludDY0KSBpbnQ2NCB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyb20pKQoJcmV0dXJuIERyYXcoY3Jvc3MoY3VyKSwgaWQsIGFtb3VudCkKfQoKZnVuYyBjbGFpbUFzKGN1ciByZWFsbSwgZnJvbSBhZGRyZXNzKSBpbnQ2NCB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyb20pKQoJcmV0dXJuIENsYWltKGNyb3NzKGN1cikpCn0KCmZ1bmMgcmV2b2tlQXMoY3VyIHJlYWxtLCBmcm9tIGFkZHJlc3MsIGlkIGludDY0KSB7Cgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGZyb20pKQoJUmV2b2tlKGNyb3NzKGN1ciksIGlkKQp9CgpmdW5jIHdpdGhkcmF3QWxsQXMoY3VyIHJlYWxtLCBmcm9tIGFkZHJlc3MpIGludDY0IHsKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZnJvbSkpCglyZXR1cm4gV2l0aGRyYXdQb29sQWxsKGNyb3NzKGN1cikpCn0KCmZ1bmMgYmFsYW5jZU9mKGFkZHIgYWRkcmVzcykgaW50NjQgewoJcmV0dXJuIGNvaW5pby5IZWxkQXQoYWRkciwgRGVub20pCn0KCi8vIC0tLSB0aGUgcG9vbCAtLS0KCmZ1bmMgVGVzdEZ1bmRNYWtlc0FuT3duZXIoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgUG9vbE9mKG93bmVyMSkpCgoJcG9vbCA6PSBmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmcsIHBvb2wpCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmcsIFBvb2xPZihvd25lcjEpKQoJdWFzc2VydC5FcXVhbCh0LCBiLnBvb2xlZCtNaW5GdW5kaW5nLCBUb3RhbFBvb2xlZCgpKQoJdWFzc2VydC5FcXVhbCh0LCBiLmhlbGQrTWluRnVuZGluZywgSGVsZCgpKQoJdWFzc2VydC5FcXVhbCh0LCBiLmNyZWRpdCwgVW5jbGFpbWVkQ3JlZGl0KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIuZmVlcywgRmVlc0FjY3J1ZWQoKSkKCWFzc2VydFNvbHZlbnQodCkKCgkvLyBGdW5kaW5nIGFnYWluIGFjY3VtdWxhdGVzIGludG8gdGhlIHNhbWUgcG9vbC4KCXBvb2wgPSBmdW5kQXMoY3VyLCBvd25lcjEsIDIqTWluRnVuZGluZykKCXVhc3NlcnQuRXF1YWwodCwgMypNaW5GdW5kaW5nLCBwb29sKQoJdWFzc2VydC5FcXVhbCh0LCBiLnBvb2xlZCszKk1pbkZ1bmRpbmcsIFRvdGFsUG9vbGVkKCkpCgoJLy8gQSBzZWNvbmQgb3duZXIncyBwb29sIGlzIGluZGVwZW5kZW50LgoJZnVuZEFzKGN1ciwgb3duZXIyLCBNaW5GdW5kaW5nKQoJdWFzc2VydC5FcXVhbCh0LCAzKk1pbkZ1bmRpbmcsIFBvb2xPZihvd25lcjEpKQoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLCBQb29sT2Yob3duZXIyKSkKCWFzc2VydFNvbHZlbnQodCkKCgl1YXNzZXJ0LkVxdWFsKHQsIDMqTWluRnVuZGluZywgd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmcsIHdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjIpKQoJdWFzc2VydC5FcXVhbCh0LCBiLnBvb2xlZCwgVG90YWxQb29sZWQoKSkKCS8vIHNldFBvb2wgcmVtb3ZlcyBhIHplcm9lZCBlbnRyeSByYXRoZXIgdGhhbiBzdG9yaW5nIDAuCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQb29sT2Yob3duZXIxKSkKfQoKZnVuYyBUZXN0RnVuZEd1YXJkcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoKCS8vIGNvaW5pbydzIHJlY2VpcHQgc2hhcGU6IGEgcmVhbG0tcm91dGVkIHBheW1lbnQgaXMgcmVmdXNlZCBieSB0aGUKCS8vIHByaW1pdGl2ZSwgbm90IGJ5IGFueXRoaW5nIHRoaXMgZmlsZSBjb3VsZCBmb3JnZXQgdG8gd3JpdGUuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3Q29kZVJlYWxtKCJnbm8ubGFuZC9yL2RlbW8vYXR0YWNrZXIiKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChNaW5GdW5kaW5nKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJjb2luaW86IHBheW1lbnQgbXVzdCBiZSBhIGRpcmVjdCBFT0EgY2FsbCB3aXRoIC1zZW5kIChyZWFsbXMgYW5kIG1ha2V0eC1ydW4gYXJlIHJlamVjdGVkKSIsCgkJZnVuYygpIHsgRnVuZChjcm9zcyhjdXIpKSB9KQoJdGVzdGluZy5TZXRPcmlnaW5TZW5kKG5pbCkKCgkvLyBXcm9uZyBkZW5vbWluYXRpb24uCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQoY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbigiZm9vY29pbiIsIE1pbkZ1bmRpbmcpKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiY29pbmlvOiBzZW5kIGV4YWN0bHkgb25lIGNvaW4gdHlwZTogdWdub3QiLAoJCWZ1bmMoKSB7IEZ1bmQoY3Jvc3MoY3VyKSkgfSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZChuaWwpCgoJLy8gTm8gZW52ZWxvcGUgYXQgYWxsLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJjb2luaW86IHNlbmQgZXhhY3RseSBvbmUgY29pbiB0eXBlOiB1Z25vdCIsCgkJZnVuYygpIHsgRnVuZChjcm9zcyhjdXIpKSB9KQoKCS8vIEJlbG93IHRoZSBtaW5pbXVtLiBOb3QgaXNzdWVkIGludG8gdGhlIGJhbmssIHNvIHRoZSByZWZ1c2VkIGNhbGwKCS8vIGxlYXZlcyBubyBzdXJwbHVzIGJlaGluZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXRlc3RpbmcuU2V0T3JpZ2luU2VuZCh1Z25vdChNaW5GdW5kaW5nIC0gMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImZ1bmQgYXQgbGVhc3QgMTAwMDAwMHVnbm90IiwKCQlmdW5jKCkgeyBGdW5kKGNyb3NzKGN1cikpIH0pCgl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFBvb2xPZihvd25lcjEpKQoJYXNzZXJ0U29sdmVudCh0KQp9CgpmdW5jIFRlc3RXaXRoZHJhd1Bvb2xJc1VuY29uZGl0aW9uYWwoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCAzKk1pbkZ1bmRpbmcpCgliZWZvcmUgOj0gYmFsYW5jZU9mKG93bmVyMSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCglsZWZ0IDo9IFdpdGhkcmF3UG9vbChjcm9zcyhjdXIpLCBNaW5GdW5kaW5nKQoJdWFzc2VydC5FcXVhbCh0LCAyKk1pbkZ1bmRpbmcsIGxlZnQpCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZStNaW5GdW5kaW5nLCBiYWxhbmNlT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5wb29sZWQrMipNaW5GdW5kaW5nLCBUb3RhbFBvb2xlZCgpKQoJYXNzZXJ0U29sdmVudCh0KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYW1vdW50IGV4Y2VlZHMgcG9vbCIsCgkJZnVuYygpIHsgV2l0aGRyYXdQb29sKGNyb3NzKGN1ciksIDIqTWluRnVuZGluZysxKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAiYW1vdW50IG11c3QgYmUgcG9zaXRpdmUiLAoJCWZ1bmMoKSB7IFdpdGhkcmF3UG9vbChjcm9zcyhjdXIpLCAwKSB9KQoKCS8vIEEgbm9uLW93bmVyIGhhcyBubyBwb29sIHRvIHRha2UsIGFuZCBtYWxsb3J5IGNhbm5vdCByZWFjaCBvd25lcjEncy4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm5vIHBvb2wgdG8gd2l0aGRyYXciLAoJCWZ1bmMoKSB7IFdpdGhkcmF3UG9vbEFsbChjcm9zcyhjdXIpKSB9KQoJdWFzc2VydC5FcXVhbCh0LCAyKk1pbkZ1bmRpbmcsIFBvb2xPZihvd25lcjEpKQoKCXVhc3NlcnQuRXF1YWwodCwgMipNaW5GdW5kaW5nLCB3aXRoZHJhd0FsbEFzKGN1ciwgb3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5wb29sZWQsIFRvdGFsUG9vbGVkKCkpCglhc3NlcnRTb2x2ZW50KHQpCn0KCi8vIFRlc3RPd25lckNhbkFsd2F5c0xlYXZlIHBpbnMgdGhlIGRvY3VtZW50ZWQgY29uc2VxdWVuY2Ugb2YgdGhhdCBkZXNpZ246Ci8vIGFuIG93bmVyIG1heSBlbXB0eSB0aGUgcG9vbCB1bmRlciBhIExJVkUgZ3JhbnQsIGFuZCB0aGUgZGVsZWdhdGUncyBuZXh0Ci8vIGRyYXcgdGhlbiBmYWlscyBvbiBzb2x2ZW5jeSByYXRoZXIgdGhhbiBiZWluZyB0cmFwcGVkIGhhbGYtd2F5LiBBIHJlYWxtCi8vIHRoYXQgbG9ja2VkIHRoZSBjYXBpdGFsIGJlaGluZCB0aGUgZ3JhbnQgd291bGQgYmUgdGhlIHdvcnNlIHJlYWxtLCBhbmQKLy8gdGhpcyB0ZXN0IGlzIGhlcmUgc28gdGhlIGJlaGF2aW91ciBjYW5ub3QgZHJpZnQgc2lsZW50bHkgZWl0aGVyIHdheS4KZnVuYyBUZXN0T3duZXJDYW5BbHdheXNMZWF2ZShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCA1MDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MDBfMDAwKSwgRHJhd2FibGUoaWQpKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFBvb2xPZihvd25lcjEpKQoKCS8vIFRoZSBBVVRIT1JJVFkgaXMgdW50b3VjaGVkOyBvbmx5IHRoZSBob25lc3QgZmlndXJlIG1vdmVkLgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MDBfMDAwKSwgUmVtYWluaW5nKGlkKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIERyYXdhYmxlKGlkKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyJ3MgcG9vbCBjYW5ub3QgY292ZXIgdGhpcyBkcmF3IiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxXzAwMCkgfSkKCglyZXZva2VBcyhjdXIsIG93bmVyMSwgaWQpCglhc3NlcnRTb2x2ZW50KHQpCn0KCi8vIFRlc3RTZWxmR3JhbnRSZWNvdmVyc1RoZVBvb2xGb3JUaGVGZWVBbG9uZSBwaW5zIHRoZSBwcmVtaXNlIHRoYXQgdGhlCi8vIE1heExpdmVHcmFudHMgY29tbWVudCByZXN0cyBvbiwgYW5kIGl0IGV4aXN0cyBiZWNhdXNlIHRoZSBjbGFpbSB0aGF0Ci8vIGNvbW1lbnQgVVNFRCB0byBtYWtlIHJvdHRlZCB1bmRldGVjdGVkIHVudGlsIGFuIGFkdmVyc2FyaWFsIGF1ZGl0IHJlYWQKLy8gaXQgKGZpbmRpbmcgWTEpLiBUaGUgbGVzc29uIHdhcyBub3QgInRoYXQgbnVtYmVyIHdhcyB3cm9uZyIgYnV0ICJhCi8vIG1pdGlnYXRpb24gYXNzZXJ0ZWQgbm93aGVyZSBpcyBwcm9zZSIsIHNvIHRoZSByZXBsYWNlbWVudCByZWFzb25pbmcgaXMKLy8gYXNzZXJ0ZWQgaGVyZS4KLy8KLy8gVGhlIHJlYXNvbmluZyBpcyB0aGF0IG5vIGNhcGl0YWwgYm91bmQgb24gZ3JhbnQtc2xvdCBvY2N1cGF0aW9uIGNhbiBiZQovLyBidWlsdCBvdXQgb2YgdGhlIHBvb2wsIGJlY2F1c2UgYW4gb3duZXIgbWF5IGJlIGl0cyBPV04gZGVsZWdhdGUuIE1ha2UKLy8gYW4gb3duZXIgcmV0YWluIE1pbkZ1bmRpbmcgd2hpbGUgZ3JhbnRzIGFyZSBsaXZlIGFuZCB0aGlzIGlzIHRoZSB3YXkKLy8gYXJvdW5kIGl0OiBncmFudCB0byB5b3Vyc2VsZiwgZHJhdyB0aGUgcG9vbCB0byB6ZXJvIHRocm91Z2ggeW91ciBvd24KLy8gZ3JhbnQsIENsYWltIHRoZSBjcmVkaXQgYmFjay4gWW91IHJlY292ZXIgZXZlcnl0aGluZyBidXQgdGhlIGRyYXcgZmVlLAovLyB0aGUgc2xvdCBpcyBzdGlsbCBoZWxkLCBhbmQgYSByZXRlbnRpb24gcnVsZSByZWFkcyBhcyBzYXRpc2ZpZWQgdGhlCi8vIHdob2xlIHdheSB0aHJvdWdoLiBUaGUgcmVhbG0gcGVybWl0cyB0aGlzIGRlbGliZXJhdGVseSDigJQgcmVmdXNpbmcgYQovLyBzZWxmLWdyYW50IHdvdWxkIG5vdCBjbG9zZSBpdCBlaXRoZXIsIHNpbmNlIGEgc2Vjb25kIGFkZHJlc3MgdGhlIHNhbWUKLy8gb3BlcmF0b3IgY29udHJvbHMgaXMgZnJlZS4KZnVuYyBUZXN0U2VsZkdyYW50UmVjb3ZlcnNUaGVQb29sRm9yVGhlRmVlQWxvbmUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZlZXNCZWZvcmUgOj0gRmVlc0FjY3J1ZWQoKQoKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCS8vIG93bmVyMSBpcyBib3RoIHBhcnRpZXMuIE5vdGhpbmcgcmVmdXNlcyBpdC4KCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIG93bmVyMSwgTWluRnVuZGluZywgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoKCS8vIERyYWluIHRoZSB3aG9sZSBwb29sIHRocm91Z2ggdGhlIG93bmVyJ3Mgb3duIGdyYW50LgoJY3JlZGl0ZWQgOj0gZHJhd0FzKGN1ciwgb3duZXIxLCBpZCwgTWluRnVuZGluZykKCWZlZSA6PSBNaW5GdW5kaW5nICogRHJhd0ZlZUJwcyAvIDEwXzAwMAoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLWZlZSwgY3JlZGl0ZWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBQb29sT2Yob3duZXIxKSkKCgkvLyAuLi4gYW5kIHRha2UgaXQgYmFjayBvdXQuIE5ldCBjb3N0IG9mIGhvbGRpbmcgdGhlIHNsb3Q6IHRoZSBmZWUuCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmctZmVlLCBjbGFpbUFzKGN1ciwgb3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgZmVlc0JlZm9yZStmZWUsIEZlZXNBY2NydWVkKCkpCgoJLy8gVGhlIHNsb3QgaXMgc3RpbGwgb2NjdXBpZWQsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludDogdGhlIGdyYW50CgkvLyBzdXJ2aXZlZCB0aGUgcG9vbCByZWFjaGluZyB6ZXJvLCBhbmQgbm8gdGhpcmQgcGFydHkgY2FuIHJlbW92ZSBpdAoJLy8gYmVjYXVzZSBpdCBjYXJyaWVzIG5vIGV4cGlyeS4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIG93bmVyT3Blbihvd25lcjEuU3RyaW5nKCkpKQoJdWFzc2VydC5GYWxzZSh0LCBJc0V4cGlyZWQoaWQpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFsbG93YW5jZSBoYXMgbm90IGV4cGlyZWQiLAoJCWZ1bmMoKSB7IFJlYXAoY3Jvc3MoY3VyKSwgaWQpIH0pCgoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgb3duZXJPcGVuKG93bmVyMS5TdHJpbmcoKSkpCglhc3NlcnRTb2x2ZW50KHQpCn0KCi8vIC0tLSBncmFudHMgLS0tCgpmdW5jIFRlc3RHcmFudFJlY29yZHNUZXJtc0FuZFBhcnRpZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCWggOj0gSGVpZ2h0KCkKCWxpdmVCZWZvcmUgOj0gTGl2ZUdyYW50cygpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJaWQgOj0gR3JhbnQoY3Jvc3MoY3VyKSwgZGVsZWdhdGUxLCAibW9udGhseSBvcHMiLCA1MF8wMDAsIE1pblBlcmlvZEJsb2NrcywKCQkyMDBfMDAwLCBoKzUwMCkKCgl1YXNzZXJ0LkVxdWFsKHQsIGlkLCBOdW1HcmFudHMoKSkKCXVhc3NlcnQuRXF1YWwodCwgbGl2ZUJlZm9yZSsxLCBMaXZlR3JhbnRzKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBHcmFudHNPZihvd25lcjEpKQoJdWFzc2VydC5FcXVhbCh0LCAibW9udGhseSBvcHMiLCBHcmFudExhYmVsKGlkKSkKCglvLCBzLCBwZXJQZXJpb2QsIHBlcmlvZExlbmd0aCwgdG90YWwsIGV4cGlyZXNBdCwgYW5jaG9yLCBjcmVhdGVkQXQsIGZlZUJwcyA6PQoJCUdyYW50SW5mbyhpZCkKCXVhc3NlcnQuRXF1YWwodCwgb3duZXIxLCBvKQoJdWFzc2VydC5FcXVhbCh0LCBkZWxlZ2F0ZTEsIHMpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDUwXzAwMCksIHBlclBlcmlvZCkKCXVhc3NlcnQuRXF1YWwodCwgTWluUGVyaW9kQmxvY2tzLCBwZXJpb2RMZW5ndGgpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIwMF8wMDApLCB0b3RhbCkKCXVhc3NlcnQuRXF1YWwodCwgaCs1MDAsIGV4cGlyZXNBdCkKCS8vIFRoZSBhbmNob3IgaXMgdGhlIGdyYW50IGhlaWdodDogd2luZG93cyBhcmUgYW5jaG9yZWQsIG5vdCBzbGlkaW5nLAoJLy8gc28gbm9ib2R5IHJlc2V0cyBhIGNhcCBieSBjaG9vc2luZyB3aGVuIHRvIGNhbGwuCgl1YXNzZXJ0LkVxdWFsKHQsIGgsIGFuY2hvcikKCXVhc3NlcnQuRXF1YWwodCwgaCwgY3JlYXRlZEF0KQoJdWFzc2VydC5FcXVhbCh0LCBEcmF3RmVlQnBzLCBmZWVCcHMpCgoJc3BlbnRXaW5kb3csIHNwZW50VG90YWwsIHdpbmRvd0luZGV4LCBkcmF3cyA6PSBHcmFudFVzYWdlKGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgc3BlbnRXaW5kb3cpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBzcGVudFRvdGFsKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgd2luZG93SW5kZXgpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBkcmF3cykKCgl1YXNzZXJ0LkZhbHNlKHQsIElzRXhwaXJlZChpZCkpCgoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgR3JhbnRzT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgbGl2ZUJlZm9yZSwgTGl2ZUdyYW50cygpKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKfQoKZnVuYyBUZXN0R3JhbnRWYWxpZGF0aW9uKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCgoJLy8gTm8gcG9vbDogYSBncmFudCBmcm9tIGFuIGFkZHJlc3Mgd2l0aCBub3RoaW5nIGJlaGluZCBpdCBpcyByZWZ1c2VkCgkvLyBiZWZvcmUgYW55IGFsbG93YW5jZSBpcyBvcGVuZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImZ1bmQgYSBwb29sIGJlZm9yZSBncmFudGluZyIsCgkJZnVuYygpIHsgR3JhbnQoY3Jvc3MoY3VyKSwgZGVsZWdhdGUxLCAiIiwgNTBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApIH0pCgoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJzcGVuZGVyIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3MgaW4gY2Fub25pY2FsIChsb3dlcmNhc2UpIGZvcm0iLAoJCWZ1bmMoKSB7IEdyYW50KGNyb3NzKGN1ciksIGFkZHJlc3MoIm5vdC1hbi1hZGRyZXNzIiksICIiLCA1MF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImxhYmVsIGV4Y2VlZHMgNjQgYnl0ZXMiLAoJCWZ1bmMoKSB7CgkJCUdyYW50KGNyb3NzKGN1ciksIGRlbGVnYXRlMSwgc3RyaW5ncy5SZXBlYXQoIngiLCBNYXhMYWJlbExlbisxKSwKCQkJCTUwXzAwMCwgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoJCX0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJwZXJQZXJpb2QgbXVzdCBiZSBhdCBsZWFzdCAxMDAwdWdub3QiLAoJCWZ1bmMoKSB7IEdyYW50KGNyb3NzKGN1ciksIGRlbGVnYXRlMSwgIiIsIE1pblBlclBlcmlvZC0xLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApIH0pCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInBlcmlvZExlbmd0aCBtdXN0IGJlIDAgKGxpZmV0aW1lKSBvciBhdCBsZWFzdCAxMDAgYmxvY2tzIiwKCQlmdW5jKCkgeyBHcmFudChjcm9zcyhjdXIpLCBkZWxlZ2F0ZTEsICIiLCA1MF8wMDAsIE1pblBlcmlvZEJsb2Nrcy0xLCAwLCAwKSB9KQoKCS8vIEFuIGV4cGlyeSBhbHJlYWR5IGluIHRoZSBwYXN0IGlzIHNwZW5kYm9vaydzIG93biByZWZ1c2FsOiBhbgoJLy8gYWxsb3dhbmNlIHRoYXQgY2FuIGF1dGhvcml6ZSBub3RoaW5nIG11c3Qgbm90IGJlY29tZSBhIGxpdmUgZW50cnkuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwZW5kYm9vazogaW52YWxpZCB0ZXJtcyIsCgkJZnVuYygpIHsgR3JhbnQoY3Jvc3MoY3VyKSwgZGVsZWdhdGUxLCAiIiwgNTBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDEpIH0pCgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgR3JhbnRzT2Yob3duZXIxKSkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCn0KCi8vIFRlc3RHcmFudFJlZnVzZXNVcHBlcmNhc2VTcGVuZGVyIG1lYXN1cmVzIHRoZSBwcmVtaXNlIG9mIEdyYW50J3MKLy8gbG93ZXJjYXNlIGNsYXVzZSByYXRoZXIgdGhhbiBhc3NlcnRpbmcgaXQgZnJvbSB0aGUgYmVjaDMyIHNwZWMuIElmCi8vIElzVmFsaWQoKSBldmVyIHN0b3BzIGFjY2VwdGluZyB0aGUgdXBwZXJjYXNlIHNwZWxsaW5nLCB0aGUgZmlyc3QKLy8gYXNzZXJ0aW9uIGhlcmUgZmFpbHMgYW5kIHRoZSBjbGF1c2UncyBjb21tZW50IG11c3QgYmUgY29ycmVjdGVkIOKAlCB3aGljaAovLyBpcyB0aGUgcG9pbnQgb2YgbWVhc3VyaW5nIGl0LgpmdW5jIFRlc3RHcmFudFJlZnVzZXNVcHBlcmNhc2VTcGVuZGVyKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCgoJdXBwZXIgOj0gYWRkcmVzcyhzdHJpbmdzLlRvVXBwZXIoc3RyaW5nKGRlbGVnYXRlMSkpKQoJdWFzc2VydC5UcnVlKHQsIHVwcGVyICE9IGRlbGVnYXRlMSkKCXVhc3NlcnQuVHJ1ZSh0LCB1cHBlci5Jc1ZhbGlkKCkpIC8vIHRoZSBoYXphcmQsIG1lYXN1cmVkIG9uIHRoaXMgdG9vbGNoYWluCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJInNwZW5kZXIgaXMgbm90IGEgdmFsaWQgYWRkcmVzcyBpbiBjYW5vbmljYWwgKGxvd2VyY2FzZSkgZm9ybSIsCgkJZnVuYygpIHsgR3JhbnQoY3Jvc3MoY3VyKSwgdXBwZXIsICIiLCA1MF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkgfSkKCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBHcmFudHNPZihvd25lcjEpKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKfQoKLy8gVGVzdEdyYW50UGVyT3duZXJDYXAgY292ZXJzIHRoZSBnYXAgc3BlbmRib29rJ3Mgb3duIGRvY3VtZW50YXRpb24gbmFtZXM6Ci8vIG1heExpdmUgaXMgYSBzaW5nbGUgZ2xvYmFsIGZpZ3VyZSwgc28gd2l0aG91dCBhIHBlci1vd25lciBjYXAgb25lIG93bmVyCi8vIGNvdWxkIGV4aGF1c3QgaXQgYW5kIGxvY2sgZXZlcnlvbmUgZWxzZSBvdXQuCmZ1bmMgVGVzdEdyYW50UGVyT3duZXJDYXAoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCglpZHMgOj0gW11pbnQ2NHt9Cglmb3IgaSA6PSBpbnQ2NCgwKTsgaSA8IE1heEdyYW50c1Blck93bmVyOyBpKysgewoJCWlkcyA9IGFwcGVuZChpZHMsIGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgTWluUGVyUGVyaW9kLAoJCQlNaW5QZXJpb2RCbG9ja3MsIDAsIDApKQoJfQoJdWFzc2VydC5FcXVhbCh0LCBNYXhHcmFudHNQZXJPd25lciwgR3JhbnRzT2Yob3duZXIxKSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyIGFscmVhZHkgaGFzIDE2IGxpdmUgZ3JhbnRzIiwKCQlmdW5jKCkgeyBHcmFudChjcm9zcyhjdXIpLCBkZWxlZ2F0ZTEsICIiLCBNaW5QZXJQZXJpb2QsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkgfSkKCgkvLyBBIERJRkZFUkVOVCBvd25lciBpcyB1bmFmZmVjdGVkIOKAlCB0aGUgY2FwIGlzIHBlci1vd25lciwgbm90IGdsb2JhbC4KCWZ1bmRBcyhjdXIsIG93bmVyMiwgTWluRnVuZGluZykKCW90aGVyIDo9IGdyYW50QXMoY3VyLCBvd25lcjIsIGRlbGVnYXRlMiwgTWluUGVyUGVyaW9kLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEpLCBHcmFudHNPZihvd25lcjIpKQoKCS8vIFJldm9raW5nIGZyZWVzIGEgc2xvdCwgYW5kIHRoZSBpZCBpcyBub3QgcmV1c2VkLgoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkc1swXSkKCXVhc3NlcnQuRXF1YWwodCwgTWF4R3JhbnRzUGVyT3duZXItMSwgR3JhbnRzT2Yob3duZXIxKSkKCWZyZXNoIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgTWluUGVyUGVyaW9kLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgl1YXNzZXJ0LlRydWUodCwgZnJlc2ggPiBpZHNbbGVuKGlkcyktMV0pCgoJZm9yIF8sIGlkIDo9IHJhbmdlIGlkc1sxOl0gewoJCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCX0KCXJldm9rZUFzKGN1ciwgb3duZXIxLCBmcmVzaCkKCXJldm9rZUFzKGN1ciwgb3duZXIyLCBvdGhlcikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEdyYW50c09mKG93bmVyMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBHcmFudHNPZihvd25lcjIpKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjIpCglhc3NlcnRTb2x2ZW50KHQpCn0KCmZ1bmMgVGVzdEdyYW50QW5kQW1lbmRBcmVPd25lck9ubHkoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgNTBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAib3duZXIgb25seSIsCgkJZnVuYygpIHsgQW1lbmQoY3Jvc3MoY3VyKSwgaWQsIDEwXzAwMCwgMCwgMCkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvd25lciBvbmx5IiwKCQlmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgaWQpIH0pCgoJLy8gTm90IGV2ZW4gdGhlIGRlbGVnYXRlIG1heSBhbWVuZCBvciByZXZva2UgdGhlaXIgb3duIGdyYW50LgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJvd25lciBvbmx5IiwKCQlmdW5jKCkgeyBBbWVuZChjcm9zcyhjdXIpLCBpZCwgMTBfMDAwLCAwLCAwKSB9KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5rbm93biBncmFudCBpZCIsCgkJZnVuYygpIHsgUmV2b2tlKGNyb3NzKGN1ciksIDk5OV85OTkpIH0pCgoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKfQoKLy8gLS0tIGRyYXdpbmcgLS0tCgpmdW5jIFRlc3REcmF3SXNEZWxlZ2F0ZU9ubHlBbmRDcmVkaXRzTmV0T2ZGZWUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCA1MDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJLy8gTm9ib2R5IGJ1dCB0aGUgbmFtZWQgZGVsZWdhdGUg4oCUIG5vdCBtYWxsb3J5LCBhbmQgbm90IHRoZSBvd25lci4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImRlbGVnYXRlIG9ubHkiLAoJCWZ1bmMoKSB7IERyYXcoY3Jvc3MoY3VyKSwgaWQsIDFfMDAwKSB9KQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJkZWxlZ2F0ZSBvbmx5IiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxXzAwMCkgfSkKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAwKSB9KQoKCWhlbGRCZWZvcmUgOj0gSGVsZCgpCgljcmVkaXRlZCA6PSBkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIGlkLCAxMDBfMDAwKQoKCS8vIDElIG9mIHRoZSBncm9zcywgZmxvb3Itcm91bmRlZCBpbiB0aGUgZGVsZWdhdGUncyBmYXZvdXIuCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDk5XzAwMCksIGNyZWRpdGVkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg5OV8wMDApLCBDcmVkaXRPZihkZWxlZ2F0ZTEpKQoJdWFzc2VydC5FcXVhbCh0LCBiLmZlZXMrMV8wMDAsIEZlZXNBY2NydWVkKCkpCgoJLy8gVGhlIG93bmVyJ3MgcG9vbCBpcyBkZWJpdGVkIHRoZSBHUk9TUzogdGhlIGZlZSBpcyBwYWlkIG91dCBvZiB0aGUKCS8vIGJ1ZGdldCwgbm90IG91dCBvZiB0aGUgZGVsZWdhdGUncyBhdXRob3JpdHkuCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmctMTAwXzAwMCwgUG9vbE9mKG93bmVyMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIucG9vbGVkK01pbkZ1bmRpbmctMTAwXzAwMCwgVG90YWxQb29sZWQoKSkKCgkvLyBEcmF3IG1vdmVzIHZhbHVlIGJldHdlZW4gUCBhbmQgTCBvbmx5LiBIIGRvZXMgbm90IG1vdmUgYXQgYWxsLCB3aGljaAoJLy8gaXMgd2h5IHRoaXMgdHJhbnNpdGlvbiBoYXMgbm8gcGF5b3V0IHRoYXQgY291bGQgZmFpbC4KCXVhc3NlcnQuRXF1YWwodCwgaGVsZEJlZm9yZSwgSGVsZCgpKQoJYXNzZXJ0U29sdmVudCh0KQoKCXNwZW50V2luZG93LCBzcGVudFRvdGFsLCBfLCBkcmF3cyA6PSBHcmFudFVzYWdlKGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMDBfMDAwKSwgc3BlbnRXaW5kb3cpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMF8wMDApLCBzcGVudFRvdGFsKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgZHJhd3MpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDQwMF8wMDApLCBSZW1haW5pbmcoaWQpKQoKCS8vIENsYWltIGlzIHRoZSBzZXBhcmF0ZSB0cmFuc2FjdGlvbiB0aGF0IG1vdmVzIGNvaW5zLgoJYmVmb3JlIDo9IGJhbGFuY2VPZihkZWxlZ2F0ZTEpCglwYWlkIDo9IGNsYWltQXMoY3VyLCBkZWxlZ2F0ZTEpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDk5XzAwMCksIHBhaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGJlZm9yZSs5OV8wMDAsIGJhbGFuY2VPZihkZWxlZ2F0ZTEpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQ3JlZGl0T2YoZGVsZWdhdGUxKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5jcmVkaXQsIFVuY2xhaW1lZENyZWRpdCgpKQoJYXNzZXJ0U29sdmVudCh0KQoKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVsZWdhdGUxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm8gY3JlZGl0IHRvIGNsYWltIiwKCQlmdW5jKCkgeyBDbGFpbShjcm9zcyhjdXIpKSB9KQoKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCgl0aWR5RmVlcyhjdXIsIHQpCn0KCi8vIFRlc3REcmF3U29sdmVuY3lSZWZ1c2FsQ29uc3VtZXNOb3RoaW5nIGlzIHRoaXMgcmVhbG0ncyBjZW50cmFsCi8vIGludmFyaWFudCwgYW5kIHRoZSBvcmRlcmluZyBpbnNpZGUgRHJhdyBpcyB3aGF0IGl0IHByb3ZlczogdGhlIHNvbHZlbmN5Ci8vIGNoZWNrIHJ1bnMgQkVGT1JFIHNwZW5kYm9vay5TcGVuZCwgc28gYSBkcmF3IHJlZnVzZWQgZm9yIGluc29sdmVuY3kKLy8gbGVhdmVzIHRoZSB3aW5kb3cgY2FwYWNpdHkgaW50YWN0IHJhdGhlciB0aGFuIGJ1cm5pbmcgaXQgb24gYSBkcmF3IHRoYXQKLy8gbmV2ZXIgaGFwcGVuZWQuCi8vCi8vIFRoaXMgaXMgYWxzbyB0aGUgb25lIGFib3J0IGluIHRoaXMgZmlsZSB3aGVyZSB0aGUgcG9zdC1zdGF0ZSBpcyB0aGUKLy8gYXNzZXJ0aW9uIHJhdGhlciB0aGFuIGFuIGFmdGVydGhvdWdodCwgYmVjYXVzZSB1YXNzZXJ0IGRvZXMgbm90IHJvbGwKLy8gYmFjayByZWFsbSBnbG9iYWxzIHRoZSB3YXkgYSByZXZlcnRlZCB0cmFuc2FjdGlvbiB3b3VsZC4KZnVuYyBUZXN0RHJhd1NvbHZlbmN5UmVmdXNhbENvbnN1bWVzTm90aGluZyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJLy8gQXV0aG9yaXR5IGRlbGliZXJhdGVseSBFWENFRURTIHRoZSBwb29sOiBhIGJ1ZGdldCBpcyBhdXRob3JpdHksIG5vdAoJLy8gYSByZXNlcnZhdGlvbiwgYW5kIHRoZSByZWFsbSdzIHByb21pc2UgaXMgdGhhdCBpdCBuZXZlciBjcmVkaXRzIHdoYXQKCS8vIGl0IGNhbm5vdCBwYXkuCglpZCA6PSBncmFudEFzKGN1ciwgb3duZXIxLCBkZWxlZ2F0ZTEsIDUqTWluRnVuZGluZywgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoJdWFzc2VydC5FcXVhbCh0LCA1Kk1pbkZ1bmRpbmcsIFJlbWFpbmluZyhpZCkpCgl1YXNzZXJ0LkVxdWFsKHQsIE1pbkZ1bmRpbmcsIERyYXdhYmxlKGlkKSkgLy8gdGhlIGhvbmVzdCBmaWd1cmUKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgIm93bmVyJ3MgcG9vbCBjYW5ub3QgY292ZXIgdGhpcyBkcmF3IiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCBNaW5GdW5kaW5nKzEpIH0pCgoJLy8gTm90aGluZyBtb3ZlZCwgYW5kIOKAlCB0aGUgcGFydCB0aGF0IG1hdHRlcnMg4oCUIG5vdGhpbmcgd2FzIENPTlNVTUVELgoJc3BlbnRXaW5kb3csIHNwZW50VG90YWwsIF8sIGRyYXdzIDo9IEdyYW50VXNhZ2UoaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBzcGVudFdpbmRvdykKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHNwZW50VG90YWwpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBkcmF3cykKCXVhc3NlcnQuRXF1YWwodCwgNSpNaW5GdW5kaW5nLCBSZW1haW5pbmcoaWQpKQoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLCBQb29sT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIENyZWRpdE9mKGRlbGVnYXRlMSkpCglhc3NlcnRTb2x2ZW50KHQpCgoJLy8gRXhhY3RseSB0aGUgZHJhd2FibGUgZmlndXJlIHN1Y2NlZWRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZQoJLy8gcmVmdXNhbCBhYm92ZSBhIGJvdW5kYXJ5IHJhdGhlciB0aGFuIGEgYmxhbmtldC4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTkwXzAwMCksIGRyYXdBcyhjdXIsIGRlbGVnYXRlMSwgaWQsIE1pbkZ1bmRpbmcpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgUG9vbE9mKG93bmVyMSkpCgoJY2xhaW1BcyhjdXIsIGRlbGVnYXRlMSkKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXRpZHlGZWVzKGN1ciwgdCkKCWFzc2VydFNvbHZlbnQodCkKfQoKZnVuYyBUZXN0RHJhd0ZlZVJvdW5kaW5nRmF2b3JzVGhlRGVsZWdhdGUoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCA1MF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkKCgkvLyAxJSBvZiA5OSBmbG9vcnMgdG8gMCwgc28gdGhlIGRlbGVnYXRlIGtlZXBzIGFsbCBvZiBpdC4gVGhlcmUgaXMKCS8vIGRlbGliZXJhdGVseSBubyBtaW5pbXVtIGRyYXc6IGEgZmxvb3IgYWJvdmUgYSBncmFudCdzIFBlclBlcmlvZAoJLy8gd291bGQgbWFrZSB0aGUgZ3JhbnQgc2lsZW50bHkgdW5kcmF3YWJsZS4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTkpLCBkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIGlkLCA5OSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGIuZmVlcywgRmVlc0FjY3J1ZWQoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTkpLCBDcmVkaXRPZihkZWxlZ2F0ZTEpKQoKCS8vIDEwMCBpcyB0aGUgZmlyc3QgYW1vdW50IHRoYXQgcGF5cyBhIGZlZSBhdCBhbGwuCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDk5KSwgZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgMTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgYi5mZWVzKzEsIEZlZXNBY2NydWVkKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDE5OCksIENyZWRpdE9mKGRlbGVnYXRlMSkpCglhc3NlcnRTb2x2ZW50KHQpCgoJY2xhaW1BcyhjdXIsIGRlbGVnYXRlMSkKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCgl0aWR5RmVlcyhjdXIsIHQpCn0KCi8vIFRlc3RXaW5kb3dSZWZpbGxzQXRBbmNob3JlZEJvdW5kYXJ5IGlzIHNwZW5kYm9vayBjb25zdW1lciBvYmxpZ2F0aW9uIDEKLy8gb2JzZXJ2ZWQgZnJvbSB0aGUgY29uc3VtaW5nIHNpZGU6IHRoZSBjbG9jayBpcyBydW50aW1lLkNoYWluSGVpZ2h0KCkgYW5kCi8vIG5vIGNhbGxlciBzdXBwbGllcyBpdCwgc28gdGhlIHdpbmRvdyBjYW5ub3QgYmUgcm9sbGVkIG9uIGRlbWFuZC4gVGhlCi8vIHJlZmlsbCBpcyBhIFJFU0VULCBub3QgYSBjYXJyeS4KZnVuYyBUZXN0V2luZG93UmVmaWxsc0F0QW5jaG9yZWRCb3VuZGFyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCAxMCpNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCAxMDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgMTAwXzAwMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFJlbWFpbmluZyhpZCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSB3aW5kb3cgY2FwIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxKSB9KQoKCS8vIE9uZSBibG9jayBzaG9ydCBvZiB0aGUgYm91bmRhcnk6IHN0aWxsIHJlZnVzZWQuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKE1pblBlcmlvZEJsb2NrcyAtIDEpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBSZW1haW5pbmcoaWQpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSB3aW5kb3cgY2FwIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxKSB9KQoKCS8vIFRoZSBib3VuZGFyeSBpdHNlbGYuIFRoZSB3aW5kb3cgaW5kZXggYWR2YW5jZXMgYW5kIHRoZSBjYXAgaXMgZnVsbAoJLy8gYWdhaW4g4oCUIG5vdCAxMDBfMDAwIHBsdXMgYSBjYXJyaWVkIHJlbWFpbmRlci4KCXRlc3RpbmcuU2tpcEhlaWdodHMoMSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwXzAwMCksIFJlbWFpbmluZyhpZCkpCglfLCBfLCB3aW5kb3dJbmRleCwgXyA6PSBHcmFudFVzYWdlKGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgd2luZG93SW5kZXgpCgoJLy8gVEhFIFNUQUxFLVBBSVIgQ0FTRSwgYW5kIGl0IGlzIGFzc2VydGVkIGhlcmUgcmF0aGVyIHRoYW4gbGVmdCB0bwoJLy8gaW5mZXJlbmNlIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seSBtb21lbnQgaXQgaXMgb2JzZXJ2YWJsZTogdGhlCgkvLyBjaGFpbiBoYXMgY3Jvc3NlZCBhIGJvdW5kYXJ5IGFuZCBOT1RISU5HIGhhcyBiZWVuIHdyaXR0ZW4gc2luY2UsIHNvCgkvLyBBbGxvd2FuY2UuV2luZG93SW5kZXggc3RpbGwgbmFtZXMgd2luZG93IDAgYW5kIEFsbG93YW5jZS5TcGVudFdpbmRvdwoJLy8gc3RpbGwgaG9sZHMgd2luZG93IDAncyAxMDBfMDAwLiBSZWFkaW5nIGVpdGhlciBmaWVsZCBzdHJhaWdodCBvZmYKCS8vIHRoZSByZWNvcmQgd291bGQgcHVibGlzaCAic3BlbnQgdGhpcyB3aW5kb3c6IDEwMDAwMCIgZGlyZWN0bHkgYWJvdmUKCS8vICJhdXRob3JpemVkIGJ5IHRoZSB0ZXJtczogMTAwMDAwIiDigJQgYSBwYWdlIGNvbnRyYWRpY3RpbmcgaXRzZWxmLgoJLy8gc3BlbnRJbldpbmRvdyBpcyB3aGF0IG1ha2VzIHRoZSBmaXJzdCBmaWd1cmUgMCwgYW5kIHRoaXMgYXNzZXJ0aW9uCgkvLyBpcyB3aGF0IGtlZXBzIGl0IHRoYXQgd2F5LgoJc3RhbGVXaW5kb3csIF8sIF8sIF8gOj0gR3JhbnRVc2FnZShpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIHN0YWxlV2luZG93KQoJcGFnZSA6PSBSZW5kZXIoaXRvYShpZCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAic3BlbnQgdGhpcyB3aW5kb3c6IDB1Z25vdCIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIm5vdyBpbiB3aW5kb3cgMSIpKQoKCWRyYXdBcyhjdXIsIGRlbGVnYXRlMSwgaWQsIDEwMF8wMDApCglfLCBzcGVudFRvdGFsLCBfLCBkcmF3cyA6PSBHcmFudFVzYWdlKGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgyMDBfMDAwKSwgc3BlbnRUb3RhbCkgLy8gbGlmZXRpbWUgYWNjdW11bGF0ZXMKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMiksIGRyYXdzKQoJc3BlbnRXaW5kb3csIF8sIF8sIF8gOj0gR3JhbnRVc2FnZShpZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwXzAwMCksIHNwZW50V2luZG93KSAvLyB0aGUgd2luZG93IHJlc2V0Cglhc3NlcnRTb2x2ZW50KHQpCgoJY2xhaW1BcyhjdXIsIGRlbGVnYXRlMSkKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCgl0aWR5RmVlcyhjdXIsIHQpCn0KCmZ1bmMgVGVzdExpZmV0aW1lVG90YWxCaW5kc0Fjcm9zc0FSb2xsb3ZlcihjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCAxMCpNaW5GdW5kaW5nKQoJLy8gTGlmZXRpbWUgY2FwIGF0IDEuNSB3aW5kb3dzOiB0aGUgcmVmaWxsIGNhbm5vdCBvdXRydW4gaXQuCglpZCA6PSBncmFudEFzKGN1ciwgb3duZXIxLCBkZWxlZ2F0ZTEsIDEwMF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMTUwXzAwMCwgMCkKCglkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIGlkLCAxMDBfMDAwKQoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhNaW5QZXJpb2RCbG9ja3MpCgoJLy8gVGhlIHdpbmRvdyByZWZpbGxlZCB0byAxMDBfMDAwIGJ1dCB0aGUgbGlmZXRpbWUgY2FwIGxlYXZlcyA1MF8wMDAsCgkvLyBhbmQgUmVtYWluaW5nIHJlcG9ydHMgdGhlIExFU1NFUiBvZiB0aGUgdHdvLgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1MF8wMDApLCBSZW1haW5pbmcoaWQpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSBsaWZldGltZSBjYXAiLAoJCWZ1bmMoKSB7IERyYXcoY3Jvc3MoY3VyKSwgaWQsIDUwXzAwMSkgfSkKCglkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIGlkLCA1MF8wMDApCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBSZW1haW5pbmcoaWQpKQoKCS8vIEEgZnVydGhlciB3aW5kb3cgYnJpbmdzIG5vIGZ1cnRoZXIgYXV0aG9yaXR5OiB0aGUgbGlmZXRpbWUgY2FwIGlzCgkvLyBhYnNvbHV0ZS4KCXRlc3RpbmcuU2tpcEhlaWdodHMoTWluUGVyaW9kQmxvY2tzKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgUmVtYWluaW5nKGlkKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVsZWdhdGUxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3BlbmRib29rOiBhbW91bnQgZXhjZWVkcyB0aGUgbGlmZXRpbWUgY2FwIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxKSB9KQoJYXNzZXJ0U29sdmVudCh0KQoKCWNsYWltQXMoY3VyLCBkZWxlZ2F0ZTEpCglyZXZva2VBcyhjdXIsIG93bmVyMSwgaWQpCgl3aXRoZHJhd0FsbEFzKGN1ciwgb3duZXIxKQoJdGlkeUZlZXMoY3VyLCB0KQp9CgovLyBUZXN0TGlmZXRpbWVXaW5kb3dOZXZlclJlZmlsbHMgY292ZXJzIHBlcmlvZExlbmd0aCA9PSAwOiBPTkUgd2luZG93IGZvcgovLyB0aGUgZ3JhbnQncyB3aG9sZSBsaWZlLiBJdCBpcyBhIGRpc3RpbmN0IGNvZGUgcGF0aCBpbiBzcGVuZGJvb2sKLy8gKHdpbmRvd0luZGV4IGlzIHBpbm5lZCB0byAwKSBhbmQgYSBkaXN0aW5jdCBwcm9kdWN0IHNoYXBlIOKAlCBhIG9uZS1vZmYKLy8gYXV0aG9yaXR5IHJhdGhlciB0aGFuIGEgcmVjdXJyaW5nIGJ1ZGdldC4KZnVuYyBUZXN0TGlmZXRpbWVXaW5kb3dOZXZlclJlZmlsbHMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgMTAwXzAwMCwgMCwgMCwgMCkKCgkvLyBHcmFudEluZm8ncyBmb3VydGggcmVzdWx0IGlzIHBlcmlvZExlbmd0aDsgdGhlIHRoaXJkIGlzIHBlclBlcmlvZC4KCV8sIF8sIF8sIHBlcmlvZExlbmd0aCwgXywgXywgXywgXywgXyA6PSBHcmFudEluZm8oaWQpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBwZXJpb2RMZW5ndGgpCgoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgMTAwXzAwMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFJlbWFpbmluZyhpZCkpCgoJdGVzdGluZy5Ta2lwSGVpZ2h0cygxMCAqIE1pblBlcmlvZEJsb2NrcykKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFJlbWFpbmluZyhpZCkpCglfLCBfLCB3aW5kb3dJbmRleCwgXyA6PSBHcmFudFVzYWdlKGlkKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgd2luZG93SW5kZXgpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSB3aW5kb3cgY2FwIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxKSB9KQoKCS8vIEFuZCBhIExPT1NFTklORyBjYW5ub3QgYmUgcXVldWVkIGFnYWluc3QgYSBncmFudCB3aXRoIG5vIGJvdW5kYXJ5IHRvCgkvLyB3YWl0IGZvciDigJQgc3BlbmRib29rIHJlZnVzZXMgcmF0aGVyIHRoYW4gYWNjZXB0aW5nIGFuIGFtZW5kbWVudCB0aGF0CgkvLyB3b3VsZCBuZXZlciB0YWtlIGVmZmVjdC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLAoJCSJzcGVuZGJvb2s6IG5vIHJlYWNoYWJsZSBuZXh0IHdpbmRvdyBib3VuZGFyeSIsCgkJZnVuYygpIHsgQW1lbmQoY3Jvc3MoY3VyKSwgaWQsIDIwMF8wMDAsIDAsIDApIH0pCglhc3NlcnRTb2x2ZW50KHQpCgoJY2xhaW1BcyhjdXIsIGRlbGVnYXRlMSkKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCgl0aWR5RmVlcyhjdXIsIHQpCn0KCi8vIC0tLSBhbWVuZG1lbnQgLS0tCgpmdW5jIFRlc3RBbWVuZElzT25lU2lkZWQoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgMTAqTWluRnVuZGluZykKCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgMTAwXzAwMCwgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoKCS8vIEEgVElHSFRFTklORyB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHksIG1pZC13aW5kb3cuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LlRydWUodCwgQW1lbmQoY3Jvc3MoY3VyKSwgaWQsIDIwXzAwMCwgMCwgMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIwXzAwMCksIFJlbWFpbmluZyhpZCkpCglfLCBfLCBwZW5kaW5nIDo9IHBlbmRpbmdPZihpZCkKCXVhc3NlcnQuRmFsc2UodCwgcGVuZGluZykKCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwZW5kYm9vazogYW1vdW50IGV4Y2VlZHMgdGhlIHdpbmRvdyBjYXAiLAoJCWZ1bmMoKSB7IERyYXcoY3Jvc3MoY3VyKSwgaWQsIDIwXzAwMSkgfSkKCgkvLyBBIExPT1NFTklORyBpcyBxdWV1ZWQgZm9yIHRoZSBuZXh0IGJvdW5kYXJ5LCBub3QgYXBwbGllZCBub3cuIFRoYXQKCS8vIGFzeW1tZXRyeSBpcyB0aGUgd2hvbGUgZ3VhcmFudGVlOiB0aGUgZGVsZWdhdGUncyBleHBvc3VyZSBpbiB0aGUKCS8vIGN1cnJlbnQgd2luZG93IGNhbiBvbmx5IGV2ZXIgc2hyaW5rLgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShvd25lcjEpKQoJdWFzc2VydC5GYWxzZSh0LCBBbWVuZChjcm9zcyhjdXIpLCBpZCwgMzAwXzAwMCwgMCwgMCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIwXzAwMCksIFJlbWFpbmluZyhpZCkpCglwZXJQZXJpb2QsIF8sIHBlbmRpbmcgOj0gcGVuZGluZ09mKGlkKQoJdWFzc2VydC5UcnVlKHQsIHBlbmRpbmcpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMwMF8wMDApLCBwZXJQZXJpb2QpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShkZWxlZ2F0ZTEpKQoJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsICJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSB3aW5kb3cgY2FwIiwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAyMF8wMDEpIH0pCgoJLy8gQXQgdGhlIGJvdW5kYXJ5IHRoZSBwZW5kaW5nIHRlcm1zIGJlY29tZSB0aGUgbGl2ZSBvbmVzLgoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhNaW5QZXJpb2RCbG9ja3MpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDMwMF8wMDApLCBSZW1haW5pbmcoaWQpKQoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgMzAwXzAwMCkKCWFzc2VydFNvbHZlbnQodCkKCgkvLyBUaGUgcmVhbG0ncyBvd24gZmxvb3Igc3RpbGwgYXBwbGllcyB0byBhbiBhbWVuZG1lbnQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInBlclBlcmlvZCBtdXN0IGJlIGF0IGxlYXN0IDEwMDB1Z25vdCIsCgkJZnVuYygpIHsgQW1lbmQoY3Jvc3MoY3VyKSwgaWQsIE1pblBlclBlcmlvZC0xLCAwLCAwKSB9KQoKCWNsYWltQXMoY3VyLCBkZWxlZ2F0ZTEpCglyZXZva2VBcyhjdXIsIG93bmVyMSwgaWQpCgl3aXRoZHJhd0FsbEFzKGN1ciwgb3duZXIxKQoJdGlkeUZlZXMoY3VyLCB0KQp9CgovLyBUZXN0QW1lbmRDYW5ub3RNb3ZlUGVyaW9kTGVuZ3RoIGFzc2VydHMgYSBTVFJVQ1RVUkFMIHByb3BlcnR5LCBub3QgYQovLyByZWZ1c2FsOiBBbWVuZCBoYXMgbm8gcGVyaW9kTGVuZ3RoIHBhcmFtZXRlciBhdCBhbGwsIHNvIG1vdmluZyBldmVyeQovLyBmdXR1cmUgYm91bmRhcnkgaXMgbm90IG1lcmVseSByZWplY3RlZCwgaXQgaXMgdW5leHByZXNzaWJsZS4gVGhlIHJlYWxtCi8vIHJlYWRzIHRoZSBncmFudCdzIG93biBwZXJpb2RMZW5ndGggYW5kIHBhc3NlcyBpdCBiYWNrIHVuY2hhbmdlZC4KZnVuYyBUZXN0QW1lbmRDYW5ub3RNb3ZlUGVyaW9kTGVuZ3RoKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCglpZCA6PSBncmFudEFzKGN1ciwgb3duZXIxLCBkZWxlZ2F0ZTEsIDEwMF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkKCglfLCBfLCBfLCBiZWZvcmUsIF8sIF8sIGFuY2hvckJlZm9yZSwgXywgXyA6PSBHcmFudEluZm8oaWQpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LlRydWUodCwgQW1lbmQoY3Jvc3MoY3VyKSwgaWQsIDEwXzAwMCwgMCwgMCkpCglfLCBfLCBfLCBhZnRlciwgXywgXywgYW5jaG9yQWZ0ZXIsIF8sIF8gOj0gR3JhbnRJbmZvKGlkKQoKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlLCBhZnRlcikKCXVhc3NlcnQuRXF1YWwodCwgTWluUGVyaW9kQmxvY2tzLCBhZnRlcikKCS8vIFRoZSBhbmNob3IgaXMgaW1tb3ZhYmxlIHRvbywgc28gdGhlIGJvdW5kYXJpZXMgc3RheSB3aGVyZSB0aGV5IHdlcmUuCgl1YXNzZXJ0LkVxdWFsKHQsIGFuY2hvckJlZm9yZSwgYW5jaG9yQWZ0ZXIpCgoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKfQoKLy8gLS0tIGVuZGluZyBhIGdyYW50IC0tLQoKZnVuYyBUZXN0UmV2b2tlRW5kc0F1dGhvcml0eUJ1dE5vdEVhcm5lZENyZWRpdChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCAxMDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCglkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIGlkLCAxMDBfMDAwKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg5OV8wMDApLCBDcmVkaXRPZihkZWxlZ2F0ZTEpKQoKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCgkvLyBUaGUgZ3JhbnQgcmVjb3JkIGlzIGdvbmUgYW5kIHRoZSBpZCBpcyBuZXZlciByZXVzZWQsIHNvIGEgbGF0ZXIgZHJhdwoJLy8gZmFpbHMgYXMgdW5rbm93biByYXRoZXIgdGhhbiBhcyB1bmF1dGhvcml6ZWQuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gZ3JhbnQgaWQiLAoJCWZ1bmMoKSB7IERyYXcoY3Jvc3MoY3VyKSwgaWQsIDEpIH0pCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gZ3JhbnQgaWQiLAoJCWZ1bmMoKSB7IFJldm9rZShjcm9zcyhjdXIpLCBpZCkgfSkKCgkvLyBDcmVkaXQgYWxyZWFkeSBkcmF3biBpcyB0aGUgZGVsZWdhdGUncy4gUmV2b2tlIGVuZHMgRlVUVVJFIGF1dGhvcml0eQoJLy8gYW5kIGNsYXdzIGJhY2sgbm90aGluZy4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoOTlfMDAwKSwgQ3JlZGl0T2YoZGVsZWdhdGUxKSkKCWJlZm9yZSA6PSBiYWxhbmNlT2YoZGVsZWdhdGUxKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg5OV8wMDApLCBjbGFpbUFzKGN1ciwgZGVsZWdhdGUxKSkKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlKzk5XzAwMCwgYmFsYW5jZU9mKGRlbGVnYXRlMSkpCglhc3NlcnRTb2x2ZW50KHQpCgoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKCXRpZHlGZWVzKGN1ciwgdCkKfQoKZnVuYyBUZXN0UmVhcElzUGVybWlzc2lvbmxlc3NCdXRPbmx5Rm9yRXhwaXJlZChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaCA6PSBIZWlnaHQoKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCAxMDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIGgrMjAwKQoJbm9FeHBpcnkgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUyLCAxMDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJLy8gTGl2ZTogcmVmdXNlZCwgZm9yIGFueW9uZS4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3QgZXhwaXJlZCIsCgkJZnVuYygpIHsgUmVhcChjcm9zcyhjdXIpLCBpZCkgfSkKCXVhc3NlcnQuRmFsc2UodCwgSXNFeHBpcmVkKGlkKSkKCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDIwMCkKCXVhc3NlcnQuVHJ1ZSh0LCBJc0V4cGlyZWQoaWQpKQoKCS8vIEFuIGV4cGlyZWQgYWxsb3dhbmNlIGNhbiBhdXRob3JpemUgbm90aGluZywgc28gaXRzIG93biBkZWxlZ2F0ZSBpcwoJLy8gcmVmdXNlZCB0b28g4oCUIGFuZCBhIHN0cmFuZ2VyIG1heSBjbGVhciBpdC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0oZGVsZWdhdGUxKSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3BlbmRib29rOiBhbGxvd2FuY2UgaGFzIGV4cGlyZWQiLAoJCWZ1bmMoKSB7IERyYXcoY3Jvc3MoY3VyKSwgaWQsIDEpIH0pCgoJbGl2ZUJlZm9yZSA6PSBMaXZlR3JhbnRzKCkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCglSZWFwKGNyb3NzKGN1ciksIGlkKQoJdWFzc2VydC5FcXVhbCh0LCBsaXZlQmVmb3JlLTEsIExpdmVHcmFudHMoKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIEdyYW50c09mKG93bmVyMSkpCgoJLy8gQSBncmFudCB3aXRoIE5PIGV4cGlyeSBjYW4gbmV2ZXIgYmUgcmVhcGVkOiBvbmx5IGl0cyBvd25lciBlbmRzIGl0LgoJdWFzc2VydC5GYWxzZSh0LCBJc0V4cGlyZWQobm9FeHBpcnkpKQoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAic3BlbmRib29rOiBhbGxvd2FuY2UgaGFzIG5vdCBleHBpcmVkIiwKCQlmdW5jKCkgeyBSZWFwKGNyb3NzKGN1ciksIG5vRXhwaXJ5KSB9KQoKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBub0V4cGlyeSkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCglhc3NlcnRTb2x2ZW50KHQpCn0KCi8vIC0tLSBmZWVzLCBzdXJwbHVzLCBhbmQgdGhlIGFic2VuY2Ugb2YgYW4gYWRtaW4gLS0tCgpmdW5jIFRlc3RXaXRoZHJhd0ZlZXNHb2VzT25seVRvVGhlRml4ZWRDb2xsZWN0b3IoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgNTAwXzAwMCwgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgNTAwXzAwMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNV8wMDApLCBGZWVzQWNjcnVlZCgpKQoKCS8vIFBlcm1pc3Npb25sZXNzLCBiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudDoKCS8vIHRoZXJlIGlzIG5vdGhpbmcgZm9yIGEgY2FsbGVyIHRvIHN0ZWVyLgoJYmVmb3JlIDo9IGJhbGFuY2VPZihGZWVDb2xsZWN0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1XzAwMCksIFdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKSkKCXVhc3NlcnQuRXF1YWwodCwgYmVmb3JlKzVfMDAwLCBiYWxhbmNlT2YoRmVlQ29sbGVjdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEZlZXNBY2NydWVkKCkpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCXVhc3NlcnQuQWJvcnRzV2l0aE1lc3NhZ2UodCwgY3VyLCAibm8gZmVlcyBhY2NydWVkIiwKCQlmdW5jKCkgeyBXaXRoZHJhd0ZlZXMoY3Jvc3MoY3VyKSkgfSkKCWFzc2VydFNvbHZlbnQodCkKCgljbGFpbUFzKGN1ciwgZGVsZWdhdGUxKQoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKfQoKZnVuYyBUZXN0U3dlZXBTdXJwbHVzQ2Fubm90UmVhY2hUcmFja2VkTGlhYmlsaXRpZXMoY3VyIHJlYWxtLCB0ICp0ZXN0aW5nLlQpIHsKCWJlZ2luKCkKCWZ1bmRBcyhjdXIsIG93bmVyMSwgTWluRnVuZGluZykKCWlkIDo9IGdyYW50QXMoY3VyLCBvd25lcjEsIGRlbGVnYXRlMSwgNTAwXzAwMCwgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgMjAwXzAwMCkKCgkvLyBOb3RoaW5nIG91dCBvZiBiYW5kIHlldDogdGhlIHJlc2VydmUgaXMgZXZlcnl0aGluZyB0aGUgcmVhbG0gaG9sZHMsCgkvLyBhbmQgdGhlIHByaW1pdGl2ZSBBQk9SVFMgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIGEgdHJhbnNmZXIgb2YgemVyby4KCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFN1cnBsdXMoKSkKCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvaW5pbzogbm8gc3VycGx1cyB0byBzd2VlcCBmb3IgdWdub3QiLAoJCWZ1bmMoKSB7IFN3ZWVwU3VycGx1cyhjcm9zcyhjdXIpLCBEZW5vbSkgfSkKCXVhc3NlcnQuRXF1YWwodCwgTWluRnVuZGluZy0yMDBfMDAwLCBQb29sT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTk4XzAwMCksIENyZWRpdE9mKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDJfMDAwKSwgRmVlc0FjY3J1ZWQoKSkKCgkvLyBBIGZvcmVpZ24gZGVub20gdGhlIHJlYWxtIGhhcyBuZXZlciBoZWxkIGlzIHRoZSBzYW1lIGFuc3dlcjogdGhlcmUKCS8vIGlzIG5vdGhpbmcgdG8gbW92ZSwgc28gbm90aGluZyBjbGFpbXMgdG8gaGF2ZSBtb3ZlZC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCgl1YXNzZXJ0LkFib3J0c1dpdGhNZXNzYWdlKHQsIGN1ciwgImNvaW5pbzogbm8gc3VycGx1cyB0byBzd2VlcCBmb3IgZm9vY29pbiIsCgkJZnVuYygpIHsgU3dlZXBTdXJwbHVzKGNyb3NzKGN1ciksICJmb29jb2luIikgfSkKCgkvLyBDb2lucyBhcnJpdmluZyBvdXRzaWRlIGFueSBlbnRyeXBvaW50IEFSRSBzd2VlcGFibGUsIGFuZCBvbmx5IHRob3NlLgoJdGVzdGluZy5Jc3N1ZUNvaW5zKEFkZHJlc3MoKSwgdWdub3QoNzc3KSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoNzc3KSwgU3VycGx1cygpKQoJYmVmb3JlIDo9IGJhbGFuY2VPZihGZWVDb2xsZWN0b3IpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG1hbGxvcnkpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg3NzcpLCBTd2VlcFN1cnBsdXMoY3Jvc3MoY3VyKSwgRGVub20pKQoJdWFzc2VydC5FcXVhbCh0LCBiZWZvcmUrNzc3LCBiYWxhbmNlT2YoRmVlQ29sbGVjdG9yKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIFN1cnBsdXMoKSkKCgkvLyBFdmVyeSB0cmFja2VkIHRlcm0gc3Vydml2ZWQgdGhlIHN3ZWVwIHVudG91Y2hlZC4KCXVhc3NlcnQuRXF1YWwodCwgTWluRnVuZGluZy0yMDBfMDAwLCBQb29sT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTk4XzAwMCksIENyZWRpdE9mKGRlbGVnYXRlMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDJfMDAwKSwgRmVlc0FjY3J1ZWQoKSkKCWFzc2VydFNvbHZlbnQodCkKCgljbGFpbUFzKGN1ciwgZGVsZWdhdGUxKQoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGlkKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMSkKCXRpZHlGZWVzKGN1ciwgdCkKfQoKLy8gVGVzdFN0cmF5U2VuZElzUmVqZWN0ZWRPbkV2ZXJ5Tm9uUGF5YWJsZUVudHJ5cG9pbnQgc3dlZXBzIHRoZSB3aG9sZQovLyBub24tcGF5YWJsZSBzdXJmYWNlLiBBIGNvaW4gYXR0YWNoZWQgdG8gYW55IG9mIHRoZXNlIHdvdWxkIG90aGVyd2lzZQovLyBiZWNvbWUgc3dlZXBhYmxlIHN1cnBsdXMg4oCUIHNpbGVudGx5IGNvbnZlcnRpbmcgYSB1c2VyJ3MgY29pbnMgaW50bwovLyBvcGVyYXRvciBmdW5kcyDigJQgc28gYWJvcnRpbmcgYW5kIHJldmVydGluZyB0aGUgdHJhbnNmZXIgaXMgdGhlIG9ubHkgc2FmZQovLyBhbnN3ZXIuIFRoZSBjb3VudCBhc3NlcnRpb24gaXMgZGVsaWJlcmF0ZTogYSB0YWJsZSB0aGF0IHNpbGVudGx5IGxvc3QKLy8gaXRzIHJvd3Mgd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBncmVlbi4KZnVuYyBUZXN0U3RyYXlTZW5kSXNSZWplY3RlZE9uRXZlcnlOb25QYXlhYmxlRW50cnlwb2ludChjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJZnVuZEFzKGN1ciwgb3duZXIxLCBNaW5GdW5kaW5nKQoJaWQgOj0gZ3JhbnRBcyhjdXIsIG93bmVyMSwgZGVsZWdhdGUxLCAxMDBfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJLy8gTm8gSXNzdWVDb2luczogdGhlIGVudmVsb3BlIGlzIHN0YWdlZCBidXQgbmV2ZXIgbWlycm9yZWQgaW50byB0aGUKCS8vIGJhbmssIHNvIGEgcmVmdXNlZCBjYWxsIGNhbm5vdCBsZWF2ZSBzdXJwbHVzIGJlaGluZC4KCWNhbGxzIDo9IFtdZnVuYygpewoJCWZ1bmMoKSB7IFdpdGhkcmF3UG9vbChjcm9zcyhjdXIpLCAxKSB9LAoJCWZ1bmMoKSB7IFdpdGhkcmF3UG9vbEFsbChjcm9zcyhjdXIpKSB9LAoJCWZ1bmMoKSB7IEdyYW50KGNyb3NzKGN1ciksIGRlbGVnYXRlMiwgIiIsIDEwMF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkgfSwKCQlmdW5jKCkgeyBBbWVuZChjcm9zcyhjdXIpLCBpZCwgMTAwXzAwMCwgMCwgMCkgfSwKCQlmdW5jKCkgeyBSZXZva2UoY3Jvc3MoY3VyKSwgaWQpIH0sCgkJZnVuYygpIHsgUmVhcChjcm9zcyhjdXIpLCBpZCkgfSwKCQlmdW5jKCkgeyBEcmF3KGNyb3NzKGN1ciksIGlkLCAxXzAwMCkgfSwKCQlmdW5jKCkgeyBDbGFpbShjcm9zcyhjdXIpKSB9LAoJCWZ1bmMoKSB7IFdpdGhkcmF3RmVlcyhjcm9zcyhjdXIpKSB9LAoJCWZ1bmMoKSB7IFN3ZWVwU3VycGx1cyhjcm9zcyhjdXIpLCBEZW5vbSkgfSwKCX0KCXVhc3NlcnQuRXF1YWwodCwgMTAsIGxlbihjYWxscykpCgoJZm9yIF8sIGNhbGwgOj0gcmFuZ2UgY2FsbHMgewoJCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3duZXIxKSkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQodWdub3QoMSkpCgkJdWFzc2VydC5BYm9ydHNXaXRoTWVzc2FnZSh0LCBjdXIsCgkJCSJ0aGlzIGVudHJ5cG9pbnQgZG9lcyBub3QgYWNjZXB0IGNvaW5zIiwgY2FsbCkKCQl0ZXN0aW5nLlNldE9yaWdpblNlbmQobmlsKQoJfQoKCS8vIFRoZSBndWFyZCBydW5zIEZJUlNUIGluIGV2ZXJ5IG9uZSBvZiB0aGVtLCB3aGljaCBpcyB3aHkgZXZlbiBjYWxscwoJLy8gdGhhdCB3b3VsZCBoYXZlIGZhaWxlZCBvbiB0aGVpciBvd24gYXJndW1lbnRzIGFib3J0IHdpdGggdGhpcwoJLy8gbWVzc2FnZSDigJQgYW5kIHdoeSBub3RoaW5nIGFib3ZlIGNoYW5nZWQgYW55IHN0YXRlLgoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLCBQb29sT2Yob3duZXIxKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIEdyYW50c09mKG93bmVyMSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMF8wMDApLCBSZW1haW5pbmcoaWQpKQoJYXNzZXJ0U29sdmVudCh0KQoKCXJldm9rZUFzKGN1ciwgb3duZXIxLCBpZCkKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCn0KCi8vIFRlc3REcmF3YWJsZUlzVGhlTGVzc2VyT2ZBdXRob3JpdHlBbmRQb29sIHBpbnMgdGhlIHJlYWxtJ3Mgb3duCi8vIGNvbnRyaWJ1dGlvbiB0byB0aGUgdmlldyBzdXJmYWNlLiBzcGVuZGJvb2sgYm91bmRzIFBFUk1JU1NJT04gYW5kIHNheXMKLy8gc287IGl0IG5ldmVyIHNwZWFrcyBhYm91dCBzb2x2ZW5jeS4gUmVtYWluaW5nIGlzIHRoZSBhdXRob3JpdHkgZmlndXJlCi8vIGFuZCBEcmF3YWJsZSBpcyB0aGUgaG9uZXN0IG9uZSwgYW5kIGNvbmZsYXRpbmcgdGhlbSBpcyB3aGF0IHdvdWxkIG1ha2UKLy8gdGhlIHJlYWxtIHByb21pc2Ugd2hhdCBpdCBkb2VzIG5vdCBob2xkLgpmdW5jIFRlc3REcmF3YWJsZUlzVGhlTGVzc2VyT2ZBdXRob3JpdHlBbmRQb29sKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCgoJLy8gQXV0aG9yaXR5IGJlbG93IHRoZSBwb29sOiBhdXRob3JpdHkgYmluZHMuCglzbWFsbCA6PSBncmFudEFzKGN1ciwgb3duZXIxLCBkZWxlZ2F0ZTEsIDEwMF8wMDAsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMTAwXzAwMCksIFJlbWFpbmluZyhzbWFsbCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDEwMF8wMDApLCBEcmF3YWJsZShzbWFsbCkpCgoJLy8gQXV0aG9yaXR5IGFib3ZlIHRoZSBwb29sOiB0aGUgcG9vbCBiaW5kcywgYW5kIFJlbWFpbmluZyBkb2VzIE5PVAoJLy8gbW92ZSDigJQgdGhlIHR3byB2aWV3cyBhbnN3ZXIgZGlmZmVyZW50IHF1ZXN0aW9ucy4KCWJpZyA6PSBncmFudEFzKGN1ciwgb3duZXIxLCBkZWxlZ2F0ZTIsIDUqTWluRnVuZGluZywgTWluUGVyaW9kQmxvY2tzLCAwLCAwKQoJdWFzc2VydC5FcXVhbCh0LCA1Kk1pbkZ1bmRpbmcsIFJlbWFpbmluZyhiaWcpKQoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLCBEcmF3YWJsZShiaWcpKQoKCS8vIFR3byBncmFudHMsIG9uZSBwb29sOiB0aHJlZSBncmFudHMgb2YgMTAwIGFnYWluc3QgYSBwb29sIG9mIDEwMCBhcmUKCS8vIGFsbCB0aHJlZSB2YWxpZCBhbmQgdGhlIGZpcnN0IGRlbGVnYXRlIHRvIGRyYXcgZ2V0cyB0aGUgbW9uZXkuIFRoZQoJLy8gc3VtIG9mIHdoYXQgaXMgZHJhd2FibGUgZGVsaWJlcmF0ZWx5IEVYQ0VFRFMgdGhlIHBvb2wsIGJlY2F1c2UgYQoJLy8gYnVkZ2V0IGlzIGF1dGhvcml0eSBhbmQgbm90IGEgcmVzZXJ2YXRpb24uCgl1YXNzZXJ0LlRydWUodCwgRHJhd2FibGUoc21hbGwpK0RyYXdhYmxlKGJpZykgPiBQb29sT2Yob3duZXIxKSkKCglkcmF3QXMoY3VyLCBkZWxlZ2F0ZTEsIHNtYWxsLCAxMDBfMDAwKQoJdWFzc2VydC5FcXVhbCh0LCBNaW5GdW5kaW5nLTEwMF8wMDAsIERyYXdhYmxlKGJpZykpIC8vIHRoZSBvdGhlciBzaHJhbmsKCgljbGFpbUFzKGN1ciwgZGVsZWdhdGUxKQoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIHNtYWxsKQoJcmV2b2tlQXMoY3VyLCBvd25lcjEsIGJpZykKCXdpdGhkcmF3QWxsQXMoY3VyLCBvd25lcjEpCgl0aWR5RmVlcyhjdXIsIHQpCn0KCmZ1bmMgVGVzdFZpZXdzUmVmdXNlVW5rbm93bklkcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJYmVnaW4oKQoJLy8gUGFuaWNzV2l0aE1lc3NhZ2UsIG5vdCBBYm9ydHNXaXRoTWVzc2FnZSwgYW5kIHRoZSBkaXN0aW5jdGlvbiBpcyB0aGUKCS8vIHZpZXcvZW50cnlwb2ludCBvbmUgcmF0aGVyIHRoYW4gYSBzdHlsZSBjaG9pY2UuIHJldml2ZSgpIGNhdGNoZXMgYW4KCS8vIEFCT1JULCB3aGljaCBpcyB3aGF0IGEgcGFuaWMgYmVjb21lcyB3aGVuIGl0IGNyb3NzZXMgYSByZWFsbQoJLy8gYm91bmRhcnk7IHRoZXNlIHNpeCBhcmUgbm9uLWNyb3NzaW5nIHZpZXcgZnVuY3Rpb25zIGNhbGxlZCBzdHJhaWdodAoJLy8gZnJvbSB0aGUgdGVzdCdzIG93biBmcmFtZSwgc28gdGhlaXIgcGFuaWMgbmV2ZXIgY3Jvc3NlcyBhbnl0aGluZyBhbmQKCS8vIHN0YXlzIGEgcGxhaW4gcGFuaWMuIEV2ZXJ5IG90aGVyIHJlZnVzYWwgYXNzZXJ0ZWQgaW4gdGhpcyBmaWxlIGdvZXMKCS8vIHRocm91Z2ggYSBjcm9zc2luZyBoZWxwZXIgKGRyYXdBcywgZ3JhbnRBcywg4oCmKSBhbmQgaXMgY29ycmVjdGx5IGFuCgkvLyBhYm9ydC4gR2V0dGluZyB0aGlzIGJhY2t3YXJkcyBkb2VzIG5vdCB3ZWFrZW4gdGhlIGFzc2VydGlvbiDigJQgaXQKCS8vIGZhaWxzIGxvdWRseSwgd2hpY2ggaXMgaG93IGl0IHdhcyBmb3VuZC4KCXVhc3NlcnQuUGFuaWNzV2l0aE1lc3NhZ2UodCwgY3VyLCAidW5rbm93biBncmFudCBpZCIsIGZ1bmMoKSB7IEdyYW50SW5mbyg5OTlfOTk5KSB9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIGdyYW50IGlkIiwgZnVuYygpIHsgR3JhbnRVc2FnZSg5OTlfOTk5KSB9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIGdyYW50IGlkIiwgZnVuYygpIHsgR3JhbnRMYWJlbCg5OTlfOTk5KSB9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIGdyYW50IGlkIiwgZnVuYygpIHsgUmVtYWluaW5nKDk5OV85OTkpIH0pCgl1YXNzZXJ0LlBhbmljc1dpdGhNZXNzYWdlKHQsIGN1ciwgInVua25vd24gZ3JhbnQgaWQiLCBmdW5jKCkgeyBEcmF3YWJsZSg5OTlfOTk5KSB9KQoJdWFzc2VydC5QYW5pY3NXaXRoTWVzc2FnZSh0LCBjdXIsICJ1bmtub3duIGdyYW50IGlkIiwgZnVuYygpIHsgSXNFeHBpcmVkKDk5OV85OTkpIH0pCgoJLy8gVGhlIHplcm8gdmFsdWVzIG9mIHRoZSBub24tcGFuaWNraW5nIHZpZXdzIGFyZSAibm90aGluZyIsIG5vdCBhbgoJLy8gZXJyb3IsIHdoaWNoIGlzIGNvcnJlY3QgZm9yIGFuIGFkZHJlc3MgdGhhdCBzaW1wbHkgaGFzIG5vIHN0YXRlLgoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgUG9vbE9mKG1hbGxvcnkpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgQ3JlZGl0T2YobWFsbG9yeSkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDApLCBHcmFudHNPZihtYWxsb3J5KSkKfQoKLy8gLS0tIHJlbmRlciAtLS0KCmZ1bmMgVGVzdFJlbmRlclBhZ2VzKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCgloIDo9IEhlaWdodCgpCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCglpZCA6PSBHcmFudChjcm9zcyhjdXIpLCBkZWxlZ2F0ZTEsICJvcHMgPHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0PiIsCgkJMTAwXzAwMCwgTWluUGVyaW9kQmxvY2tzLCA1MDBfMDAwLCBoKzFfMDAwKQoJZHJhd0FzKGN1ciwgZGVsZWdhdGUxLCBpZCwgNDBfMDAwKQoKCWluZGV4IDo9IFJlbmRlcigiIikKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGluZGV4LCAiIyBCdWRnZXRzIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgImNvbnNlcnZhdGlvbjogT0siKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGluZGV4LCAiW2xpdmVdIikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIiMiK2l0b2EoaWQpKSkKCS8vIFRoZSBmcmVlLXRleHQgbGFiZWwgcmVhY2hlcyBtYXJrZG93biBvbmx5IHRocm91Z2ggdGhlIGVjb3N5c3RlbQoJLy8gc2FuaXRpemVyLCBzbyB0aGUgcmF3IHRhZyBtdXN0IG5vdCBzdXJ2aXZlIGludG8gdGhlIHBhZ2UuCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5kZXgsICI8c2NyaXB0PiIpKQoKCXBhZ2UgOj0gUmVuZGVyKGl0b2EoaWQpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIiMgR3JhbnQgIyIraXRvYShpZCkpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgb3duZXIxLlN0cmluZygpKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsIGRlbGVnYXRlMS5TdHJpbmcoKSkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAic3BlbnQgdGhpcyB3aW5kb3c6IDQwMDAwdWdub3QiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJhdXRob3JpemVkIGJ5IHRoZSB0ZXJtczogNjAwMDB1Z25vdCIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgImRyYXdhYmxlOiA2MDAwMHVnbm90IikpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiZHJhdyBmZWU6IDElIikpCgl1YXNzZXJ0LkZhbHNlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIjxzY3JpcHQ+IikpCgoJLy8gVGhlIG5vdC1mdW5kZWQgY2FzZSBpcyBjYWxsZWQgYnkgaXRzIG5hbWUgcmF0aGVyIHRoYW4gc2hvd24gYXMgYQoJLy8gYmFyZSB6ZXJvLCBiZWNhdXNlICJhdXRob3JpemVkIGJ1dCB1bmZ1bmRlZCIgYW5kICJub3RoaW5nCgkvLyBhdXRob3JpemVkIiBhcmUgZGlmZmVyZW50IHNpdHVhdGlvbnMgZm9yIGEgZGVsZWdhdGUuCgl3aXRoZHJhd0FsbEFzKGN1ciwgb3duZXIxKQoJcGFnZSA9IFJlbmRlcihpdG9hKGlkKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJhdXRob3JpemVkIGJ5IHRoZSB0ZXJtczogNjAwMDB1Z25vdCIpKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgImRyYXdhYmxlOiAwdWdub3QiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJBdXRob3JpemVkIGJ1dCAqKm5vdCBmdW5kZWQqKiIpKQoKCS8vIEEgcXVldWVkIGxvb3NlbmluZyBpcyBkaXNjbG9zZWQgb24gdGhlIHBhZ2UsIHdpdGggdGhlIHRlcm1zIHRoYXQKCS8vIGFjdHVhbGx5IGdvdmVybiB1bnRpbCB0aGUgYm91bmRhcnkuCgl0ZXN0aW5nLlNldFJlYWxtKHRlc3RpbmcuTmV3VXNlclJlYWxtKG93bmVyMSkpCgl1YXNzZXJ0LkZhbHNlKHQsIEFtZW5kKGNyb3NzKGN1ciksIGlkLCA5MDBfMDAwLCAwLCAwKSkKCXBhZ2UgPSBSZW5kZXIoaXRvYShpZCkpCgl1YXNzZXJ0LlRydWUodCwgc3RyaW5ncy5Db250YWlucyhwYWdlLCAiQSAqKmxvb3NlcioqIGFtZW5kbWVudCBpcyBxdWV1ZWQiKSkKCgkvLyBFeHBpcnksIGFuZCB0aGUga2VlcGVyIHByb21wdCB0aGF0IGNvbWVzIHdpdGggaXQuCgl0ZXN0aW5nLlNraXBIZWlnaHRzKDFfMDAwKQoJcGFnZSA9IFJlbmRlcihpdG9hKGlkKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJoYXMgKipleHBpcmVkKioiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKHBhZ2UsICJSZWFwKCIraXRvYShpZCkrIikiKSkKCWluZGV4ID0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5kZXgsICJleHBpcmVkIChyZWFwYWJsZSkiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGluZGV4LCAiIyMgS2VlcGVyIHdvcmsiKSkKCgkvLyBCYWQgcGF0aHMgcmVuZGVyIGEgd2FybmluZyByYXRoZXIgdGhhbiBwYW5pY2tpbmcgYSBwYWdlLgoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCJub3QtYS1udW1iZXIiKSwgImludmFsaWQgZ3JhbnQgaWQiKSkKCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKFJlbmRlcigiOTk5OTk5IiksICJ1bmtub3duIGdyYW50IGlkIikpCgoJdGVzdGluZy5TZXRSZWFsbSh0ZXN0aW5nLk5ld1VzZXJSZWFsbShtYWxsb3J5KSkKCVJlYXAoY3Jvc3MoY3VyKSwgaWQpCgljbGFpbUFzKGN1ciwgZGVsZWdhdGUxKQoJdGlkeUZlZXMoY3VyLCB0KQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoUmVuZGVyKCIiKSwgIk5vbmUgeWV0IikpCn0KCmZ1bmMgVGVzdFJlbmRlckluZGV4SXNCb3VuZGVkKGN1ciByZWFsbSwgdCAqdGVzdGluZy5UKSB7CgliZWdpbigpCglmdW5kQXMoY3VyLCBvd25lcjEsIE1pbkZ1bmRpbmcpCglmdW5kQXMoY3VyLCBvd25lcjIsIE1pbkZ1bmRpbmcpCgoJaWRzIDo9IFtdaW50NjR7fQoJZm9yIGkgOj0gaW50NjQoMCk7IGkgPCBpbnQ2NChNYXhSZW5kZXJSb3dzKzIpOyBpKysgewoJCWZyb20sIHRvIDo9IG93bmVyMSwgZGVsZWdhdGUxCgkJaWYgaSA+PSBNYXhHcmFudHNQZXJPd25lciB7CgkJCWZyb20sIHRvID0gb3duZXIyLCBkZWxlZ2F0ZTIKCQl9CgkJaWRzID0gYXBwZW5kKGlkcywgZ3JhbnRBcyhjdXIsIGZyb20sIHRvLCBNaW5QZXJQZXJpb2QsIE1pblBlcmlvZEJsb2NrcywgMCwgMCkpCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIE1heFJlbmRlclJvd3MrMiwgbGVuKGlkcykpCgoJaW5kZXggOj0gUmVuZGVyKCIiKQoJdWFzc2VydC5UcnVlKHQsIHN0cmluZ3MuQ29udGFpbnMoaW5kZXgsICJTaG93aW5nIHRoZSAyMCBtb3N0IHJlY2VudCBvZiAyMiIpKQoJLy8gTmV3ZXN0IGZpcnN0LCBhbmQgdGhlIHR3byBvbGRlc3QgYXJlIG9mZiB0aGUgcGFnZS4KCXVhc3NlcnQuVHJ1ZSh0LCBzdHJpbmdzLkNvbnRhaW5zKGluZGV4LCAiIyIraXRvYShpZHNbbGVuKGlkcyktMV0pKSkKCXVhc3NlcnQuRmFsc2UodCwgc3RyaW5ncy5Db250YWlucyhpbmRleCwgIiMiK2l0b2EoaWRzWzBdKSsiXSIpKQoKCWZvciBpLCBpZCA6PSByYW5nZSBpZHMgewoJCWZyb20gOj0gb3duZXIxCgkJaWYgaW50NjQoaSkgPj0gTWF4R3JhbnRzUGVyT3duZXIgewoJCQlmcm9tID0gb3duZXIyCgkJfQoJCXJldm9rZUFzKGN1ciwgZnJvbSwgaWQpCgl9Cgl3aXRoZHJhd0FsbEFzKGN1ciwgb3duZXIxKQoJd2l0aGRyYXdBbGxBcyhjdXIsIG93bmVyMikKCWFzc2VydFNvbHZlbnQodCkKfQoKLy8gLS0tIHRoZSByZWFsbSdzIG93biBhcml0aG1ldGljIC0tLQoKZnVuYyBUZXN0QnBzUmVuZGVyc0V4YWN0bHkodCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LkVxdWFsKHQsICIxJSIsIGJwcygxMDApKQoJdWFzc2VydC5FcXVhbCh0LCAiNSUiLCBicHMoNTAwKSkKCXVhc3NlcnQuRXF1YWwodCwgIjAlIiwgYnBzKDApKQoJdWFzc2VydC5FcXVhbCh0LCAiMC41JSIsIGJwcyg1MCkpCgl1YXNzZXJ0LkVxdWFsKHQsICIwLjA1JSIsIGJwcyg1KSkKCXVhc3NlcnQuRXF1YWwodCwgIjIuMjUlIiwgYnBzKDIyNSkpCgl1YXNzZXJ0LkVxdWFsKHQsICIxMDAlIiwgYnBzKDEwXzAwMCkpCn0KCmZ1bmMgVGVzdFBhZElET3JkZXJzTnVtZXJpY2FsbHkodCAqdGVzdGluZy5UKSB7Cgl1YXNzZXJ0LlRydWUodCwgcGFkSUQoMikgPiBwYWRJRCgxKSkKCXVhc3NlcnQuVHJ1ZSh0LCBwYWRJRCgxMCkgPiBwYWRJRCg5KSkKCXVhc3NlcnQuVHJ1ZSh0LCBwYWRJRCgxMDApID4gcGFkSUQoOTkpKQoJdWFzc2VydC5FcXVhbCh0LCAyMCwgbGVuKHBhZElEKDEpKSkKCXVhc3NlcnQuRXF1YWwodCwgMjAsIGxlbihwYWRJRCgxXzAwMF8wMDApKSkKfQoKZnVuYyBUZXN0Q2hlY2tlZEFkZFJlZnVzZXNPdmVyZmxvdyh0ICp0ZXN0aW5nLlQpIHsKCWNvbnN0IG1heCA9IGludDY0KDE8PDYzIC0gMSkKCXN1bSwgb2sgOj0gY2hlY2tlZEFkZCgyLCAzKQoJdWFzc2VydC5UcnVlKHQsIG9rKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCg1KSwgc3VtKQoKCV8sIG9rID0gY2hlY2tlZEFkZChtYXgsIDEpCgl1YXNzZXJ0LkZhbHNlKHQsIG9rKQoJXywgb2sgPSBjaGVja2VkQWRkKG1heC0xLCAyKQoJdWFzc2VydC5GYWxzZSh0LCBvaykKCXN1bSwgb2sgPSBjaGVja2VkQWRkKG1heC0xLCAxKQoJdWFzc2VydC5UcnVlKHQsIG9rKQoJdWFzc2VydC5FcXVhbCh0LCBtYXgsIHN1bSkKfQoKLy8gLS0tIGhlbHBlcnMgdXNlZCBieSB0aGUgY2FzZXMgYWJvdmUgLS0tCgovLyBwZW5kaW5nT2YgdW5wYWNrcyBQZW5kaW5nVGVybXMgd2l0aG91dCB0aGUgZm91ci12YWx1ZSBjYWxsIHNpdGUgbm9pc2UuCmZ1bmMgcGVuZGluZ09mKGlkIGludDY0KSAocGVyUGVyaW9kLCB0b3RhbCBpbnQ2NCwgcGVuZGluZyBib29sKSB7CglwLCB0b3QsIF8sIGhhcyA6PSBQZW5kaW5nVGVybXMoaWQpCglyZXR1cm4gcCwgdG90LCBoYXMKfQoKLy8gdGlkeUZlZXMgZHJhaW5zIHRoZSBmZWUgcG90IGJldHdlZW4gY2FzZXMgc28gZWFjaCB0ZXN0J3MgZmVlCi8vIGFzc2VydGlvbnMgYXJlIGFic29sdXRlIHJhdGhlciB0aGFuIGN1bXVsYXRpdmUuIEl0IGlzIGEgdGVzdCBmaXh0dXJlLAovLyBub3QgYSBwcml2aWxlZ2VkIHBhdGg6IFdpdGhkcmF3RmVlcyBpcyBwZXJtaXNzaW9ubGVzcyBhbmQgaXRzCi8vIGRlc3RpbmF0aW9uIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBzbyB0aGVyZSBpcyBub3RoaW5nIGhlcmUgYSByZWFsCi8vIGNhbGxlciBjb3VsZCBub3QgYWxzbyBkby4KZnVuYyB0aWR5RmVlcyhjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJaWYgRmVlc0FjY3J1ZWQoKSA9PSAwIHsKCQlyZXR1cm4KCX0KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0obWFsbG9yeSkpCglXaXRoZHJhd0ZlZXMoY3Jvc3MoY3VyKSkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIEZlZXNBY2NydWVkKCkpCn0KCi8vIFRlc3RSZW5kZXJTaG93c0dvdmVybmluZ1Rlcm1zUGFzdEFuVW5vYnNlcnZlZEJvdW5kYXJ5IHBpbnMgdGhlIGF1ZGl0Ci8vIDIwMjYtMTEtMDQgTjEgcmVwYWlyLiBBIHF1ZXVlZCBsb29zZW5pbmcgR09WRVJOUyBlbmZvcmNlbWVudCBmcm9tIHRoZQovLyBmaXJzdCBib3VuZGFyeSBhZnRlciBpdCB3YXMgcXVldWVkIC0tIHNwZW5kYm9vaydzIGF0KCkgYXBwbGllcyBQZW5kaW5nCi8vIHdoZW5ldmVyIHRoZSB3aW5kb3cgaGFzIHJvbGxlZCAtLSBidXQgdGhlIHN0b3JlZCByZWNvcmQgc3RpbGwgaG9sZHMKLy8gdGhlIG9sZCBUZXJtcyB1bnRpbCB0aGUgbmV4dCB3cml0ZS4gVGhlIGdyYW50IHBhZ2UgdXNlZCB0byBwcmludCB0aGUKLy8gb2xkIHBlci13aW5kb3cgY2FwIHdpdGggYSBub3RlIGNsYWltaW5nICJ0aGUgdGVybXMgYWJvdmUgYXJlIHdoYXQKLy8gZ292ZXJuIjogcmlzay11bmRlcnN0YXRlbWVudCB0byB0aGUgb3duZXIsIG9uIHRoZSBzYW1lIHBhZ2Ugd2hvc2UKLy8gImF1dGhvcml6ZWQgYnkgdGhlIHRlcm1zIiBmaWd1cmUgYWxyZWFkeSB1c2VkIHRoZSBwZW5kaW5nIGNhcC4gVGhlCi8vIHBhZ2UgbXVzdCBkZXJpdmUgaXRzIHRlcm1zIGV4YWN0bHkgYXMgdGhlIGdhdGUgZG9lcy4KZnVuYyBUZXN0UmVuZGVyU2hvd3NHb3Zlcm5pbmdUZXJtc1Bhc3RBblVub2JzZXJ2ZWRCb3VuZGFyeShjdXIgcmVhbG0sIHQgKnRlc3RpbmcuVCkgewoJb3duciA6PSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoIm4xLW93bmVyIikKCXNwbmRyIDo9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygibjEtc3BlbmRlciIpCglmdW5kQXMoY3VyLCBvd25yLCAyXzAwMF8wMDApCglpZCA6PSBncmFudEFzKGN1ciwgb3duciwgc3BuZHIsIDFfMDAwLCBNaW5QZXJpb2RCbG9ja3MsIDAsIDApCgoJLy8gUXVldWUgYSBsb29zZW5pbmc6IHJhaXNlZCBwZXItd2luZG93IGNhcC4gSXQgbXVzdCBOT1QgZ292ZXJuIHlldC4KCXRlc3RpbmcuU2V0UmVhbG0odGVzdGluZy5OZXdVc2VyUmVhbG0ob3ducikpCglhcHBsaWVkIDo9IEFtZW5kKGNyb3NzKGN1ciksIGlkLCAyXzAwMCwgMCwgMCkKCXVhc3NlcnQuRmFsc2UodCwgYXBwbGllZCkgLy8gcXVldWVkLCBub3QgYXBwbGllZAoJcGFnZSA6PSBSZW5kZXIoaXRvYShpZCkpCglpZiAhc3RyaW5ncy5Db250YWlucyhwYWdlLCAicGVyLXdpbmRvdyBjYXA6IDEwMDB1Z25vdCIpIHx8CgkJIXN0cmluZ3MuQ29udGFpbnMocGFnZSwgIlVudGlsIHRoZW4gdGhlIHRlcm1zIGFib3ZlIGFyZSB3aGF0IGdvdmVybiIpIHsKCQl0LkZhdGFsZigicHJlLWJvdW5kYXJ5IHBhZ2Ugd3Jvbmc6XG4lcyIsIHBhZ2UpCgl9CgoJLy8gQ3Jvc3MgdGhlIGJvdW5kYXJ5IHdpdGggTk8gaW50ZXJ2ZW5pbmcgd3JpdGUuIFRoZSBwZW5kaW5nIHRlcm1zCgkvLyBub3cgZ292ZXJuIGVuZm9yY2VtZW50IChhdCgpIGFwcGxpZXMgdGhlbSk7IHRoZSBwYWdlIG11c3Qgc2F5IHNvLgoJdGVzdGluZy5Ta2lwSGVpZ2h0cyhNaW5QZXJpb2RCbG9ja3MpCglwYWdlID0gUmVuZGVyKGl0b2EoaWQpKQoJaWYgIXN0cmluZ3MuQ29udGFpbnMocGFnZSwgInBlci13aW5kb3cgY2FwOiAyMDAwdWdub3QiKSB7CgkJdC5GYXRhbGYoInBhZ2Ugc3RpbGwgcHJpbnRzIHRoZSBzdXBlcnNlZGVkIGNhcCBwYXN0IHRoZSBib3VuZGFyeTpcbiVzIiwgcGFnZSkKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnMocGFnZSwgIlVudGlsIHRoZW4gdGhlIHRlcm1zIGFib3ZlIGFyZSB3aGF0IGdvdmVybiIpIHsKCQl0LkZhdGFsZigicGFnZSBzdGlsbCBjbGFpbXMgdGhlIHN0b3JlZCB0ZXJtcyBnb3Zlcm4gcGFzdCB0aGUgYm91bmRhcnkiKQoJfQp9ChpiCgtnbm9tb2QudG9tbBJTbW9kdWxlID0gImduby5sYW5kL3IvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9idWRnZXRzIgpnbm8gPSAiMC45IgoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTIwMDAwMDAwdWdub3QSEwiAxoaPARILMTUwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECPhf90g+OC8yXeUFx4dbxf0HAqOip4lwnD2jA+CeUVacSQNw75iDlfRsAqAF6WRlchd1Qnqu7EIF0dJiLvvxfYgH0HjFRh/G7cN79EHk9DThbsm27pZ1/1a4+f522i0FfqTMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}