{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "G7VUvLNl9OIDo8e+ose8v3XA3977Ewhi03InhUt0O7M=",
    "height": "1314523",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "250000000",
      "GasUsed": "136359685"
    },
    "tx": "CrK1BgoML3ZtLm1fYWRkcGtnEqC1BgooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORLjtAYKCXNwZW5kYm9vaxJAZ25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NwZW5kYm9vay92MhpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zcGVuZGJvb2svdjIiCmdubyA9ICIwLjkiChr45gEKDXNwZW5kYm9vay5nbm8S5eYBLy8gUGFja2FnZSBzcGVuZGJvb2sgaXMgYSBwdXJlIGFsbG93YW5jZSBwcmltaXRpdmUgZm9yIHJlYWxtcyB0aGF0IG5lZWQgdG8KLy8gbGV0IG9uZSBwYXJ0eSBzcGVuZCBhbm90aGVyIHBhcnR5J3MgZnVuZHMsIHVwIHRvIGEgYm91bmRlZCBhbW91bnQsIG92ZXIKLy8gbWFueSB0cmFuc2FjdGlvbnMuIEl0IGlzIHRvICpkZWxlZ2F0ZWQgc3BlbmRpbmcqIHdoYXQgZHVlYm9vayBpcyB0bwovLyAqdGltZSo6IGl0IGhvbGRzIG5vIGNvaW5zLCBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzIG5vIGNoYWluIEFQSXMsCi8vIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducyBhICpCb29rLAovLyBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgV2h5IHYyIGV4aXN0cwovLwovLyB2MSBvZiB0aGlzIHBhY2thZ2UgaXMgZGVwbG95ZWQgYW5kIGltbXV0YWJsZS4gSXRzIEFQSSBpcyB1bmNoYW5nZWQgaGVyZTsKLy8gT05FIG1ldGhvZCBib2R5IGRpZmZlcnMsIGFuZCBpdCBpcyBhIGNvcnJlY3RuZXNzIGZpeDoKLy8KLy8JdjE6ICBmdW5jIChhIEFsbG93YW5jZSkgSXNFeHBpcmVkKG5vdyBpbnQ2NCkgYm9vbCB7Ci8vCSAgICAgICAgIHJldHVybiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5vdyA+PSBhLlRlcm1zLkV4cGlyZXNBdAovLwkgICAgIH0KLy8KLy8gYS5UZXJtcyBpcyB0aGUgTEFTVC1XUklUVEVOIHJlY29yZCwgbm90IHRoZSB0ZXJtcyBpbiBmb3JjZS4gRXZlcnkgb3RoZXIKLy8gbGl2ZSBxdWVzdGlvbiBpbiB0aGlzIHBhY2thZ2UgaXMgcm91dGVkIHRocm91Z2ggYXQoKSwgd2hpY2ggcmVzb2x2ZXMgYQovLyBwZW5kaW5nIGFtZW5kbWVudCBhdCB0aGUgd2luZG93IGJvdW5kYXJ5IGl0IGlzIGR1ZSBhdDsgSXNFeHBpcmVkIHdhcyB0aGUKLy8gb25lIGV4cG9ydGVkIHByZWRpY2F0ZSB0aGF0IHJlYWQgdGhlIHN0b3JlZCBmaWVsZCBpbnN0ZWFkLiBCZWNhdXNlIGFuCi8vIGFtZW5kbWVudCB0aGF0IG1vdmVzIEV4cGlyZXNBdCBpbiB0aGUgTE9PU0VSIGRpcmVjdGlvbiBjYW4gb25seSBldmVyIGJlCi8vIFFVRVVFRCAtLSB0aWdodGVyT3JFcXVhbFRvIHJlZnVzZXMgYm90aCAicHVzaCB0aGUgZXhwaXJ5IG91dCIgYW5kICJyZW1vdmUKLy8gdGhlIGV4cGlyeSIgYXMgaW1tZWRpYXRlIC0tIHF1ZXVlaW5nIGlzIHRoZSBvbmx5IHBhdGggc3VjaCBhbiBhbWVuZG1lbnQKLy8gaGFzLCBzbyB0aGUgc3RhbGUgcmVhZCB3YXMgb24gdGhhdCBwYXRoIGV2ZXJ5IHRpbWUuCi8vCi8vIFRoZSBjb25zZXF1ZW5jZSBpcyBub3Qgb25lIGJ1ZyBidXQgdHdvLCBwb2ludGluZyBvcHBvc2l0ZSB3YXlzLCBhbmQgdGhlCi8vIHNlY29uZCBpcyB0aGUgZGFuZ2Vyb3VzIG9uZToKLy8KLy8gICAtIFVOREVSLWF1dGhvcml6YXRpb24uIEFuIG93bmVyIGV4dGVuZHMgdGhlIGV4cGlyeS4gVGhlIGFtZW5kbWVudCBpcwovLyAgICAgYWNjZXB0ZWQgYW5kIHF1ZXVlZCwgdGhlIGJvdW5kYXJ5IGFycml2ZXMsIGF0KCkgcHV0cyB0aGUgbmV3IGV4cGlyeSBpbgovLyAgICAgZm9yY2UgLS0gYW5kIElzRXhwaXJlZCBzdGlsbCBhbnN3ZXJzIGZyb20gdGhlIG9sZCBvbmUuIEF0IHRoZSBPTEQKLy8gICAgIGV4cGlyeTogUmVtYWluaW5nIHJlcG9ydHMgMCwgU3BlbmQgcmV0dXJucyBFcnJFeHBpcmVkLCBhbmQgUmVhcCwgd2hpY2gKLy8gICAgIGlzIFBFUk1JU1NJT05MRVNTLCBsZXRzIGFueSB0aGlyZCBwYXJ0eSBkZWxldGUgYW4gYWxsb3dhbmNlIHRoZSBvd25lcgovLyAgICAgaGFkIGp1c3QgZXh0ZW5kZWQuIFRoZSBvd25lcidzIGFjY2VwdGVkIGFtZW5kbWVudCBpcyBzaWxlbnRseQovLyAgICAgZGlzY2FyZGVkLCB3aGljaCB0aGUgdjEgZG9jIGNhbGxzICJ0aGUgZmFpbHVyZSBtb2RlIHRoaXMgcGFja2FnZSBpcwovLyAgICAgbGVhc3QgYWJsZSB0byBleHBsYWluIGFmdGVyIHRoZSBmYWN0IiAtLSBhYm91dCBhIGRpZmZlcmVudCBjYXNlLCBpbgovLyAgICAgQW1lbmQsIGZvdXIgbGluZXMgZnJvbSB0aGUgZ3VhcmQgdGhhdCBkb2VzIG5vdCBjb3ZlciB0aGlzIG9uZS4KLy8KLy8gICAtIE9WRVItYXV0aG9yaXphdGlvbi4gQW4gYW1lbmRtZW50IG1heSBiZSBsb29zZXIgaW4gUGVyUGVyaW9kIGFuZAovLyAgICAgVElHSFRFUiBpbiBFeHBpcmVzQXQ7IHRpZ2h0ZXJPckVxdWFsVG8gaXMgd2Vha2x5LXRpZ2h0ZXIgaW4gRVZFUlkKLy8gICAgIGRpbWVuc2lvbiwgc28gdGhhdCBtaXggcXVldWVzIGFzIGEgd2hvbGUuIFBhc3QgdGhlIGJvdW5kYXJ5LCBhdCgpCi8vICAgICBoYW5kcyBTcGVuZCB0aGUgbmV3IFBlclBlcmlvZCB3aGlsZSBJc0V4cGlyZWQgcmVwb3J0cyB0aGUgYWxsb3dhbmNlCi8vICAgICBhbGl2ZSBvbiB0aGUgT0xELCBsYXRlciBleHBpcnkuIFRoZSBzcGVuZGVyIGRyYXdzIC0tIGF0IHRoZSByYWlzZWQgY2FwCi8vICAgICAtLSBwYXN0IGFuIGV4cGlyeSB0aGUgb3duZXIgdGhlbXNlbHZlcyBzZXQuIE5vIGJvdW5kIGluIHRoaXMgcGFja2FnZQovLyAgICAgc3RvcHMgaXQsIGJlY2F1c2UgdGhlIGJvdW5kIHdhcyBtb3ZlZCBhbmQgdGhlIGdhdGUgd2FzIG5vdCB0b2xkLgovLwovLyBCb3RoIGFyZSByZXBhaXJlZCBieSByZXNvbHZpbmcgdGhlIGV4cGlyeSB0aHJvdWdoIGF0KCkuIE5laXRoZXIgY291bGQgYmUKLy8gcmVwYWlyZWQgaW4gdjE6IGEgL3AvIGlzIGltbXV0YWJsZSBhZnRlciBhZGRwa2csIGFuZCB2MSdzIHR3byBsaXZlCi8vIGNvbnN1bWVycyBhcmUgdGhlbXNlbHZlcyBpbW11dGFibGUgcmVhbG1zIHdpdGggdjEncyBieXRlcyBjb21waWxlZCBpbnRvCi8vIGV2ZXJ5IHBhdGggdGhleSBydW4uIHYxIHRoZXJlZm9yZSBzdGF5cyBsaXZlIGFuZCBrZWVwcyB0aGUgZGVmZWN0OyBpdCBpcwovLyBub3QgcmV0aXJlZCBieSB0aGlzIHBhY2thZ2UgZXhpc3RpbmcsIGFuZCBub3RoaW5nIGhlcmUgbWlncmF0ZXMgaXQuCi8vCi8vIFRoZSB2MSB3b3JrYXJvdW5kLCBmb3IgYSBjb25zdW1lciBzdHVjayBvbiBpdDogcmVzdGF0aW5nIHRoZSBTQU1FCi8vIGFtZW5kbWVudCBpbnNpZGUgW25leHQgYm91bmRhcnksIG9sZCBleHBpcnkpIGFwcGxpZXMgaXQgaW1tZWRpYXRlbHkgLS0KLy8gQW1lbmQgcm9sbHMgdGhlIHdpbmRvdyBmaXJzdCwgcHJvbW90aW5nIHRoZSBwZW5kaW5nIHRlcm1zIGludG8gYS5UZXJtcywKLy8gYW5kIHRoZSByZXN0YXRlbWVudCBpcyB0aGVuIGVxdWFsLXRvIHJhdGhlciB0aGFuIGxvb3Nlci4gSXQgaXMgb3duZXItb25seSwKLy8gbW92ZXMgbm8gZnVuZHMsIGFuZCBuZWVkcyBubyBzcGVuZC4gSXQgbXVzdCBiZSBkb25lIEJFRk9SRSB0aGUgb2xkIGV4cGlyeTsKLy8gYWZ0ZXJ3YXJkcyB2MSdzIEFtZW5kIHJlZnVzZXMgd2l0aCBFcnJFeHBpcmVkLCBhbmQgUmV2b2tlIHBsdXMgYSBmcmVzaAovLyBPcGVuIGlzIHRoZSBvbmx5IHJvdXRlIGxlZnQuCi8vCi8vICMgV2h5IHRoaXMgcGFja2FnZSBleGlzdHMKLy8KLy8gVGhlIGVjb3N5c3RlbSdzIGV4aXN0aW5nIGFsbG93YW5jZSBwcmltaXRpdmUsCi8vIGduby5sYW5kL3AvamFla3dvbi9hbGxvd2FuY2VzZW5kZXIvdjAsIGlzIHNjb3BlZCB0byBhIHNpbmdsZSBjYWxsIGFuZAovLyBzYXlzIHNvIGluIGl0cyBvd24gZG9jdW1lbnRhdGlvbjoKLy8KLy8JIkFsbG93YW5jZSBzdXJ2aXZlcyBhY3Jvc3MgTiB0eHMgYnV0IG5vdCBOKzEgdHhzLiIgVXNlIGEgc2Vzc2lvbgovLwljb3VudGVyIHBhdHRlcm4gaW4gdGhlIGdyYW50ZXIgcmVhbG07IHRoaXMgcGFja2FnZSdzIENsb3NlIGlzCi8vCWJpbmFyeSwgbm90IGRlYWRsaW5lLWJhc2VkLgovLwovLyBJdCB0aGVuIGRlY2xpbmVzIGJsb2NrLWhlaWdodCBleHBpcnkgb24gdGhlIGdyb3VuZHMgdGhhdCBpdCAid291bGQKLy8gcmVxdWlyZSBydW50aW1lIGNvb3BlcmF0aW9uIi4gVGhhdCBpcyB0cnVlIG9ubHkgZm9yIGEgcGFja2FnZSB0aGF0IHJlYWRzCi8vIHRoZSBjbG9jayBpdHNlbGYuIHNwZW5kYm9vayBkb2VzIG5vdDogZXZlcnkgb3BlcmF0aW9uIHRha2VzIGBub3dgIGFzIGFuCi8vIGFyZ3VtZW50LCB3aGljaCBtYWtlcyB0aGUgd2luZG93IGFyaXRobWV0aWMgYSBwdXJlIGZ1bmN0aW9uIGFuZCB0aGUKLy8gd2hvbGUgcGFja2FnZSB1bml0LXRlc3RhYmxlIHdpdGhvdXQgYSBjaGFpbi4gVGhyZWUgYXBwbGljYXRpb24gcmVhbG1zIGluCi8vIHRoZSBzZWFyY2hlZCBzb3VyY2VzIGVhY2ggaGFuZC1yb2xsZWQgdGhpcyBtZWNoYW5pc20gaW50ZXJuYWxseSByYXRoZXIKLy8gdGhhbiBpbXBvcnRpbmcgb25lOyBzZWUgRElTQ09WRVJZLm1kLgovLwovLyAjIFRoZSBvbmUgaWRlYQovLwovLyBBbiBhbGxvd2FuY2UgaXMgbm90IGEgYmFsYW5jZS4gSXQgaXMgYSAqcGVybWlzc2lvbiB3aXRoIGEgY2VpbGluZyB0aGF0Ci8vIHJlZmlsbHMqLiBUaGUgb3duZXIgc2F5cyAidGhpcyBzcGVuZGVyIG1heSBkcmF3IGF0IG1vc3QgUGVyUGVyaW9kIHBlcgovLyB3aW5kb3csIGF0IG1vc3QgVG90YWwgZXZlciwgdW50aWwgRXhwaXJlc0F0LCBhbmQgSSBjYW4gcmV2b2tlIGl0IG5vdyI6Ci8vCi8vCWlmIGVyciA6PSBib29rLlNwZW5kKGlkLCBzcGVuZGVyS2V5LCBub3csIGFtb3VudCk7IGVyciAhPSBuaWwgewovLwkJcGFuaWMoZXJyKSAvLyByZXZva2VkLCBleHBpcmVkLCBvdmVyIHRoZSB3aW5kb3cgY2FwLCBvdmVyIHRoZSB0b3RhbAovLwl9Ci8vCS8vIC4uLiB0aGUgcmVhbG0gbW92ZXMgdGhlIGNvaW5zIGhlcmUsIHVuZGVyIGl0cyBvd24gYXV0aG9yaXR5Ci8vCi8vIFNwZW5kIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZSBpbiB0aGUgc2FtZSBjYWxsLAovLyBiZWZvcmUgcmV0dXJuaW5nLiBUaGUgcmVhbG0gdGhlbiBhY3RzLiBCZWNhdXNlIHRoZSByZWFsbSBwZXJmb3JtcyB0aGUKLy8gZWZmZWN0IGl0c2VsZiwgbm8gY2xvc3VyZSwgY2FsbGJhY2ssIG9yIGNhcGFiaWxpdHkgZXZlciBjcm9zc2VzIGEgcmVhbG0KLy8gYm91bmRhcnkuIHNwZW5kYm9vayBjYW5ub3QgYmUgaGFuZGVkIGNvZGUgdG8gcnVuLCBzbyBpdCBjYW5ub3QgYmUKLy8gdHJpY2tlZCBpbnRvIHJ1bm5pbmcgdGhlIHdyb25nIGNvZGUuCi8vCi8vICMgV2luZG93cyBhcmUgYW5jaG9yZWQsIG5vdCBzbGlkaW5nCi8vCi8vIEEgd2luZG93IGlzIGRlcml2ZWQgZnJvbSBhIGZpeGVkIG9yaWdpbiDigJQgdGhlIEFuY2hvciBzZXQgYXQgT3BlbiDigJQgYnkKLy8gaW50ZWdlciBkaXZpc2lvbjoKLy8KLy8JaW5kZXgobm93KSA9IChub3cgLSBBbmNob3IpIC8gUGVyaW9kTGVuZ3RoCi8vCi8vIHNvIHRoZSBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnlvbmUgYW5kIGEgc3BlbmRlciBjYW5ub3QgcmVzZXQgYQovLyB3aW5kb3cgYnkgY2hvb3Npbmcgd2hlbiB0byBjYWxsLiBBIHNsaWRpbmcgIlBlclBlcmlvZCBwZXIgdHJhaWxpbmcgTgovLyBibG9ja3MiIHdpbmRvdyB3b3VsZCBsZXQgYSBzcGVuZGVyIGRyYXcgdGhlIGZ1bGwgY2FwIGF0IHRoZSBlbmQgb2Ygb25lCi8vIHRyYWlsaW5nIHNwYW4gYW5kIGFnYWluIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dDsgYW5jaG9yaW5nIHJlbW92ZXMgdGhlCi8vIGNob2ljZS4gVGhlIHJlZmlsbCBpcyBhIFJFU0VULCBub3QgYSBjYXJyeTogYW4gdW51c2VkIGFsbG93YW5jZSBkb2VzIG5vdAovLyBhY2N1bXVsYXRlIGludG8gdGhlIG5leHQgd2luZG93LCBiZWNhdXNlIHRoZSBwb2ludCBvZiB0aGUgY2FwIGlzIHRvIGJvdW5kCi8vIHdvcnN0LWNhc2UgbG9zcyBwZXIgd2luZG93LCBhbmQgYSBjYXJyeSB3b3VsZCB1bmJvdW5kIGl0LgovLwovLyBQZXJpb2RMZW5ndGggPT0gMCBtZWFucyBvbmUgd2luZG93IHRoYXQgbmV2ZXIgcm9sbHM6IGEgcHVyZSBsaWZldGltZQovLyBhbGxvd2FuY2UsIHdoZXJlIFBlclBlcmlvZCBpcyB0aGUgb25seSBjYXAgdGhhdCBtYXR0ZXJzLgovLwovLyAjIEFtZW5kbWVudHMgY2Fubm90IGVubGFyZ2UgdGhlIGxpdmUgd2luZG93Ci8vCi8vIEFuIG93bmVyIHdobyBjb3VsZCByYWlzZSBQZXJQZXJpb2QgbWlkLXdpbmRvdyB3b3VsZCBiZSBhYmxlIHRvIHVuZG8gdGhlCi8vIGJvdW5kIGEgc3BlbmRlciBpcyByZWx5aW5nIG9uLCBhbmQg4oCUIHdvcnNlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24g4oCUIGFuCi8vIG93bmVyIHdobyBkcmFpbnMgYSByZWxhdGlvbnNoaXAgYW5kIHRoZW4gbG93ZXJzIHRlcm1zIHJldHJvYWN0aXZlbHkKLy8gY291bGQgc3RyYW5kIGEgc3BlbmRlciBtaWQtc2V0dGxlbWVudC4gVGhlIHJ1bGUgaGVyZSBpcyBvbmUtc2lkZWQgYW5kCi8vIGVuZm9yY2VkIGluIEFtZW5kOgovLwovLyAgIC0gVElHSFRFUi1PUi1FUVVBTCB0ZXJtcyBhcHBseSBJTU1FRElBVEVMWS4gTG93ZXJpbmcgYSBjZWlsaW5nIGNhbgovLyAgICAgbmV2ZXIgYXV0aG9yaXplIGEgZHJhdyB0aGF0IHdhcyBub3QgYWxyZWFkeSBhdXRob3JpemVkLCBzbyB0aGVyZSBpcwovLyAgICAgbm8gcmVhc29uIHRvIGRlbGF5IGl0LCBhbmQgZGVsYXlpbmcgaXQgd291bGQgbWFrZSB0aGUgb3duZXIncyBvbmx5Ci8vICAgICBmYXN0IHJlbWVkeSBSZXZva2UuCi8vICAgLSBMT09TRVIgdGVybXMgYXJlIFBFTkRJTkcgYW5kIHRha2UgZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdwovLyAgICAgYm91bmRhcnksIG5ldmVyIGluc2lkZSB0aGUgY3VycmVudCBvbmUuCi8vCi8vIFRoaXMgaXMgdGhlIHNhbWUgYWR2ZXJzYXJpYWwgcHJvYmxlbSB0aGF0IHIvc2FtY3Jldy9hZ2VudF9yZWdpc3RyeV92MgovLyBzb2x2ZXMgYnkgbG9ja2luZyBpdHMgcHJpY2Ugd2hpbGUgYW55IGNyZWRpdCBlbnRyeSBleGlzdHM7IHRoZSBzaGFwZQovLyBoZXJlIGlzIGEgZGVmZXJyYWwgcmF0aGVyIHRoYW4gYSBsb2NrLCBzbyB0ZXJtcyBjYW4gc3RpbGwgbW92ZS4KLy8KLy8gV2l0aCBQZXJpb2RMZW5ndGggPT0gMCB0aGVyZSBpcyBubyBuZXh0IGJvdW5kYXJ5LCBzbyBhIGxvb3NlbmluZwovLyBhbWVuZG1lbnQgaXMgcmVmdXNlZCB3aXRoIEVyck5vQm91bmRhcnkgcmF0aGVyIHRoYW4gc2lsZW50bHkgcXVldWVkCi8vIGZvcmV2ZXIuIFBlcmlvZExlbmd0aCBpdHNlbGYgaXMgSU1NVVRBQkxFOiBjaGFuZ2luZyBpdCB3b3VsZCBtb3ZlIGV2ZXJ5Ci8vIGZ1dHVyZSBib3VuZGFyeSwgd2hpY2ggaXMgYW4gZW5sYXJnZW1lbnQgdmVjdG9yIHdlYXJpbmcgYSBkaWZmZXJlbnQgaGF0LgovLwovLyAjIFN0YXRlIGdyb3d0aAovLwovLyBSZXZva2VkIGFsbG93YW5jZXMgYXJlIHJlbW92ZWQsIG5vdCBhcmNoaXZlZC4gSURzIGFyZSBhbGxvY2F0ZWQKLy8gbW9ub3RvbmljYWxseSBhbmQgbmV2ZXIgcmV1c2VkLCBzbyBhIHJldm9rZWQgSUQgY2FuIG5ldmVyIGJlIHJlc3VycmVjdGVkCi8vIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGtlZXAuIExpdmUgYWxsb3dhbmNlcyBhcmUgY2FwcGVkIHBlciBCb29rIGF0Ci8vIGNvbnN0cnVjdGlvbiwgc28gc3RvcmFnZSBpcyBib3VuZGVkIGJ5IG1heExpdmUgcmVnYXJkbGVzcyBvZiBob3cgbWFueQovLyBhbGxvd2FuY2VzIGhhdmUgZXZlciBleGlzdGVkLiBBdWRpdCBoaXN0b3J5IGJlbG9uZ3MgaW4gdGhlIGNvbnN1bWluZwovLyByZWFsbSdzIGV2ZW50cy4KLy8KLy8gQW4gRVhQSVJFRCBhbGxvd2FuY2UgaXMgbm90IHNlbGYtcmVtb3ZpbmcsIGFuZCBib3VuZGVkIHN0b3JhZ2UgaXMgbm90IHRoZQovLyBzYW1lIGFzIGEgdXNhYmxlIEJvb2s6IFNwZW5kIHJlZnVzZXMgaXQgZm9yZXZlciB3aGlsZSBpdCBzdGlsbCBob2xkcyBhCi8vIHNsb3QuIFJlYXAgZXhpc3RzIGZvciBleGFjdGx5IHRoYXQgYW5kIGlzIHBlcm1pc3Npb25sZXNzLCBiZWNhdXNlIGFuCi8vIGV4cGlyZWQgYWxsb3dhbmNlIGNhbiBhdXRob3JpemUgbm90aGluZyBhbmQgc28gcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZwovLyBmcm9tIGFueW9uZS4KLy8KLy8gV2hhdCB0aGlzIHBhY2thZ2UgZG9lcyBOT1QgYm91bmQgaXMgaG93IG1hbnkgb2YgYSBCb29rJ3Mgc2xvdHMgT05FIG93bmVyCi8vIG1heSBob2xkIOKAlCBtYXhMaXZlIGlzIGEgc2luZ2xlIGdsb2JhbCBmaWd1cmUsIHNvIGFueSBvd25lciBwZXJtaXR0ZWQgdG8KLy8gT3BlbiBjYW4gZXhoYXVzdCBpdCBhbmQgbG9jayBvdXQgdGhlIHJlc3QuIFRoYXQgaXMgYSBwb2xpY3kgcXVlc3Rpb24gd2l0aAovLyBubyBhbnN3ZXIgYSBwcmltaXRpdmUgY2FuIHBpY2sgKHBlci1vd25lciBxdW90YT8gZmlyc3QtY29tZT8gb3duZXIKLy8gd2hpdGVsaXN0PyksIHNvIGl0IGlzIGxlZnQgd2hlcmUgdGhlIGF1dGhlbnRpY2F0aW9uIGFscmVhZHkgbGl2ZXM6IHRoZQovLyBjb25zdW1pbmcgcmVhbG0gZGVjaWRlcyB3aG8gbWF5IE9wZW4sIGFuZCBhIEJvb2sgc2hhcmVkIGFjcm9zcyBtdXR1YWxseQovLyB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24gdG9wIG9mIHRoaXMgb25lLiBOYW1lZAovLyBoZXJlIHJhdGhlciB0aGFuIGltcGxpZWQsIGJlY2F1c2UgImJvdW5kZWQiIHJlYWRzIGxpa2UgInNhZmUgdG8gc2hhcmUiLgovLwovLyAjIENvbnN1bWVyIGNvbnRyYWN0ICh0aGUgcGFydHMgdGhlIHBhY2thZ2UgY2Fubm90IGVuZm9yY2UpCi8vCi8vICAxLiBTVVBQTFkgQSBSRUFMIENMT0NLLiBzcGVuZGJvb2sgY2Fubm90IHZlcmlmeSB0aGF0IGBub3dgIGNhbWUgZnJvbQovLyAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpIG9yIHRpbWUuTm93KCkuVW5peCgpLiBBIHJlYWxtIHRoYXQgbGV0cyBhCi8vICAgICBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBoYW5kZWQgdGhlIHNwZW5kZXIgdGhlIHBvd2VyIHRvIHJvbGwgdGhlCi8vICAgICB3aW5kb3cgYXQgd2lsbCwgd2hpY2ggZGVmZWF0cyBldmVyeSBjYXAgaW4gdGhpcyBwYWNrYWdlLiBQYXNzIHRoZQovLyAgICAgY2hhaW4ncyBvd24gY2xvY2ssIGFuZCB1c2UgdGhlIHNhbWUgdW5pdHMgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgovLwovLyAgMi4gQVVUSEVOVElDQVRFIFRIRSBTUEVOREVSIEtFWS4gc3BlbmRib29rIGNvbXBhcmVzIHRoZSBrZXkgc3RyaW5nIGl0Ci8vICAgICBpcyBnaXZlbiBhZ2FpbnN0IHRoZSBvbmUgcmVjb3JkZWQgYXQgT3Blbi4gSXQgY2Fubm90IHRlbGwgd2hldGhlcgovLyAgICAgdGhhdCBzdHJpbmcgaXMgdGhlIHJlYWwgY2FsbGVyLiBEZXJpdmUgaXQgZnJvbQovLyAgICAgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBuZXZlciBmcm9tIGFuIGFyZ3VtZW50IHRoZSBjYWxsZXIgc3VwcGxpZXMuCi8vCi8vICAzLiBTUEVORCBCRUZPUkUgU0VORElORy4gU3BlbmQgY29uc3VtZXMgdGhlIGFsbG93YW5jZSBhbmQgcmV0dXJuczsgdGhlCi8vICAgICByZWFsbSB0aGVuIG1vdmVzIGNvaW5zLiBEb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgbWVhbnMgYSBmYWlsZWQKLy8gICAgIHNlbmQgbGVhdmVzIHRoZSBhbGxvd2FuY2UgY29uc3VtZWQsIG9yIGEgc3VjY2Vzc2Z1bCBzZW5kIGxlYXZlcyBpdAovLyAgICAgdW5jb25zdW1lZCDigJQgYm90aCBhcmUgcmVhbCBsb3NzZXMuIFN0YXRlIGZpcnN0LCBlZmZlY3Qgc2Vjb25kLgovLwovLyAgNC4gQU4gQUxMT1dBTkNFIElTIE5PVCBDVVNUT0RZLiBzcGVuZGJvb2sgYXV0aG9yaXppbmcgMTAwIGRvZXMgbm90IG1lYW4KLy8gICAgIDEwMCBleGlzdHMuIFRoZSByZWFsbSBtdXN0IGNoZWNrIGl0cyBvd24gaGVsZCBiYWxhbmNlIHNlcGFyYXRlbHk7Ci8vICAgICB0aGlzIHBhY2thZ2UgYm91bmRzIHBlcm1pc3Npb24sIG5vdCBzb2x2ZW5jeS4KcGFja2FnZSBzcGVuZGJvb2sKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgopCgovLyBNYXhMaXZlTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4TGl2ZSBhIEJvb2sgbWF5IGJlIGNvbnN0cnVjdGVkIHdpdGguIEl0Ci8vIGJvdW5kcyB0aGUgd29yc3QtY2FzZSBjb3N0IG9mIEl0ZXJhdGUsIHdoaWNoIHNjYW5zIHRoZSBsaXZlIHNldC4KY29uc3QgTWF4TGl2ZUxpbWl0ID0gMTAwMDAKCi8vIE1heEtleUxlbiBib3VuZHMgYW4gb3duZXIgb3Igc3BlbmRlciBrZXkuIEEgYmVjaDMyIGdubyBhZGRyZXNzIGlzIDQwCi8vIGNoYXJhY3RlcnM7IHRoZSBoZWFkcm9vbSBleGlzdHMgc28gYSByZWFsbSBtYXkgbmFtZXNwYWNlIGl0cyBrZXlzLgpjb25zdCBNYXhLZXlMZW4gPSAxMjgKCi8vIG1heEludDY0IGlzIHRoZSBvdmVyZmxvdyBib3VuZGFyeSBmb3IgZXZlcnkgYWNjdW11bGF0aW9uIGhlcmUuCmNvbnN0IG1heEludDY0ID0gaW50NjQoMTw8NjMgLSAxKQoKLy8gRXJyb3JzIHJldHVybmVkIGJ5IEJvb2sgb3BlcmF0aW9ucy4KdmFyICgKCUVyckludmFsaWRDb25maWcgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIpCglFcnJFbXB0eU93bmVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogZW1wdHkgb3duZXIga2V5IikKCUVyckVtcHR5U3BlbmRlciAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBlbXB0eSBzcGVuZGVyIGtleSIpCglFcnJLZXlUb29Mb25nICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazoga2V5IGV4Y2VlZHMgTWF4S2V5TGVuIikKCUVyckludmFsaWROb3cgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBub3cgbXVzdCBiZSBub24tbmVnYXRpdmUiKQoJRXJySW52YWxpZFRlcm1zICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGludmFsaWQgdGVybXMiKQoJRXJySW52YWxpZEFtb3VudCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCUVyckJvb2tGdWxsICAgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBsaXZlIGFsbG93YW5jZSBjYXAgcmVhY2hlZCIpCglFcnJOb3RGb3VuZCAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogbm8gc3VjaCBsaXZlIGFsbG93YW5jZSIpCglFcnJOb3RFeHBpcmVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3QgZXhwaXJlZCIpCglFcnJOb3RPd25lciAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGRvZXMgbm90IG93biB0aGlzIGFsbG93YW5jZSIpCglFcnJOb3RTcGVuZGVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGlzIG5vdCB0aGlzIGFsbG93YW5jZSdzIHNwZW5kZXIiKQoJRXJyRXhwaXJlZCAgICAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFsbG93YW5jZSBoYXMgZXhwaXJlZCIpCglFcnJOb3RTdGFydGVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3Qgc3RhcnRlZCIpCglFcnJQZXJpb2RFeGNlZWRlZCA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYW1vdW50IGV4Y2VlZHMgdGhlIHdpbmRvdyBjYXAiKQoJRXJyVG90YWxFeGNlZWRlZCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSBsaWZldGltZSBjYXAiKQoJRXJyTm9Cb3VuZGFyeSAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IG5vIHJlYWNoYWJsZSBuZXh0IHdpbmRvdyBib3VuZGFyeSIpCglFcnJPdmVyZmxvdyAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogaW50NjQgb3ZlcmZsb3ciKQoJRXJySURFeGhhdXN0ZWQgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGlkZW50aWZpZXIgc3BhY2UgZXhoYXVzdGVkIikKKQoKLy8gVGVybXMgYXJlIHRoZSBjZWlsaW5ncyBvbiBhbiBhbGxvd2FuY2UuIFplcm8gaGFzIGEgZGlzdGluY3QgbWVhbmluZyBpbgovLyB0aHJlZSBvZiB0aGUgZm91ciBmaWVsZHMgYW5kIGl0IGlzIG5ldmVyICJ6ZXJvIGFsbG93ZWQiOgovLwovLwlQZXJQZXJpb2QgICAgPiAwIHJlcXVpcmVkLiBUaGUgY2FwIHBlciB3aW5kb3cuCi8vCVBlcmlvZExlbmd0aCAwIG1lYW5zIE9ORSB3aW5kb3cgdGhhdCBuZXZlciByb2xscyAobGlmZXRpbWUpLgovLwlUb3RhbCAgICAgICAgMCBtZWFucyBubyBsaWZldGltZSBjYXAuCi8vCUV4cGlyZXNBdCAgICAwIG1lYW5zIG5vIGV4cGlyeS4KdHlwZSBUZXJtcyBzdHJ1Y3QgewoJUGVyUGVyaW9kICAgIGludDY0CglQZXJpb2RMZW5ndGggaW50NjQKCVRvdGFsICAgICAgICBpbnQ2NAoJRXhwaXJlc0F0ICAgIGludDY0Cn0KCi8vIHZhbGlkIHJlcG9ydHMgd2hldGhlciB0aGUgdGVybXMgYXJlIHNlbGYtY29uc2lzdGVudCwgZ2l2ZW4gdGhlIGFuY2hvciB0aGUKLy8gYWxsb3dhbmNlIGlzIChvciB3b3VsZCBiZSkgb3BlbmVkIGF0LgpmdW5jICh0IFRlcm1zKSB2YWxpZChhbmNob3IgaW50NjQpIGJvb2wgewoJaWYgdC5QZXJQZXJpb2QgPD0gMCB8fCB0LlBlcmlvZExlbmd0aCA8IDAgfHwgdC5Ub3RhbCA8IDAgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgdC5FeHBpcmVzQXQgPCAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEFuIGFsbG93YW5jZSB0aGF0IGhhcyBhbHJlYWR5IGV4cGlyZWQgYXQgaXRzIG93biBhbmNob3IgY2FuIG5ldmVyCgkvLyBhdXRob3JpemUgYW55dGhpbmcsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBvbmx5IGNyZWF0ZSBhIGxpdmUgZW50cnkKCS8vIHRoYXQgZXZlcnkgU3BlbmQgcmVmdXNlcy4KCWlmIHQuRXhwaXJlc0F0ICE9IDAgJiYgdC5FeHBpcmVzQXQgPD0gYW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEEgVG90YWwgYmVsb3cgUGVyUGVyaW9kIGlzIG5vdCBhbiBlcnJvciAtLSBpdCBpcyBhIG5hcnJvd2VyIGxpZmV0aW1lCgkvLyBjYXAsIHdoaWNoIFNwZW5kIGVuZm9yY2VzLiBBIFRvdGFsIG9mIGV4YWN0bHkgMCBpcyAidW5saW1pdGVkIi4KCXJldHVybiB0cnVlCn0KCi8vIHRpZ2h0ZXJPckVxdWFsVG8gcmVwb3J0cyB3aGV0aGVyIHQgaXMgd2Vha2x5IHRpZ2h0ZXIgdGhhbiB1IGluIGV2ZXJ5Ci8vIGRpbWVuc2lvbiwgaS5lLiB3aGV0aGVyIHQgY2FuIGF1dGhvcml6ZSBub3RoaW5nIHUgd291bGQgbm90IGhhdmUuIFRoaXMgaXMKLy8gdGhlIHByZWRpY2F0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhbiBhbWVuZG1lbnQgYXBwbGllcyBpbW1lZGlhdGVseS4KLy8KLy8gVGhlIHplcm8tbWVhbnMtdW5saW1pdGVkIGZpZWxkcyBpbnZlcnQgdGhlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHRoZSB3aG9sZQovLyBzdWJ0bGV0eTogVG90YWwgMCBpcyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgVG90YWwsIGFuZCBFeHBpcmVzQXQgMCBpcwovLyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgRXhwaXJlc0F0LiBSZWFkaW5nIHRob3NlIHR3byBhcyAic21hbGxlciBpcwovLyB0aWdodGVyIiB3b3VsZCBsZXQgYW4gb3duZXIgcmVtb3ZlIGEgbGlmZXRpbWUgY2FwIGFuZCBhbiBleHBpcnkKLy8gbWlkLXdpbmRvdyBhbmQgY2FsbCBpdCBhIHRpZ2h0ZW5pbmcuCmZ1bmMgKHQgVGVybXMpIHRpZ2h0ZXJPckVxdWFsVG8odSBUZXJtcykgYm9vbCB7CglpZiB0LlBlcmlvZExlbmd0aCAhPSB1LlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlIC8vIGltbXV0YWJsZTsgc2VlIHRoZSBwYWNrYWdlIGRvYwoJfQoJaWYgdC5QZXJQZXJpb2QgPiB1LlBlclBlcmlvZCB7CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LlRvdGFsID09IDA6CgkJLy8gdSB3YXMgdW5saW1pdGVkOyBhbnl0aGluZyBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LlRvdGFsID09IDAgfHwgdC5Ub3RhbCA+IHUuVG90YWw6CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LkV4cGlyZXNBdCA9PSAwOgoJCS8vIHUgbmV2ZXIgZXhwaXJlZDsgYW55IGV4cGlyeSBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LkV4cGlyZXNBdCA9PSAwIHx8IHQuRXhwaXJlc0F0ID4gdS5FeHBpcmVzQXQ6CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBBbGxvd2FuY2UgaXMgb25lIG93bmVyJ3MgZ3JhbnQgdG8gb25lIHNwZW5kZXIuIEl0IGlzIHJldHVybmVkIEJZIFZBTFVFOgovLyBob2xkZXJzIGNhbm5vdCByZWFjaCBpbnRvIGEgQm9vayB0aHJvdWdoIGl0Lgp0eXBlIEFsbG93YW5jZSBzdHJ1Y3QgewoJSUQgICAgICAgIHVpbnQ2NAoJT3duZXIgICAgIHN0cmluZwoJU3BlbmRlciAgIHN0cmluZwoJVGVybXMgICAgIFRlcm1zCglBbmNob3IgICAgaW50NjQgLy8gd2luZG93IG9yaWdpbjsgYWxzbyB0aGUgZWFybGllc3Qgc3BlbmRhYmxlIGluc3RhbnQKCUNyZWF0ZWRBdCBpbnQ2NAoKCVNwZW50VG90YWwgIGludDY0IC8vIG92ZXIgdGhlIGFsbG93YW5jZSdzIHdob2xlIGxpZmUKCVNwZW50V2luZG93IGludDY0IC8vIHdpdGhpbiBXaW5kb3dJbmRleAoJV2luZG93SW5kZXggaW50NjQKCgkvLyBQZW5kaW5nIHRlcm1zLCBhcHBsaWVkIGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeS4gTWVhbmluZ2Z1bCBvbmx5CgkvLyB3aGVuIEhhc1BlbmRpbmcgaXMgdHJ1ZS4KCVBlbmRpbmcgICAgVGVybXMKCUhhc1BlbmRpbmcgYm9vbAp9CgovLyBJc0V4cGlyZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbGxvd2FuY2UgaXMgcGFzdCBpdHMgZXhwaXJ5IGF0IG5vdy4gQW4KLy8gYWxsb3dhbmNlIHdpdGggbm8gZXhwaXJ5IGlzIG5ldmVyIGV4cGlyZWQuCi8vCi8vIEl0IHJlc29sdmVzIHRoZSBleHBpcnkgTElWRSwgdGhyb3VnaCBhdCgpLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgZGlmZmVyZW5jZQovLyBiZXR3ZWVuIHRoaXMgcGFja2FnZSBhbmQgdjEgLS0gc2VlICIjIFdoeSB2MiBleGlzdHMiIGluIHRoZSBwYWNrYWdlIGRvYy4KLy8gUmVhZGluZyBhLlRlcm1zLkV4cGlyZXNBdCBkaXJlY3RseSBhbnN3ZXJzIGZyb20gdGhlIGxhc3Qtd3JpdHRlbiByZWNvcmQsCi8vIGFuZCBhZnRlciBhIGJvdW5kYXJ5IHRoYXQgcmVjb3JkIGlzIHN0YWxlIGluIEJPVEggZGlyZWN0aW9ucy4KLy8KLy8gVGhlIG5vdyA8IEFuY2hvciBndWFyZCBpcyBub3QgYSBiZWhhdmlvdXIgY2hhbmdlIGFuZCBpcyBub3QgZGVjb3JhdGlvbi4gSXQKLy8gcHJlc2VydmVzIHdpbmRvd0luZGV4J3MgZG9jdW1lbnRlZCBwcmVjb25kaXRpb246IFJlbWFpbmluZywgU3BlbmQgYW5kIEFtZW5kCi8vIGVhY2ggcmVqZWN0IGEgcHJlLWFuY2hvciBub3cgYmVmb3JlIHJlYWNoaW5nIGhlcmUsIGJ1dCBSZWFwIGRvZXMgbm90LCBhbmQKLy8gSXNFeHBpcmVkIGlzIEVYUE9SVEVELCBzbyBhIGNvbnN1bWVyIG1heSBoYW5kIGl0IGFueSBub3cgYXQgYWxsLiBXaXRob3V0IHRoZQovLyBndWFyZCBzdWNoIGEgbm93IHdvdWxkIHJlYWNoIGEgbmVnYXRpdmUgbnVtZXJhdG9yIGluIHdpbmRvd0luZGV4LCB3aGVyZSBHbydzCi8vIHRydW5jYXRpb24tdG93YXJkLXplcm8gZm9sZHMgdHdvIHdpbmRvd3MgaW50byBvbmUuIGZhbHNlIGlzIGFsc28gd2hhdCB2MQovLyBhbnN3ZXJlZCBmb3IgZXZlcnkgdmFsaWQgYWxsb3dhbmNlIHRoZXJlLCBzbyBub3RoaW5nIG1vdmVzOiB2YWxpZCgpIHJlcXVpcmVzCi8vIEV4cGlyZXNBdCA+IEFuY2hvciwgaGVuY2Ugbm93IDwgQW5jaG9yIGltcGxpZXMgbm93IDwgRXhwaXJlc0F0LgpmdW5jIChhIEFsbG93YW5jZSkgSXNFeHBpcmVkKG5vdyBpbnQ2NCkgYm9vbCB7CglpZiBub3cgPCBhLkFuY2hvciB7CgkJcmV0dXJuIGZhbHNlCgl9Cgl0ZXJtcywgXywgXyA6PSBhLmF0KG5vdykKCXJldHVybiB0ZXJtcy5FeHBpcmVzQXQgIT0gMCAmJiBub3cgPj0gdGVybXMuRXhwaXJlc0F0Cn0KCi8vIHdpbmRvd0luZGV4IHJldHVybnMgdGhlIGFuY2hvcmVkIHdpbmRvdyBudW1iZXIgY29udGFpbmluZyBub3cuIEEgbGlmZXRpbWUKLy8gYWxsb3dhbmNlIChQZXJpb2RMZW5ndGggPT0gMCkgaXMgYWx3YXlzIGluIHdpbmRvdyAwLgovLwovLyBub3cgPCBBbmNob3IgY2Fubm90IHJlYWNoIGhlcmUuIFJlbWFpbmluZywgU3BlbmQgYW5kIEFtZW5kIGVhY2ggcmVqZWN0IGl0Ci8vIGZpcnN0IChFcnJOb3RTdGFydGVkLCBvciAwKSwgYW5kIElzRXhwaXJlZCAtLSB3aGljaCBSZWFwIHJlYWNoZXMgd2l0aCBubwovLyBhbmNob3IgY2hlY2sgb2YgaXRzIG93biAtLSBjYXJyaWVzIGl0cyBvd24gbm93IDwgQW5jaG9yIGd1YXJkIGZvciBleGFjdGx5Ci8vIHRoaXMgcmVhc29uLiBUaGF0IGtlZXBzIHRoaXMgZGl2aXNpb24gYXdheSBmcm9tIG5lZ2F0aXZlIG51bWVyYXRvcnMsIHdoZXJlCi8vIEdvJ3MgdHJ1bmNhdGlvbi10b3dhcmQtemVybyB3b3VsZCBmb2xkIHR3byB3aW5kb3dzIGludG8gb25lLgpmdW5jIChhIEFsbG93YW5jZSkgd2luZG93SW5kZXgobm93IGludDY0KSBpbnQ2NCB7CglpZiBhLlRlcm1zLlBlcmlvZExlbmd0aCA9PSAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIChub3cgLSBhLkFuY2hvcikgLyBhLlRlcm1zLlBlcmlvZExlbmd0aAp9CgovLyBuZXh0Qm91bmRhcnkgcmV0dXJucyB0aGUgaW5zdGFudCB3aW5kb3cgaWR4KzEgYmVnaW5zLCBhbmQgd2hldGhlciB0aGF0Ci8vIGluc3RhbnQgaXMgcmVhY2hhYmxlIGF0IGFsbC4KLy8KLy8gVW5yZWFjaGFibGUgaGFzIHRocmVlIGNhdXNlcyBhbmQgdGhleSBjb2xsYXBzZSB0byB0aGUgc2FtZSBhbnN3ZXIsIHdoaWNoIGlzCi8vIHdoeSB0aGlzIHJldHVybnMgYSBib29sIHJhdGhlciB0aGFuIGFuIGVycm9yOiBhIGxpZmV0aW1lIGFsbG93YW5jZSBoYXMgbm8KLy8gYm91bmRhcnkgYnkgY29uc3RydWN0aW9uLCBhbmQgYW4gYXJpdGhtZXRpY2FsbHkgdW5yZXByZXNlbnRhYmxlIGJvdW5kYXJ5Ci8vIChQZXJpb2RMZW5ndGggc28gbGFyZ2UsIG9yIHRoZSBjbG9jayBzbyBmYXIgYWxvbmcsIHRoYXQgQW5jaG9yICsgc3RlcHMgKgovLyBQZXJpb2RMZW5ndGggb3ZlcmZsb3dzIGludDY0KSBpcyBvbmUgbm8gY2xvY2sgd2lsbCBldmVyIHJlYWNoLiBDb21wdXRpbmcgaXQKLy8gdW5ndWFyZGVkIHdvdWxkIHdyYXAgdG8gYSBzbWFsbCBudW1iZXIgYW5kIHJlcG9ydCBhIGJvdW5kYXJ5IGluIHRoZSBQQVNULAovLyB3aGljaCBpcyB0aGUgZGFuZ2Vyb3VzIGRpcmVjdGlvbjogQW1lbmQgd291bGQgcXVldWUgYSBsb29zZW5pbmcgYXMgdGhvdWdoCi8vIGl0IHdlcmUgYWJvdXQgdG8gdGFrZSBlZmZlY3QuCmZ1bmMgKGEgQWxsb3dhbmNlKSBuZXh0Qm91bmRhcnkoaWR4IGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXBsIDo9IGEuVGVybXMuUGVyaW9kTGVuZ3RoCglpZiBwbCA9PSAwIHx8IGlkeCA8IDAgfHwgaWR4ID09IG1heEludDY0IHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXN0ZXBzIDo9IGlkeCArIDEKCWlmIHN0ZXBzID4gbWF4SW50NjQvcGwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJb2ZmIDo9IHN0ZXBzICogcGwKCWlmIG9mZiA+IG1heEludDY0LWEuQW5jaG9yIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhLkFuY2hvciArIG9mZiwgdHJ1ZQp9CgovLyBhdCBjb21wdXRlcyB0aGUgYWxsb3dhbmNlJ3MgZWZmZWN0aXZlIHN0YXRlIGF0IG5vdyBXSVRIT1VUIG11dGF0aW5nIGl0OgovLyB0aGUgdGVybXMgaW4gZm9yY2UsIHRoZSB3aW5kb3cgaXQgZmFsbHMgaW4sIGFuZCBob3cgbXVjaCBoYXMgYmVlbiBzcGVudAovLyB3aXRoaW4gdGhhdCB3aW5kb3cuCi8vCi8vIFNwZW5kLCBSZW1haW5pbmcgYW5kIElzRXhwaXJlZCBBTEwgZ28gdGhyb3VnaCB0aGlzIG9uZSBmdW5jdGlvbi4gVGhhdCBpcwovLyBkZWxpYmVyYXRlIC0tIGEgcmVhZCB0aGF0IGFuc3dlcmVkICJob3cgbXVjaCBpcyBsZWZ0IiBvciAiaXMgdGhpcyBzdGlsbAovLyBhbGl2ZSIgd2l0aCBpdHMgb3duIGNvcHkgb2YgdGhlIHJvbGxvdmVyIGFuZCBhbWVuZG1lbnQgbG9naWMgd291bGQgYmUgYQovLyBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJ1bGUsIGZyZWUgdG8gZGlzYWdyZWUgd2l0aCB0aGUgb25lIHRoYXQKLy8gZW5mb3JjZXMgaXQsIGFuZCB0aGUgZGlzYWdyZWVtZW50IHdvdWxkIHN1cmZhY2UgYXMgYW4gYWxsb3dhbmNlIHRoYXQKLy8gcmVwb3J0cyBtb3JlIHRoYW4gaXQgaG9ub3JzIChvciBob25vcnMgbW9yZSB0aGFuIGl0IHJlcG9ydHMpLgovLwovLyBJc0V4cGlyZWQgd2FzIHRoYXQgc2Vjb25kIGltcGxlbWVudGF0aW9uIGluIHYxLCBhbmQgaXQgaXMgdGhlIHJlYXNvbiB0aGlzCi8vIHBhY2thZ2UgaGFzIGEgdjIuIFRoZSByb3V0aW5nIGlzIHRoZSBpbnZhcmlhbnQ6IGFueXRoaW5nIHRoYXQgYXNrcyBhIGxpdmUKLy8gcXVlc3Rpb24gYWJvdXQgYW4gYWxsb3dhbmNlIGFza3MgaXQgSEVSRS4gQSBmdXR1cmUgZmllbGQgd2l0aCBhCi8vIHplcm8tbWVhbnMtdW5saW1pdGVkIHJlYWRpbmcgZ2V0cyB0aGUgc2FtZSB0cmVhdG1lbnQgb3IgaW5oZXJpdHMgdGhlIHNhbWUKLy8gYnVnLgpmdW5jIChhIEFsbG93YW5jZSkgYXQobm93IGludDY0KSAoVGVybXMsIGludDY0LCBpbnQ2NCkgewoJaWR4IDo9IGEud2luZG93SW5kZXgobm93KQoJaWYgaWR4ID09IGEuV2luZG93SW5kZXggewoJCXJldHVybiBhLlRlcm1zLCBpZHgsIGEuU3BlbnRXaW5kb3cKCX0KCS8vIFRoZSB3aW5kb3cgaGFzIHJvbGxlZC4gQSBwZW5kaW5nIGFtZW5kbWVudCB0YWtlcyBlZmZlY3QgZXhhY3RseSBoZXJlLAoJLy8gYW5kIHRoZSBpbi13aW5kb3cgc3BlbmQgcmVzZXRzIC0tIGl0IGRvZXMgbm90IGNhcnJ5LgoJdGVybXMgOj0gYS5UZXJtcwoJaWYgYS5IYXNQZW5kaW5nIHsKCQl0ZXJtcyA9IGEuUGVuZGluZwoJfQoJcmV0dXJuIHRlcm1zLCBpZHgsIDAKfQoKLy8gUmVtYWluaW5nIHJlcG9ydHMgaG93IG11Y2ggdGhlIHNwZW5kZXIgbWF5IGRyYXcgcmlnaHQgbm93OiB0aGUgbGVzc2VyIG9mCi8vIHdoYXQgdGhlIGN1cnJlbnQgd2luZG93IGxlYXZlcyBhbmQgd2hhdCB0aGUgbGlmZXRpbWUgY2FwIGxlYXZlcy4gSXQgaXMgMAovLyBmb3IgYW4gYWxsb3dhbmNlIHRoYXQgaXMgZXhwaXJlZCwgbm90IHlldCBzdGFydGVkLCBvciBmdWxseSBkcmF3bi4KLy8KLy8gSXQgaXMgYSBwcm9qZWN0aW9uLCBub3QgYSByZXNlcnZhdGlvbi4gTm90aGluZyBpcyBoZWxkLCBhbmQgdGhlIGZpZ3VyZSBjYW4KLy8gY2hhbmdlIGluIHRoZSBzYW1lIGJsb2NrIGlmIHNvbWVvbmUgZWxzZSdzIGNhbGwgYWR2YW5jZXMgdGhlIGNsb2NrIHBhc3QgYQovLyBib3VuZGFyeS4KZnVuYyAoYSBBbGxvd2FuY2UpIFJlbWFpbmluZyhub3cgaW50NjQpIGludDY0IHsKCWlmIG5vdyA8IGEuQW5jaG9yIHx8IGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiAwCgl9Cgl0ZXJtcywgXywgc3BlbnRXaW5kb3cgOj0gYS5hdChub3cpCglsZWZ0IDo9IHRlcm1zLlBlclBlcmlvZCAtIHNwZW50V2luZG93CglpZiBsZWZ0IDwgMCB7CgkJLy8gUmVhY2hhYmxlOiBhIHRpZ2h0ZW5pbmcgYW1lbmRtZW50IGNhbiBkcm9wIFBlclBlcmlvZCBiZWxvdyB3aGF0CgkJLy8gdGhlIHdpbmRvdyBhbHJlYWR5IHNwZW50LiBUaGUgYWxsb3dhbmNlIGlzIGRyYXduLCBub3QgbmVnYXRpdmUuCgkJbGVmdCA9IDAKCX0KCWlmIHRlcm1zLlRvdGFsICE9IDAgewoJCWxpZmVMZWZ0IDo9IHRlcm1zLlRvdGFsIC0gYS5TcGVudFRvdGFsCgkJaWYgbGlmZUxlZnQgPCAwIHsKCQkJbGlmZUxlZnQgPSAwCgkJfQoJCWlmIGxpZmVMZWZ0IDwgbGVmdCB7CgkJCWxlZnQgPSBsaWZlTGVmdAoJCX0KCX0KCXJldHVybiBsZWZ0Cn0KCi8vIEJvb2sgaG9sZHMgdGhlIGxpdmUgYWxsb3dhbmNlcyBvZiBvbmUgY29uc3VtaW5nIHJlYWxtLiBUaGUgemVybyB2YWx1ZSBpcwovLyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcuCnR5cGUgQm9vayBzdHJ1Y3QgewoJbWF4TGl2ZSBpbnQKCW5leHRJRCAgdWludDY0ICAgIC8vIG5ldmVyIGRlY3JlYXNlczsgSURzIGFyZSBuZXZlciByZXVzZWQKCWxpdmUgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiBBbGxvd2FuY2UKfQoKLy8gTmV3IHJldHVybnMgYW4gZW1wdHkgQm9vay4gbWF4TGl2ZSBjYXBzIHNpbXVsdGFuZW91c2x5IGxpdmUgYWxsb3dhbmNlcwovLyBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4TGl2ZUxpbWl0XS4KZnVuYyBOZXcobWF4TGl2ZSBpbnQpICgqQm9vaywgZXJyb3IpIHsKCWlmIG1heExpdmUgPCAxIHx8IG1heExpdmUgPiBNYXhMaXZlTGltaXQgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRDb25maWcKCX0KCXJldHVybiAmQm9va3ttYXhMaXZlOiBtYXhMaXZlLCBuZXh0SUQ6IDEsIGxpdmU6IGF2bC5OZXdUcmVlKCl9LCBuaWwKfQoKLy8gTXVzdE5ldyBpcyBOZXcgYnV0IHBhbmljcyBvbiBlcnJvci4KZnVuYyBNdXN0TmV3KG1heExpdmUgaW50KSAqQm9vayB7CgliLCBlcnIgOj0gTmV3KG1heExpdmUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYgp9CgovLyBNYXhMaXZlIHJldHVybnMgdGhlIEJvb2sncyBjYXAgb24gc2ltdWx0YW5lb3VzbHkgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBNYXhMaXZlKCkgaW50IHsgcmV0dXJuIGIubWF4TGl2ZSB9CgovLyBDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBDb3VudCgpIGludCB7IHJldHVybiBiLmxpdmUuU2l6ZSgpIH0KCi8vIGtleSBwYWRzIGFuIGlkIHRvIGEgZml4ZWQgd2lkdGggc28gYXZsJ3MgbGV4aWNhbCBvcmRlciBtYXRjaGVzIG51bWVyaWMKLy8gb3JkZXIuIDIwIGRpZ2l0cyBjb3ZlcnMgdGhlIHdob2xlIHVpbnQ2NCByYW5nZS4KZnVuYyBrZXkoaWQgdWludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDIwIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKZnVuYyBjaGVja0tleXMob3duZXIsIHNwZW5kZXIgc3RyaW5nKSBlcnJvciB7CglpZiBvd25lciA9PSAiIiB7CgkJcmV0dXJuIEVyckVtcHR5T3duZXIKCX0KCWlmIHNwZW5kZXIgPT0gIiIgewoJCXJldHVybiBFcnJFbXB0eVNwZW5kZXIKCX0KCWlmIGxlbihvd25lcikgPiBNYXhLZXlMZW4gfHwgbGVuKHNwZW5kZXIpID4gTWF4S2V5TGVuIHsKCQlyZXR1cm4gRXJyS2V5VG9vTG9uZwoJfQoJcmV0dXJuIG5pbAp9CgovLyBPcGVuIHJlY29yZHMgYSBuZXcgYWxsb3dhbmNlIGFuZCByZXR1cm5zIGl0cyBpZC4gbm93IGJlY29tZXMgdGhlIHdpbmRvdwovLyBhbmNob3IgYW5kIHRoZSBlYXJsaWVzdCBpbnN0YW50IHRoZSBzcGVuZGVyIG1heSBkcmF3LgovLwovLyBBbiBvd25lciBtYXkgb3BlbiBzZXZlcmFsIGFsbG93YW5jZXMgZm9yIHRoZSBzYW1lIHNwZW5kZXI7IHRoZXkgYXJlCi8vIGluZGVwZW5kZW50LCBhbmQgdGhlIGlkcyBhcmUgd2hhdCB0ZWxsIHRoZW0gYXBhcnQuIHNwZW5kYm9vayBkb2VzIG5vdAovLyBtZXJnZSBvciBkZWR1cGxpY2F0ZSB0aGVtLCBiZWNhdXNlICJvbmUgYWxsb3dhbmNlIHBlciBwYWlyIiBpcyBhIHBvbGljeQovLyBzb21lIGNvbnN1bWluZyByZWFsbXMgd2FudCBhbmQgb3RoZXJzIGRvIG5vdCwgYW5kIGEgcHJpbWl0aXZlIHRoYXQKLy8gZGVjaWRlZCBpdCBoZXJlIGNvdWxkIG5vdCBiZSB0YWxrZWQgb3V0IG9mIGl0LgpmdW5jIChiICpCb29rKSBPcGVuKG93bmVyLCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCB0ZXJtcyBUZXJtcykgKHVpbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBjaGVja0tleXMob3duZXIsIHNwZW5kZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglpZiBub3cgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZE5vdwoJfQoJaWYgIXRlcm1zLnZhbGlkKG5vdykgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIGIubGl2ZS5TaXplKCkgPj0gYi5tYXhMaXZlIHsKCQlyZXR1cm4gMCwgRXJyQm9va0Z1bGwKCX0KCWlmIGIubmV4dElEID09IDAgewoJCXJldHVybiAwLCBFcnJJREV4aGF1c3RlZAoJfQoJaWQgOj0gYi5uZXh0SUQKCWIubmV4dElEKysKCWIubGl2ZS5TZXQoa2V5KGlkKSwgQWxsb3dhbmNlewoJCUlEOiAgICAgICAgaWQsCgkJT3duZXI6ICAgICBvd25lciwKCQlTcGVuZGVyOiAgIHNwZW5kZXIsCgkJVGVybXM6ICAgICB0ZXJtcywKCQlBbmNob3I6ICAgIG5vdywKCQlDcmVhdGVkQXQ6IG5vdywKCX0pCglyZXR1cm4gaWQsIG5pbAp9CgovLyBnZXQgZmV0Y2hlcyBhIGxpdmUgYWxsb3dhbmNlIGJ5IGlkLgovLwovLyBhdmwncyBHZXQgcmV0dXJucyBhIGJhcmUgYGFueWAgd2l0aCBubyBmb3VuZCBmbGFnLCBzbyBhYnNlbmNlIGlzIGEgbmlsCi8vIHZhbHVlLiBUaGF0IGlzIHNvdW5kIGhlcmUgb25seSBiZWNhdXNlIG5vdGhpbmcgbmlsIGlzIGV2ZXIgc3RvcmVkOiBTZXQgaXMKLy8gY2FsbGVkIGluIGV4YWN0bHkgdGhyZWUgcGxhY2VzIGFuZCBhbGwgdGhyZWUgcGFzcyBhbiBBbGxvd2FuY2UgdmFsdWUuCmZ1bmMgKGIgKkJvb2spIGdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGJvb2wpIHsKCXYgOj0gYi5saXZlLkdldChrZXkoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBBbGxvd2FuY2V7fSwgZmFsc2UKCX0KCWEsIG9rIDo9IHYuKEFsbG93YW5jZSkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBmYWxzZQoJfQoJcmV0dXJuIGEsIHRydWUKfQoKLy8gR2V0IHJldHVybnMgYSBjb3B5IG9mIGEgbGl2ZSBhbGxvd2FuY2UuCmZ1bmMgKGIgKkJvb2spIEdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGVycm9yKSB7CglhLCBvayA6PSBiLmdldChpZCkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBFcnJOb3RGb3VuZAoJfQoJcmV0dXJuIGEsIG5pbAp9CgovLyBSZW1haW5pbmcgcmVwb3J0cyB3aGF0IHRoZSBzcGVuZGVyIG9mIGlkIG1heSBkcmF3IGF0IG5vdywgb3IgMCBpZiB0aGVyZQovLyBpcyBubyBzdWNoIGxpdmUgYWxsb3dhbmNlLiBBIGNhbGxlciB0aGF0IG11c3QgZGlzdGluZ3Vpc2ggIm5vdGhpbmcgbGVmdCIKLy8gZnJvbSAibm8gc3VjaCBhbGxvd2FuY2UiIHNob3VsZCB1c2UgR2V0LgpmdW5jIChiICpCb29rKSBSZW1haW5pbmcoaWQgdWludDY0LCBub3cgaW50NjQpIGludDY0IHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGEuUmVtYWluaW5nKG5vdykKfQoKLy8gU3BlbmQgY29uc3VtZXMgYW1vdW50IGZyb20gYWxsb3dhbmNlIGlkIG9uIGJlaGFsZiBvZiBzcGVuZGVyIGFuZCByZXR1cm5zCi8vIG5pbCBpZiBldmVyeSBib3VuZCBwZXJtaXRzIGl0LiBUaGUgY2FsbGVyIHRoZW4gcGVyZm9ybXMgaXRzIG93biBlZmZlY3QuCi8vCi8vIE9uIGFueSBlcnJvciBOT1RISU5HIGlzIGNvbnN1bWVkLiBUaGUgd3JpdGUgaGFwcGVucyBvbmNlLCBhZnRlciB0aGUgbGFzdAovLyBjaGVjaywgc28gYSByZWZ1c2VkIFNwZW5kIGxlYXZlcyB0aGUgYm9vayBleGFjdGx5IGFzIGl0IHdhcy4KZnVuYyAoYiAqQm9vaykgU3BlbmQoaWQgdWludDY0LCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBFcnJJbnZhbGlkTm93Cgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIEVyckludmFsaWRBbW91bnQKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuU3BlbmRlciAhPSBzcGVuZGVyIHsKCQlyZXR1cm4gRXJyTm90U3BlbmRlcgoJfQoJaWYgbm93IDwgYS5BbmNob3IgewoJCXJldHVybiBFcnJOb3RTdGFydGVkCgl9CglpZiBhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyRXhwaXJlZAoJfQoKCXRlcm1zLCBpZHgsIHNwZW50V2luZG93IDo9IGEuYXQobm93KQoKCS8vIFdpbmRvdyBjYXAuIENoZWNrZWQgYXMgYSBzdWJ0cmFjdGlvbiBzbyB0aGUgc3VtIGNhbm5vdCBvdmVyZmxvdzoKCS8vIHNwZW50V2luZG93IGFuZCBQZXJQZXJpb2QgYXJlIGJvdGggPj0gMCBhbmQgUGVyUGVyaW9kID4gMC4KCWlmIGFtb3VudCA+IHRlcm1zLlBlclBlcmlvZC1zcGVudFdpbmRvdyB7CgkJcmV0dXJuIEVyclBlcmlvZEV4Y2VlZGVkCgl9CgkvLyBMaWZldGltZSBjYXAuCglpZiB0ZXJtcy5Ub3RhbCAhPSAwICYmIGFtb3VudCA+IHRlcm1zLlRvdGFsLWEuU3BlbnRUb3RhbCB7CgkJcmV0dXJuIEVyclRvdGFsRXhjZWVkZWQKCX0KCS8vIFNwZW50VG90YWwgaXMgdW5ib3VuZGVkIHdoZW4gVG90YWwgPT0gMCwgc28gaXQgaXMgdGhlIG9uZQoJLy8gYWNjdW11bGF0aW9uIHRoYXQgY2FuIGdlbnVpbmVseSByZWFjaCB0aGUgaW50NjQgY2VpbGluZy4KCWlmIGEuU3BlbnRUb3RhbCA+IG1heEludDY0LWFtb3VudCB7CgkJcmV0dXJuIEVyck92ZXJmbG93Cgl9CgoJYS5UZXJtcyA9IHRlcm1zCglpZiBpZHggIT0gYS5XaW5kb3dJbmRleCB7CgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9Cgl9CglhLldpbmRvd0luZGV4ID0gaWR4CglhLlNwZW50V2luZG93ID0gc3BlbnRXaW5kb3cgKyBhbW91bnQKCWEuU3BlbnRUb3RhbCArPSBhbW91bnQKCWIubGl2ZS5TZXQoa2V5KGlkKSwgYSkKCXJldHVybiBuaWwKfQoKLy8gUmV2b2tlIHJlbW92ZXMgYW4gYWxsb3dhbmNlLiBPbmx5IGl0cyBvd25lciBtYXkgcmV2b2tlLCBhbmQgaXQgdGFrZXMKLy8gZWZmZWN0IGltbWVkaWF0ZWx5IC0tIHRoZXJlIGlzIG5vIHdpbmRvdyB0byB3YWl0IGZvciwgYmVjYXVzZSByZXZvY2F0aW9uCi8vIGlzIHRoZSBvd25lcidzIHJlbWVkeSBhbmQgYSBkZWxheWVkIHJlbWVkeSBpcyBub3Qgb25lLgovLwovLyBUaGUgaWQgaXMgbm90IHJldXNlZCwgc28gYSByZXZva2VkIGFsbG93YW5jZSBjYW5ub3QgYmUgcmVzdXJyZWN0ZWQ6IGEKLy8gbGF0ZXIgU3BlbmQgb24gaXQgcmV0dXJucyBFcnJOb3RGb3VuZCBmb3JldmVyLgpmdW5jIChiICpCb29rKSBSZXZva2UoaWQgdWludDY0LCBvd25lciBzdHJpbmcpIGVycm9yIHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBFcnJOb3RPd25lcgoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBBbWVuZCBjaGFuZ2VzIGFuIGFsbG93YW5jZSdzIHRlcm1zLiBPbmx5IGl0cyBvd25lciBtYXkgYW1lbmQuCi8vCi8vIFBlcmlvZExlbmd0aCBpcyBpbW11dGFibGUgYW5kIG11c3QgYmUgcGFzc2VkIHVuY2hhbmdlZC4gVGVybXMgdGhhdCBhcmUKLy8gd2Vha2x5IHRpZ2h0ZXIgaW4gZXZlcnkgZGltZW5zaW9uIGFwcGx5IGltbWVkaWF0ZWx5OyBhbnl0aGluZyBsb29zZXIKLy8gYmVjb21lcyBwZW5kaW5nIGFuZCB0YWtlcyBlZmZlY3QgYXQgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5LiBBIGxpZmV0aW1lCi8vIGFsbG93YW5jZSBoYXMgbm8gbmV4dCBib3VuZGFyeSwgc28gYSBsb29zZW5pbmcgYW1lbmRtZW50IG9uIG9uZSBpcwovLyByZWZ1c2VkIHdpdGggRXJyTm9Cb3VuZGFyeS4KLy8KLy8gVGhlIHJldHVybmVkIGJvb2wgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbWVuZG1lbnQgYXBwbGllZCBpbW1lZGlhdGVseQovLyAodHJ1ZSkgb3Igd2FzIHF1ZXVlZCAoZmFsc2UpLiBBIGNhbGxlciB0aGF0IGlnbm9yZXMgaXQgY2Fubm90IHRlbGwKLy8gd2hldGhlciB0aGUgbmV3IGNlaWxpbmcgaXMgaW4gZm9yY2UsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHRoaW5nIHdvcnRoCi8vIGtub3dpbmcuCmZ1bmMgKGIgKkJvb2spIEFtZW5kKGlkIHVpbnQ2NCwgb3duZXIgc3RyaW5nLCBub3cgaW50NjQsIHRlcm1zIFRlcm1zKSAoYm9vbCwgZXJyb3IpIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBmYWxzZSwgRXJySW52YWxpZE5vdwoJfQoJYSwgb2sgOj0gYi5nZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBmYWxzZSwgRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBmYWxzZSwgRXJyTm90T3duZXIKCX0KCWlmIG5vdyA8IGEuQW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vdFN0YXJ0ZWQKCX0KCWlmIGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiBmYWxzZSwgRXJyRXhwaXJlZAoJfQoJLy8gVmFsaWRhdGVkIGFnYWluc3QgdGhlIEFOQ0hPUiByYXRoZXIgdGhhbiBub3csIHdoaWNoIGlzIHRoZSBMT09TRVIgb2YKCS8vIHRoZSB0d28gYW5kIGlzIGRlbGliZXJhdGUuIHZhbGlkKCkgb25seSBuZWVkcyBFeHBpcmVzQXQgdG8gYmUgYWZ0ZXIgdGhlCgkvLyB3aW5kb3cgb3JpZ2luOyBhbiBvd25lciBuYW1pbmcgYW4gZXhwaXJ5IGJldHdlZW4gdGhlIGFuY2hvciBhbmQgbm93IGlzCgkvLyB0aWdodGVuaW5nIHRoZSBhbGxvd2FuY2UgdW50aWwgaXQgaXMgZGVhZCwgd2hpY2ggaXMgdGhlaXIgcHJlcm9nYXRpdmUuCgkvLyBSZXZva2UgaXMgdGhlIGNsZWFuZXIgd2F5IHRvIHNheSB0aGF0LCBhbmQgUmVhcCB0aGVuIHJlY2xhaW1zIHRoZSBzbG90LgoJaWYgIXRlcm1zLnZhbGlkKGEuQW5jaG9yKSB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIHRlcm1zLlBlcmlvZExlbmd0aCAhPSBhLlRlcm1zLlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCgkvLyBSb2xsIHRoZSB3aW5kb3cgZmlyc3QgaWYgdGhlIGNsb2NrIGhhcyBtb3ZlZCBwYXN0IGEgYm91bmRhcnksIHNvIGFuCgkvLyBhbWVuZG1lbnQgbWFkZSBhZnRlciBhIHF1aWV0IHN0cmV0Y2ggaXMganVkZ2VkIGFnYWluc3QgdGhlIHRlcm1zCgkvLyBhY3R1YWxseSBpbiBmb3JjZSByYXRoZXIgdGhhbiB0aGUgb25lcyBhIHN0YWxlIHJlY29yZCBzdGlsbCBob2xkcy4KCWN1ciwgaWR4LCBzcGVudFdpbmRvdyA6PSBhLmF0KG5vdykKCWlmIGlkeCAhPSBhLldpbmRvd0luZGV4IHsKCQlhLlRlcm1zID0gY3VyCgkJYS5XaW5kb3dJbmRleCA9IGlkeAoJCWEuU3BlbnRXaW5kb3cgPSBzcGVudFdpbmRvdwoJCWEuSGFzUGVuZGluZyA9IGZhbHNlCgkJYS5QZW5kaW5nID0gVGVybXN7fQoJfQoKCWlmIHRlcm1zLnRpZ2h0ZXJPckVxdWFsVG8oYS5UZXJtcykgewoJCWEuVGVybXMgPSB0ZXJtcwoJCS8vIEEgdGlnaHRlbmluZyBzdXBlcnNlZGVzIGEgcXVldWVkIGxvb3NlbmluZy4gTGVhdmluZyBpdCBxdWV1ZWQKCQkvLyB3b3VsZCBtZWFuIHRoZSBvd25lcidzIHRpZ2h0ZW5pbmcgc2lsZW50bHkgZXhwaXJlcyBhdCB0aGUgbmV4dAoJCS8vIGJvdW5kYXJ5IGFuZCB0aGUgbG9vc2VyIHRlcm1zIHRoZXkganVzdCByZXBsYWNlZCBjb21lIGJhY2suCgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9CgkJYi5saXZlLlNldChrZXkoaWQpLCBhKQoJCXJldHVybiB0cnVlLCBuaWwKCX0KCgkvLyBBIGxvb3NlbmluZyBpcyBvbmx5IHF1ZXVlYWJsZSBpZiB0aGUgYm91bmRhcnkgaXQgd2FpdHMgZm9yIHdpbGwgYXJyaXZlCgkvLyB3aGlsZSB0aGUgYWxsb3dhbmNlIGlzIHN0aWxsIGFsaXZlLiBRdWV1ZWluZyBvbmUgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZAoJLy8gd291bGQgcmVwb3J0ICJhY2NlcHRlZCwgcGVuZGluZyIgZm9yIHRlcm1zIHRoYXQgbmV2ZXIgdGFrZSBlZmZlY3QgLS0KCS8vIHRoZSBvd25lcidzIGFtZW5kbWVudCBzaWxlbnRseSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUKCS8vIHRoaXMgcGFja2FnZSBpcyBsZWFzdCBhYmxlIHRvIGV4cGxhaW4gYWZ0ZXIgdGhlIGZhY3QuCgkvLwoJLy8gVHdvIHdheXMgaXQgaXMgdW5yZWFjaGFibGUuIFRoZSBhbGxvd2FuY2UgaGFzIG5vIGJvdW5kYXJ5IGF0IGFsbAoJLy8gKFBlcmlvZExlbmd0aCA9PSAwLCBvciBhbiB1bnJlcHJlc2VudGFibGUgb25lKSwgb3IgdGhlIGN1cnJlbnQgdGVybXMKCS8vIGV4cGlyZSBhdCBvciBiZWZvcmUgdGhlIG5leHQgYm91bmRhcnkuIFRoZSBzZWNvbmQgaXMgcmVhY2hhYmxlIGluCgkvLyBvcmRpbmFyeSB1c2U6IGEgdGlnaHRlbmluZyBvZiBFeHBpcmVzQXQgYXBwbGllcyBJTU1FRElBVEVMWSwgc28gYW4KCS8vIG93bmVyIGNhbiB0aWdodGVuIHRoZSBleHBpcnkgYmVsb3cgdGhlIG5leHQgYm91bmRhcnkgYW5kIHRoZW4gbG9vc2VuCgkvLyBQZXJQZXJpb2QsIGFuZCB3aXRob3V0IHRoaXMgY2hlY2sgdGhlIHNlY29uZCBjYWxsIHdvdWxkIGJlIGFjY2VwdGVkCgkvLyBhZ2FpbnN0IGEgd2luZG93IHRoYXQgbmV2ZXIgb3BlbnMuCgluYiwgb2sgOj0gYS5uZXh0Qm91bmRhcnkoYS5XaW5kb3dJbmRleCkKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlLCBFcnJOb0JvdW5kYXJ5Cgl9CglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5iID49IGEuVGVybXMuRXhwaXJlc0F0IHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vQm91bmRhcnkKCX0KCWEuUGVuZGluZyA9IHRlcm1zCglhLkhhc1BlbmRpbmcgPSB0cnVlCgliLmxpdmUuU2V0KGtleShpZCksIGEpCglyZXR1cm4gZmFsc2UsIG5pbAp9CgovLyBSZWFwIHJlbW92ZXMgYW4gYWxsb3dhbmNlIHRoYXQgaGFzIGV4cGlyZWQgYXQgbm93LCBhbmQgbWF5IGJlIGNhbGxlZCBieQovLyBhbnlvbmUuIEl0IHJldHVybnMgRXJyTm90Rm91bmQgZm9yIGFuIHVua25vd24gaWQgYW5kIEVyck5vdEV4cGlyZWQgZm9yIG9uZQovLyB0aGF0IGlzIHN0aWxsIGFsaXZlLgovLwovLyBQZXJtaXNzaW9ubGVzcyBvbiBwdXJwb3NlLCBhbmQgdGhlIHJlYXNvbmluZyBpcyB0aGUgd2hvbGUganVzdGlmaWNhdGlvbjoKLy8gYW4gZXhwaXJlZCBhbGxvd2FuY2UgY2FuIG5ldmVyIGF1dGhvcml6ZSBhbm90aGVyIGRyYXcsIHNvIHJlbW92aW5nIGl0IHRha2VzCi8vIG5vdGhpbmcgZnJvbSB0aGUgb3duZXIgYW5kIGdyYW50cyBub3RoaW5nIHRvIHRoZSBjYWxsZXIuIFdpdGhvdXQgaXQgYW4KLy8gZXhwaXJ5IGlzIGEgc2xvdyBsZWFrIGFnYWluc3QgbWF4TGl2ZSAtLSBTcGVuZCByZWZ1c2VzIHRoZSBkZWFkIGFsbG93YW5jZQovLyBmb3JldmVyIHdoaWxlIGl0IGhvbGRzIGEgc2xvdCwgc28gYSBCb29rIHNoYXJlZCBiZXR3ZWVuIG93bmVycyBjb3VsZCBmaWxsCi8vIHdpdGggY29ycHNlcyBhbmQgcmVmdXNlIG5ldyBPcGVucywgYW5kIHRoZSBvbmx5IHJlbWVkeSB3b3VsZCBiZSB0aGUgb3duZXIKLy8gb2YgZWFjaCBjb3Jwc2Ugbm90aWNpbmcgYW5kIGNhbGxpbmcgUmV2b2tlLgovLwovLyBUaGlzIHJlbGllcyBvbiBgbm93YCBleGFjdGx5IGFzIG11Y2ggYXMgU3BlbmQgZG9lcy4gQSByZWFsbSB0aGF0IGxldHMgYQovLyBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBhbHJlYWR5IGJyb2tlbiBjb25zdW1lciBjb250cmFjdCBpdGVtIDEsIGFuZCBzdWNoIGEKLy8gcmVhbG0gd291bGQgbGV0IGEgY2FsbGVyIHJlYXAgYSBMSVZFIGFsbG93YW5jZSBieSBuYW1pbmcgYSBmdXR1cmUgaW5zdGFudC4KZnVuYyAoYiAqQm9vaykgUmVhcChpZCB1aW50NjQsIG5vdyBpbnQ2NCkgZXJyb3IgewoJaWYgbm93IDwgMCB7CgkJcmV0dXJuIEVyckludmFsaWROb3cKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmICFhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyTm90RXhwaXJlZAoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBJdGVyYXRlIGNhbGxzIGZuIGZvciBldmVyeSBsaXZlIGFsbG93YW5jZSBpbiBpZCBvcmRlciwgc3RvcHBpbmcgZWFybHkgaWYKLy8gZm4gcmV0dXJucyB0cnVlLiBUaGUgYWxsb3dhbmNlIGlzIHBhc3NlZCBieSB2YWx1ZSwgc28gZm4gY2Fubm90IG11dGF0ZQovLyB0aGUgYm9vayB0aHJvdWdoIGl0LgpmdW5jIChiICpCb29rKSBJdGVyYXRlKGZuIGZ1bmMoQWxsb3dhbmNlKSBib29sKSB7CgliLmxpdmUuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlyZXR1cm4gZm4odi4oQWxsb3dhbmNlKSkKCX0pCn0KGonMBAoSc3BlbmRib29rX3Rlc3QuZ25vEvHLBHBhY2thZ2Ugc3BlbmRib29rCgppbXBvcnQgInRlc3RpbmciCgpjb25zdCAoCglhbGljZSA9ICJnMWFsaWNlIiAvLyBvd25lcgoJYm9iICAgPSAiZzFib2IiICAgLy8gc3BlbmRlcgoJY2Fyb2wgPSAiZzFjYXJvbCIgLy8gbmVpdGhlcgopCgovLyBkYXkgaXMgdGhlIGRlZmF1bHQgUGVyaW9kTGVuZ3RoOiBhIHJvdW5kIG51bWJlciBzbyB3aW5kb3cgYm91bmRhcmllcyBpbiB0aGUKLy8gdGVzdHMgYXJlIHJlYWRhYmxlIGFzIG11bHRpcGxlcyBvZiBpdCBmcm9tIHRoZSBhbmNob3IuCmNvbnN0IGRheSA9IGludDY0KDEwMCkKCi8vIG9wZW5EZWZhdWx0IG9wZW5zIG9uZSBhbGxvd2FuY2UgYW5jaG9yZWQgYXQgYGFuY2hvcmAgd2l0aCBhIHdpbmRvdyBjYXAgb2YKLy8gNTAgcGVyIGBkYXlgLCBubyBsaWZldGltZSBjYXAgYW5kIG5vIGV4cGlyeS4KZnVuYyBvcGVuRGVmYXVsdCh0ICp0ZXN0aW5nLlQsIGFuY2hvciBpbnQ2NCkgKCpCb29rLCB1aW50NjQpIHsKCXQuSGVscGVyKCkKCWIgOj0gTXVzdE5ldyg4KQoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgYW5jaG9yLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CglyZXR1cm4gYiwgaWQKfQoKLy8gbXVzdFNwZW5kIGZhaWxzIHRoZSB0ZXN0IGlmIGEgcGVybWl0dGVkIGRyYXcgaXMgcmVmdXNlZC4KZnVuYyBtdXN0U3BlbmQodCAqdGVzdGluZy5ULCBiICpCb29rLCBpZCB1aW50NjQsIG5vdywgYW1vdW50IGludDY0KSB7Cgl0LkhlbHBlcigpCglpZiBlcnIgOj0gYi5TcGVuZChpZCwgYm9iLCBub3csIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJTcGVuZCglZCwgbm93PSVkLCBhbXQ9JWQpOiAldiIsIGlkLCBub3csIGFtb3VudCwgZXJyKQoJfQp9CgovLyByZWZ1c2UgZmFpbHMgdGhlIHRlc3QgdW5sZXNzIHRoZSBkcmF3IGlzIHJlZnVzZWQgd2l0aCB3YW50LgpmdW5jIHJlZnVzZSh0ICp0ZXN0aW5nLlQsIGIgKkJvb2ssIGlkIHVpbnQ2NCwgbm93LCBhbW91bnQgaW50NjQsIHdhbnQgZXJyb3IpIHsKCXQuSGVscGVyKCkKCWlmIGVyciA6PSBiLlNwZW5kKGlkLCBib2IsIG5vdywgYW1vdW50KTsgZXJyICE9IHdhbnQgewoJCXQuRmF0YWxmKCJTcGVuZCglZCwgbm93PSVkLCBhbXQ9JWQpOiBnb3QgJXYsIHdhbnQgJXYiLAoJCQlpZCwgbm93LCBhbW91bnQsIGVyciwgd2FudCkKCX0KfQoKLy8gLS0tIGNvbnN0cnVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdE5ld1JlamVjdHNCYWRDb25maWcodCAqdGVzdGluZy5UKSB7Cglmb3IgXywgbWF4TGl2ZSA6PSByYW5nZSBbXWludHswLCAtMSwgTWF4TGl2ZUxpbWl0ICsgMX0gewoJCWlmIF8sIGVyciA6PSBOZXcobWF4TGl2ZSk7IGVyciAhPSBFcnJJbnZhbGlkQ29uZmlnIHsKCQkJdC5FcnJvcmYoIk5ldyglZCk6IGdvdCAldiwgd2FudCBFcnJJbnZhbGlkQ29uZmlnIiwgbWF4TGl2ZSwgZXJyKQoJCX0KCX0KfQoKZnVuYyBUZXN0TmV3QWNjZXB0c1RoZUJvdW5kYXJpZXModCAqdGVzdGluZy5UKSB7Cglmb3IgXywgbWF4TGl2ZSA6PSByYW5nZSBbXWludHsxLCBNYXhMaXZlTGltaXR9IHsKCQliLCBlcnIgOj0gTmV3KG1heExpdmUpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXQuRmF0YWxmKCJOZXcoJWQpOiAldiIsIG1heExpdmUsIGVycikKCQl9CgkJaWYgYi5NYXhMaXZlKCkgIT0gbWF4TGl2ZSB7CgkJCXQuRXJyb3JmKCJNYXhMaXZlOiBnb3QgJWQsIHdhbnQgJWQiLCBiLk1heExpdmUoKSwgbWF4TGl2ZSkKCQl9CgkJaWYgYi5Db3VudCgpICE9IDAgewoJCQl0LkVycm9yZigiZnJlc2ggQ291bnQ6IGdvdCAlZCwgd2FudCAwIiwgYi5Db3VudCgpKQoJCX0KCX0KfQoKZnVuYyBUZXN0TXVzdE5ld1Bhbmljc09uQmFkQ29uZmlnKHQgKnRlc3RpbmcuVCkgewoJZGVmZXIgZnVuYygpIHsKCQlpZiByZWNvdmVyKCkgPT0gbmlsIHsKCQkJdC5FcnJvcigiTXVzdE5ldygwKSBkaWQgbm90IHBhbmljIikKCQl9Cgl9KCkKCU11c3ROZXcoMCkKfQoKLy8gLS0tIE9wZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdE9wZW5SZWplY3RzQmFkS2V5cyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJbG9uZyA6PSAiIgoJZm9yIGkgOj0gMDsgaSA8PSBNYXhLZXlMZW47IGkrKyB7CgkJbG9uZyArPSAieCIKCX0KCW9rIDo9IFRlcm1ze1BlclBlcmlvZDogMTAsIFBlcmlvZExlbmd0aDogZGF5fQoKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lICAgICAgICAgICAgc3RyaW5nCgkJb3duZXIsIHNwZW5kZXIgIHN0cmluZwoJCXdhbnQgICAgICAgICAgICBlcnJvcgoJfXsKCQl7ImVtcHR5IG93bmVyIiwgIiIsIGJvYiwgRXJyRW1wdHlPd25lcn0sCgkJeyJlbXB0eSBzcGVuZGVyIiwgYWxpY2UsICIiLCBFcnJFbXB0eVNwZW5kZXJ9LAoJCXsib3duZXIgdG9vIGxvbmciLCBsb25nLCBib2IsIEVycktleVRvb0xvbmd9LAoJCXsic3BlbmRlciB0b28gbG9uZyIsIGFsaWNlLCBsb25nLCBFcnJLZXlUb29Mb25nfSwKCX0KCWZvciBfLCBjIDo9IHJhbmdlIGNhc2VzIHsKCQlpZiBfLCBlcnIgOj0gYi5PcGVuKGMub3duZXIsIGMuc3BlbmRlciwgMCwgb2spOyBlcnIgIT0gYy53YW50IHsKCQkJdC5FcnJvcmYoIiVzOiBnb3QgJXYsIHdhbnQgJXYiLCBjLm5hbWUsIGVyciwgYy53YW50KQoJCX0KCX0KCS8vIFRoZSBib3VuZGFyeSBpdHNlbGYgaXMgYWxsb3dlZDogTWF4S2V5TGVuIGNoYXJhY3RlcnMgZXhhY3RseS4KCWV4YWN0IDo9IGxvbmdbOk1heEtleUxlbl0KCWlmIF8sIGVyciA6PSBiLk9wZW4oZXhhY3QsIGV4YWN0LCAwLCBvayk7IGVyciAhPSBuaWwgewoJCXQuRXJyb3JmKCJrZXkgb2YgZXhhY3RseSBNYXhLZXlMZW46ICV2IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RPcGVuUmVqZWN0c05lZ2F0aXZlTm93KHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDQpCglfLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBib2IsIC0xLCBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0pCglpZiBlcnIgIT0gRXJySW52YWxpZE5vdyB7CgkJdC5FcnJvcmYoImdvdCAldiwgd2FudCBFcnJJbnZhbGlkTm93IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RPcGVuUmVqZWN0c0ludmFsaWRUZXJtcyh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgIHN0cmluZwoJCXRlcm1zIFRlcm1zCgl9ewoJCXsiemVybyBQZXJQZXJpb2QiLCBUZXJtc3tQZXJQZXJpb2Q6IDAsIFBlcmlvZExlbmd0aDogZGF5fX0sCgkJeyJuZWdhdGl2ZSBQZXJQZXJpb2QiLCBUZXJtc3tQZXJQZXJpb2Q6IC0xLCBQZXJpb2RMZW5ndGg6IGRheX19LAoJCXsibmVnYXRpdmUgUGVyaW9kTGVuZ3RoIiwgVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiAtMX19LAoJCXsibmVnYXRpdmUgVG90YWwiLCBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IC0xfX0sCgkJeyJuZWdhdGl2ZSBFeHBpcmVzQXQiLCBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAtMX19LAoJCS8vIEFuIGV4cGlyeSBhdCBvciBiZWZvcmUgdGhlIGFuY2hvciBjYW4gbmV2ZXIgYXV0aG9yaXplIGFueXRoaW5nLgoJCXsiZXhwaXJ5IGF0IGFuY2hvciIsIFRlcm1ze1BlclBlcmlvZDogMTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDEwMDB9fSwKCQl7ImV4cGlyeSBiZWZvcmUgYW5jaG9yIiwgVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogOTk5fX0sCgl9Cglmb3IgXywgYyA6PSByYW5nZSBjYXNlcyB7CgkJaWYgXywgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAxMDAwLCBjLnRlcm1zKTsgZXJyICE9IEVyckludmFsaWRUZXJtcyB7CgkJCXQuRXJyb3JmKCIlczogZ290ICV2LCB3YW50IEVyckludmFsaWRUZXJtcyIsIGMubmFtZSwgZXJyKQoJCX0KCX0KCS8vIE9uZSBwYXN0IHRoZSBhbmNob3IgaXMgdGhlIGZpcnN0IGFjY2VwdGFibGUgZXhwaXJ5LgoJb2sgOj0gVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMTAwMX0KCWlmIF8sIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMTAwMCwgb2spOyBlcnIgIT0gbmlsIHsKCQl0LkVycm9yZigiZXhwaXJ5IG9uZSBwYXN0IHRoZSBhbmNob3I6ICV2IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RPcGVuQWNjZXB0c1RvdGFsQmVsb3dQZXJQZXJpb2QodCAqdGVzdGluZy5UKSB7CgkvLyBOb3QgYSBjb250cmFkaWN0aW9uOiBpdCBpcyBhIG5hcnJvd2VyIGxpZmV0aW1lIGNhcCwgYW5kIFNwZW5kIGlzIHdoYXQKCS8vIGVuZm9yY2VzIHRoZSBuYXJyb3dlciBvZiB0aGUgdHdvLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDEwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgMCk7IGdvdCAhPSAxMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZzogZ290ICVkLCB3YW50IDEwICh0aGUgbGlmZXRpbWUgY2FwKSIsIGdvdCkKCX0KCXJlZnVzZSh0LCBiLCBpZCwgMCwgMTEsIEVyclRvdGFsRXhjZWVkZWQpCgltdXN0U3BlbmQodCwgYiwgaWQsIDAsIDEwKQp9CgpmdW5jIFRlc3RPcGVuRW5mb3JjZXNNYXhMaXZlKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDIpCgl0ZXJtcyA6PSBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0KCWlkMSwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCB0ZXJtcykKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJmaXJzdCBPcGVuOiAldiIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgdGVybXMpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigic2Vjb25kIE9wZW46ICV2IiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCB0ZXJtcyk7IGVyciAhPSBFcnJCb29rRnVsbCB7CgkJdC5GYXRhbGYoInRoaXJkIE9wZW46IGdvdCAldiwgd2FudCBFcnJCb29rRnVsbCIsIGVycikKCX0KCS8vIFJldm9raW5nIGZyZWVzIGEgc2xvdDsgdGhlIG5ldyBpZCBpcyBOT1QgdGhlIHJldm9rZWQgb25lLgoJaWYgZXJyIDo9IGIuUmV2b2tlKGlkMSwgYWxpY2UpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmV2b2tlOiAldiIsIGVycikKCX0KCWlkMywgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCB0ZXJtcykKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuIGFmdGVyIFJldm9rZTogJXYiLCBlcnIpCgl9CglpZiBpZDMgPT0gaWQxIHsKCQl0LkVycm9yZigiaWQgJWQgd2FzIHJldXNlZCBhZnRlciByZXZvY2F0aW9uIiwgaWQzKQoJfQp9CgpmdW5jIFRlc3RBRnJlZWRTbG90RG9lc05vdE92ZXJ3cml0ZUFMaXZlU2libGluZyh0ICp0ZXN0aW5nLlQpIHsKCS8vIEFsbG9jYXRpbmcgdGhlIG5leHQgaWQgZnJvbSB0aGUgTElWRSBDT1VOVCByYXRoZXIgdGhhbiBhIG1vbm90b25pYwoJLy8gY291bnRlciBsb29rcyByaWdodCB1bnRpbCBhIHJldm9jYXRpb24gaW4gdGhlIG1pZGRsZTogdGhlIGNvdW50IGZhbGxzCgkvLyBiYWNrIG9udG8gYW4gaWQgdGhhdCBpcyBzdGlsbCBpbiB1c2UsIGFuZCB0aGUgbmV4dCBPcGVuIHNpbGVudGx5CgkvLyByZXBsYWNlcyB0aGF0IGFsbG93YW5jZSBpbnN0ZWFkIG9mIGFkZGluZyBvbmUuIENvdW50IGlzIHdoYXQgc2hvd3MgaXQsCgkvLyB3aGljaCBpcyB3aHkgdGhpcyBhc3NlcnRzIHRoZSBwb3B1bGF0aW9uIGFuZCBub3QganVzdCB0aGUgaWRzLgoJYiA6PSBNdXN0TmV3KDMpCgl0ZXJtcyA6PSBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0KCWlkMSwgXyA6PSBiLk9wZW4oYWxpY2UsICJzMSIsIDAsIHRlcm1zKQoJaWQyLCBfIDo9IGIuT3BlbihhbGljZSwgInMyIiwgMCwgdGVybXMpCglpZDMsIF8gOj0gYi5PcGVuKGFsaWNlLCAiczMiLCAwLCB0ZXJtcykKCWlmIGVyciA6PSBiLlJldm9rZShpZDIsIGFsaWNlKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlJldm9rZTogJXYiLCBlcnIpCgl9CglpZDQsIGVyciA6PSBiLk9wZW4oYWxpY2UsICJzNCIsIDAsIHRlcm1zKQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIk9wZW4gaW50byB0aGUgZnJlZWQgc2xvdDogJXYiLCBlcnIpCgl9CglpZiBiLkNvdW50KCkgIT0gMyB7CgkJdC5FcnJvcmYoIkNvdW50OiBnb3QgJWQsIHdhbnQgMyAtLSBhbiBPcGVuIHJlcGxhY2VkIGEgbGl2ZSBhbGxvd2FuY2UiLAoJCQliLkNvdW50KCkpCgl9Cglmb3IgXywgYyA6PSByYW5nZSBbXXN0cnVjdCB7CgkJaWQgICAgICB1aW50NjQKCQlzcGVuZGVyIHN0cmluZwoJfXt7aWQxLCAiczEifSwge2lkMywgInMzIn0sIHtpZDQsICJzNCJ9fSB7CgkJYSwgZXJyIDo9IGIuR2V0KGMuaWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXQuRXJyb3JmKCJHZXQoJWQpOiAldiIsIGMuaWQsIGVycikKCQkJY29udGludWUKCQl9CgkJaWYgYS5TcGVuZGVyICE9IGMuc3BlbmRlciB7CgkJCXQuRXJyb3JmKCJpZCAlZDogc3BlbmRlciAlcSwgd2FudCAlcSIsIGMuaWQsIGEuU3BlbmRlciwgYy5zcGVuZGVyKQoJCX0KCX0KCWlmIF8sIGVyciA6PSBiLkdldChpZDIpOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRXJyb3JmKCJ0aGUgcmV2b2tlZCBpZCBjYW1lIGJhY2s6ICV2IiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RPcGVuQWxsb2NhdGVzRGlzdGluY3RJRHNGb3JUaGVTYW1lUGFpcih0ICp0ZXN0aW5nLlQpIHsKCS8vIFR3byBhbGxvd2FuY2VzIGZvciBvbmUgKG93bmVyLCBzcGVuZGVyKSBwYWlyIGFyZSBpbmRlcGVuZGVudCwgYW5kIHRoZQoJLy8gaWQgaXMgd2hhdCB0ZWxscyB0aGVtIGFwYXJ0LiBEcmF3aW5nIG9uZSBkb3duIG11c3Qgbm90IHRvdWNoIHRoZSBvdGhlci4KCWIgOj0gTXVzdE5ldyg0KQoJdGVybXMgOj0gVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXl9CglpZDEsIF8gOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsIHRlcm1zKQoJaWQyLCBfIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCB0ZXJtcykKCWlmIGlkMSA9PSBpZDIgewoJCXQuRmF0YWxmKCJkdXBsaWNhdGUgaWQgJWQiLCBpZDEpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQxLCAwLCA1MCkKCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZDEsIDApOyBnb3QgIT0gMCB7CgkJdC5FcnJvcmYoImRyYXduIGFsbG93YW5jZTogZ290ICVkLCB3YW50IDAiLCBnb3QpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQyLCAwKTsgZ290ICE9IDUwIHsKCQl0LkVycm9yZigic2libGluZyBhbGxvd2FuY2U6IGdvdCAlZCwgd2FudCA1MCIsIGdvdCkKCX0KfQoKLy8gLS0tIEdldCAvIFJlbWFpbmluZyBsb29rdXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0R2V0VW5rbm93bklEKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDQpCglpZiBfLCBlcnIgOj0gYi5HZXQoOTkpOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRXJyb3JmKCJHZXQ6IGdvdCAldiwgd2FudCBFcnJOb3RGb3VuZCIsIGVycikKCX0KCS8vIFJlbWFpbmluZyBjYW5ub3QgZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyBhbmQgZG9jdW1lbnRzIHRoYXQgaXQKCS8vIGFuc3dlcnMgMCBmb3IgYm90aDsgdGhpcyBwaW5zIHRoZSBkb2N1bWVudGVkIGJlaGF2aW9yLgoJaWYgZ290IDo9IGIuUmVtYWluaW5nKDk5LCAwKTsgZ290ICE9IDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgb2YgdW5rbm93biBpZDogZ290ICVkLCB3YW50IDAiLCBnb3QpCgl9Cn0KCmZ1bmMgVGVzdEdldFJldHVybnNBQ29weSh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglhLCBlcnIgOj0gYi5HZXQoaWQpCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiR2V0OiAldiIsIGVycikKCX0KCWEuVGVybXMuUGVyUGVyaW9kID0gMSA8PCA0MAoJYS5TcGVudFdpbmRvdyA9IC01MDAKCWFnYWluLCBfIDo9IGIuR2V0KGlkKQoJaWYgYWdhaW4uVGVybXMuUGVyUGVyaW9kICE9IDUwIHx8IGFnYWluLlNwZW50V2luZG93ICE9IDAgewoJCXQuRXJyb3JmKCJtdXRhdGluZyB0aGUgcmV0dXJuZWQgdmFsdWUgcmVhY2hlZCB0aGUgYm9vazogJSt2IiwgYWdhaW4pCgl9Cn0KCi8vIC0tLSBTcGVuZDogdGhlIHBlci13aW5kb3cgY2FwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdFNwZW5kV2l0aGluV2luZG93Q2FwKHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMTAwMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAwMCwgMjApCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDEwMDApOyBnb3QgIT0gMzAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmc6IGdvdCAlZCwgd2FudCAzMCIsIGdvdCkKCX0KCW11c3RTcGVuZCh0LCBiLCBpZCwgMTA1MCwgMzApCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDEwNTApOyBnb3QgIT0gMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyBhZnRlciBmdWxsIGRyYXc6IGdvdCAlZCwgd2FudCAwIiwgZ290KQoJfQoJcmVmdXNlKHQsIGIsIGlkLCAxMDUwLCAxLCBFcnJQZXJpb2RFeGNlZWRlZCkKfQoKZnVuYyBUZXN0U3BlbmRSZWplY3RzQmFkQXJndW1lbnRzKHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMTAwMCkKCXJlZnVzZSh0LCBiLCBpZCwgMTAwMCwgMCwgRXJySW52YWxpZEFtb3VudCkKCXJlZnVzZSh0LCBiLCBpZCwgMTAwMCwgLTUsIEVyckludmFsaWRBbW91bnQpCglyZWZ1c2UodCwgYiwgaWQsIC0xLCAxMCwgRXJySW52YWxpZE5vdykKCWlmIGVyciA6PSBiLlNwZW5kKDk5LCBib2IsIDEwMDAsIDEwKTsgZXJyICE9IEVyck5vdEZvdW5kIHsKCQl0LkVycm9yZigidW5rbm93biBpZDogZ290ICV2LCB3YW50IEVyck5vdEZvdW5kIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RTcGVuZFJlamVjdHNUaGVXcm9uZ1NwZW5kZXIodCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAxMDAwKQoJLy8gTm90IHRoZSBvd25lcidzIGVpdGhlcjogb3duaW5nIGFuIGFsbG93YW5jZSBkb2VzIG5vdCBtZWFuIGRyYXdpbmcgaXQuCglmb3IgXywgd2hvIDo9IHJhbmdlIFtdc3RyaW5ne2Nhcm9sLCBhbGljZSwgIiJ9IHsKCQlpZiBlcnIgOj0gYi5TcGVuZChpZCwgd2hvLCAxMDAwLCAxMCk7IGVyciAhPSBFcnJOb3RTcGVuZGVyIHsKCQkJdC5FcnJvcmYoIlNwZW5kIGFzICVxOiBnb3QgJXYsIHdhbnQgRXJyTm90U3BlbmRlciIsIHdobywgZXJyKQoJCX0KCX0KfQoKZnVuYyBUZXN0U3BlbmRCZWZvcmVUaGVBbmNob3IodCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAxMDAwKQoJcmVmdXNlKHQsIGIsIGlkLCA5OTksIDEwLCBFcnJOb3RTdGFydGVkKQoJLy8gVGhlIGFuY2hvciBpbnN0YW50IGl0c2VsZiBpcyBzcGVuZGFibGUuCgltdXN0U3BlbmQodCwgYiwgaWQsIDEwMDAsIDEwKQp9CgpmdW5jIFRlc3RSZW1haW5pbmdCZWZvcmVUaGVBbmNob3JJc1plcm8odCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAxMDAwKQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCA5OTkpOyBnb3QgIT0gMCB7CgkJdC5FcnJvcmYoImdvdCAlZCwgd2FudCAwIiwgZ290KQoJfQp9CgpmdW5jIFRlc3RBUmVmdXNlZFNwZW5kQ29uc3VtZXNOb3RoaW5nKHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMTAwMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAwMCwgNDApCgliZWZvcmUsIF8gOj0gYi5HZXQoaWQpCgoJLy8gRXZlcnkgcmVmdXNhbCBwYXRoLCBpbiBvbmUgYm9vaywgZWFjaCBhc3NlcnRlZCB0byBsZWF2ZSBubyB0cmFjZS4KCXJlZnVzZSh0LCBiLCBpZCwgMTAwMCwgMTEsIEVyclBlcmlvZEV4Y2VlZGVkKQoJcmVmdXNlKHQsIGIsIGlkLCAxMDAwLCAwLCBFcnJJbnZhbGlkQW1vdW50KQoJcmVmdXNlKHQsIGIsIGlkLCAtMSwgNSwgRXJySW52YWxpZE5vdykKCWlmIGVyciA6PSBiLlNwZW5kKGlkLCBjYXJvbCwgMTAwMCwgNSk7IGVyciAhPSBFcnJOb3RTcGVuZGVyIHsKCQl0LkZhdGFsZigid3Jvbmcgc3BlbmRlcjogJXYiLCBlcnIpCgl9CglyZWZ1c2UodCwgYiwgaWQsIDk5OSwgNSwgRXJyTm90U3RhcnRlZCkKCglhZnRlciwgXyA6PSBiLkdldChpZCkKCWlmIGFmdGVyICE9IGJlZm9yZSB7CgkJdC5FcnJvcmYoImEgcmVmdXNlZCBTcGVuZCBtdXRhdGVkIHRoZSBhbGxvd2FuY2U6XG4gYmVmb3JlICUrdlxuIGFmdGVyICAlK3YiLAoJCQliZWZvcmUsIGFmdGVyKQoJfQp9CgovLyAtLS0gU3BlbmQ6IGFuY2hvcmVkIHdpbmRvd3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RXaW5kb3dzQXJlQW5jaG9yZWROb3RTbGlkaW5nKHQgKnRlc3RpbmcuVCkgewoJLy8gQW5jaG9yIDEwMDAsIHBlcmlvZCAxMDAsIHNvIGJvdW5kYXJpZXMgYXJlIDExMDAsIDEyMDAsIC4uLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMTAwMCkKCgkvLyBEcmF3IHRoZSB3aG9sZSBjYXAgYXQgdGhlIHZlcnkgZW5kIG9mIHdpbmRvdyAwLgoJbXVzdFNwZW5kKHQsIGIsIGlkLCAxMDk5LCA1MCkKCXJlZnVzZSh0LCBiLCBpZCwgMTA5OSwgMSwgRXJyUGVyaW9kRXhjZWVkZWQpCgoJLy8gT25lIGluc3RhbnQgbGF0ZXIgaXMgd2luZG93IDEsIGFuZCB0aGUgY2FwIGlzIHdob2xlIGFnYWluLiBVbmRlciBhCgkvLyBTTElESU5HIHRyYWlsaW5nIHdpbmRvdyB0aGlzIGRyYXcgd291bGQgaGF2ZSB0byB3YWl0IHVudGlsIDExOTkuCgltdXN0U3BlbmQodCwgYiwgaWQsIDExMDAsIDUwKQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCAxMTAwKTsgZ290ICE9IDAgewoJCXQuRXJyb3JmKCJ3aW5kb3cgMSBhZnRlciBhIGZ1bGwgZHJhdzogZ290ICVkLCB3YW50IDAiLCBnb3QpCgl9CgoJLy8gVGhlIGJvdW5kYXJ5IGlzIGEgcHJvcGVydHkgb2YgdGhlIGFuY2hvciwgbm90IG9mIHdoZW4gYW55b25lIGNhbGxlZDoKCS8vIHdpbmRvdyAxIGVuZHMgYXQgMTIwMCBubyBtYXR0ZXIgdGhhdCB0aGUgZmlyc3QgZHJhdyBpbiBpdCB3YXMgYXQgMTEwMC4KCXJlZnVzZSh0LCBiLCBpZCwgMTE5OSwgMSwgRXJyUGVyaW9kRXhjZWVkZWQpCgltdXN0U3BlbmQodCwgYiwgaWQsIDEyMDAsIDUwKQp9CgpmdW5jIFRlc3RXaW5kb3dSZWZpbGxJc0FSZXNldE5vdEFDYXJyeSh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCgkvLyBTcGVuZCBub3RoaW5nIGluIHdpbmRvd3MgMCBhbmQgMSwgdGhlbiBldmVyeXRoaW5nIGF2YWlsYWJsZSBpbiAyLgoJbXVzdFNwZW5kKHQsIGIsIGlkLCAyMDAsIDUwKQoJLy8gSWYgdW51c2VkIGFsbG93YW5jZSBjYXJyaWVkLCAxNTAgd291bGQgaGF2ZSBiZWVuIGF2YWlsYWJsZSBhbmQgNTAgbW9yZQoJLy8gd291bGQgc3RpbGwgYmUgbGVmdC4gVGhlIGNhcCBib3VuZHMgd29yc3QtY2FzZSBsb3NzIFBFUiB3aW5kb3csIHdoaWNoIGEKCS8vIGNhcnJ5IHdvdWxkIHVuYm91bmQuCglyZWZ1c2UodCwgYiwgaWQsIDIwMCwgMSwgRXJyUGVyaW9kRXhjZWVkZWQpCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDIwMCk7IGdvdCAhPSAwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgMCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0V2luZG93SW5kZXhTa2lwc0FoZWFkQ29ycmVjdGx5KHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMTAwMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAwMCwgNTApCgkvLyBKdW1wIG1hbnkgd2luZG93cyBpbiBvbmUgc3RlcDsgdGhlIGluZGV4IG11c3QgbGFuZCBvbiB0aGUgcmVhbCBvbmUsIG5vdAoJLy8gbWVyZWx5IGluY3JlbWVudC4KCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAwMCszNypkYXkrMSwgNTApCglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5XaW5kb3dJbmRleCAhPSAzNyB7CgkJdC5FcnJvcmYoIldpbmRvd0luZGV4OiBnb3QgJWQsIHdhbnQgMzciLCBhLldpbmRvd0luZGV4KQoJfQp9CgpmdW5jIFRlc3RMaWZldGltZUFsbG93YW5jZU5ldmVyUm9sbHModCAqdGVzdGluZy5UKSB7CgliIDo9IE11c3ROZXcoNCkKCS8vIFBlcmlvZExlbmd0aCAwID09IG9uZSB3aW5kb3cgdGhhdCBuZXZlciByb2xscy4KCWlkLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogMH0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQsIDAsIDUwKQoJZm9yIF8sIG5vdyA6PSByYW5nZSBbXWludDY0ezEsIDEwMCwgMSA8PCA0MCwgbWF4SW50NjR9IHsKCQlpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIG5vdyk7IGdvdCAhPSAwIHsKCQkJdC5FcnJvcmYoIlJlbWFpbmluZyBhdCAlZDogZ290ICVkLCB3YW50IDAgKG5ldmVyIHJlZmlsbHMpIiwgbm93LCBnb3QpCgkJfQoJCXJlZnVzZSh0LCBiLCBpZCwgbm93LCAxLCBFcnJQZXJpb2RFeGNlZWRlZCkKCX0KfQoKLy8gLS0tIFNwZW5kOiB0aGUgbGlmZXRpbWUgY2FwIGFuZCBleHBpcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0VG90YWxDYXBTdXJ2aXZlc1dpbmRvd1JvbGxvdmVyKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDQpCglpZCwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDYwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCW11c3RTcGVuZCh0LCBiLCBpZCwgMCwgNTApCgkvLyBXaW5kb3cgMSByZWZpbGxzIHRoZSBwZXItd2luZG93IGNhcCwgYnV0IHRoZSBsaWZldGltZSBjYXAgZG9lcyBub3QKCS8vIHJlZmlsbCAtLSBvbmx5IDEwIG9mIHRoZSA2MCBpcyBsZWZ0LgoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBkYXkpOyBnb3QgIT0gMTAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgaW4gd2luZG93IDE6IGdvdCAlZCwgd2FudCAxMCIsIGdvdCkKCX0KCXJlZnVzZSh0LCBiLCBpZCwgZGF5LCAxMSwgRXJyVG90YWxFeGNlZWRlZCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgZGF5LCAxMCkKCWZvciBfLCBub3cgOj0gcmFuZ2UgW11pbnQ2NHtkYXksIDIgKiBkYXksIDk5ICogZGF5fSB7CgkJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBub3cpOyBnb3QgIT0gMCB7CgkJCXQuRXJyb3JmKCJSZW1haW5pbmcgYXQgJWQ6IGdvdCAlZCwgd2FudCAwIChsaWZldGltZSBzcGVudCkiLCBub3csIGdvdCkKCQl9Cgl9Cn0KCmZ1bmMgVGVzdEV4cGlyeSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMjUwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCWEsIF8gOj0gYi5HZXQoaWQpCglpZiBhLklzRXhwaXJlZCgyNDkpIHsKCQl0LkVycm9yKCJleHBpcmVkIG9uZSBpbnN0YW50IGVhcmx5IikKCX0KCWlmICFhLklzRXhwaXJlZCgyNTApIHsKCQl0LkVycm9yKCJFeHBpcmVzQXQgaXMgZXhjbHVzaXZlOiAyNTAgbXVzdCBiZSBleHBpcmVkIikKCX0KCW11c3RTcGVuZCh0LCBiLCBpZCwgMjQ5LCAxMCkKCXJlZnVzZSh0LCBiLCBpZCwgMjUwLCAxLCBFcnJFeHBpcmVkKQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCAyNTApOyBnb3QgIT0gMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyB3aGVuIGV4cGlyZWQ6IGdvdCAlZCwgd2FudCAwIiwgZ290KQoJfQp9CgpmdW5jIFRlc3ROb0V4cGlyeU5ldmVyRXhwaXJlcyh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5Jc0V4cGlyZWQobWF4SW50NjQpIHsKCQl0LkVycm9yKCJhbiBhbGxvd2FuY2Ugd2l0aCBFeHBpcmVzQXQgMCByZXBvcnRlZCBleHBpcmVkIikKCX0KfQoKZnVuYyBUZXN0T3ZlcmZsb3dHdWFyZE9uVGhlTGlmZXRpbWVBY2N1bXVsYXRvcih0ICp0ZXN0aW5nLlQpIHsKCS8vIFdpdGggVG90YWwgPT0gMCAodW5saW1pdGVkKSBTcGVudFRvdGFsIGlzIHRoZSBvbmUgYWNjdW11bGF0aW9uIHRoYXQgY2FuCgkvLyBnZW51aW5lbHkgcmVhY2ggdGhlIGludDY0IGNlaWxpbmcsIHNvIGl0IGlzIHRoZSBvbmUgdGhhdCBuZWVkcyBhIGd1YXJkLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IG1heEludDY0LCBQZXJpb2RMZW5ndGg6IGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQsIDAsIG1heEludDY0LTUpCglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5TcGVudFRvdGFsICE9IG1heEludDY0LTUgewoJCXQuRmF0YWxmKCJTcGVudFRvdGFsOiBnb3QgJWQiLCBhLlNwZW50VG90YWwpCgl9CgkvLyBOZXh0IHdpbmRvdzogdGhlIHBlci13aW5kb3cgY2FwIHBlcm1pdHMgdGhpcyBkcmF3LCBhbmQgb25seSB0aGUKCS8vIG92ZXJmbG93IGd1YXJkIHN0YW5kcyBiZXR3ZWVuIGl0IGFuZCBhIHdyYXBwZWQgU3BlbnRUb3RhbC4KCXJlZnVzZSh0LCBiLCBpZCwgZGF5LCAxMCwgRXJyT3ZlcmZsb3cpCgltdXN0U3BlbmQodCwgYiwgaWQsIGRheSwgNSkKCWEsIF8gPSBiLkdldChpZCkKCWlmIGEuU3BlbnRUb3RhbCAhPSBtYXhJbnQ2NCB7CgkJdC5FcnJvcmYoIlNwZW50VG90YWwgYXQgdGhlIGNlaWxpbmc6IGdvdCAlZCwgd2FudCAlZCIsIGEuU3BlbnRUb3RhbCwgbWF4SW50NjQpCgl9CglyZWZ1c2UodCwgYiwgaWQsIDIqZGF5LCAxLCBFcnJPdmVyZmxvdykKfQoKLy8gLS0tIFJldm9rZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdFJldm9rZSh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglpZiBlcnIgOj0gYi5SZXZva2UoaWQsIGNhcm9sKTsgZXJyICE9IEVyck5vdE93bmVyIHsKCQl0LkVycm9yZigiUmV2b2tlIGFzIGEgc3RyYW5nZXI6IGdvdCAldiwgd2FudCBFcnJOb3RPd25lciIsIGVycikKCX0KCWlmIGVyciA6PSBiLlJldm9rZShpZCwgYm9iKTsgZXJyICE9IEVyck5vdE93bmVyIHsKCQl0LkVycm9yZigiUmV2b2tlIGFzIHRoZSBzcGVuZGVyOiBnb3QgJXYsIHdhbnQgRXJyTm90T3duZXIiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZXZva2UoOTksIGFsaWNlKTsgZXJyICE9IEVyck5vdEZvdW5kIHsKCQl0LkVycm9yZigiUmV2b2tlIHVua25vd246IGdvdCAldiwgd2FudCBFcnJOb3RGb3VuZCIsIGVycikKCX0KCWlmIGVyciA6PSBiLlJldm9rZShpZCwgYWxpY2UpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmV2b2tlOiAldiIsIGVycikKCX0KCWlmIGIuQ291bnQoKSAhPSAwIHsKCQl0LkVycm9yZigiQ291bnQgYWZ0ZXIgUmV2b2tlOiBnb3QgJWQsIHdhbnQgMCIsIGIuQ291bnQoKSkKCX0KCS8vIFJldm9jYXRpb24gaXMgaW1tZWRpYXRlIGFuZCBwZXJtYW5lbnQgLS0gdGhlIGlkIGlzIG5ldmVyIHJlc3VycmVjdGVkLgoJcmVmdXNlKHQsIGIsIGlkLCAwLCAxLCBFcnJOb3RGb3VuZCkKCWlmIGVyciA6PSBiLlJldm9rZShpZCwgYWxpY2UpOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRXJyb3JmKCJzZWNvbmQgUmV2b2tlOiBnb3QgJXYsIHdhbnQgRXJyTm90Rm91bmQiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdFJldm9rZUlzSW1tZWRpYXRlTm90RGVmZXJyZWRUb0FCb3VuZGFyeSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFJldm9jYXRpb24gaXMgdGhlIG93bmVyJ3MgcmVtZWR5LCBhbmQgYSByZW1lZHkgdGhhdCB3YWl0cyBmb3IgYSB3aW5kb3cKCS8vIGJvdW5kYXJ5IGlzIG5vdCBvbmUuCgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAwKQoJbXVzdFNwZW5kKHQsIGIsIGlkLCAwLCAxMCkKCWlmIGVyciA6PSBiLlJldm9rZShpZCwgYWxpY2UpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmV2b2tlOiAldiIsIGVycikKCX0KCXJlZnVzZSh0LCBiLCBpZCwgMCwgMSwgRXJyTm90Rm91bmQpCn0KCi8vIC0tLSBSZWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RSZWFwT25seVRha2VzRXhwaXJlZEFsbG93YW5jZXModCAqdGVzdGluZy5UKSB7CgliIDo9IE11c3ROZXcoNCkKCWlkLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDI1MH0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCAyNDkpOyBlcnIgIT0gRXJyTm90RXhwaXJlZCB7CgkJdC5FcnJvcmYoIlJlYXAgYSBsaXZlIGFsbG93YW5jZTogZ290ICV2LCB3YW50IEVyck5vdEV4cGlyZWQiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCAtMSk7IGVyciAhPSBFcnJJbnZhbGlkTm93IHsKCQl0LkVycm9yZigiUmVhcCB3aXRoIGEgbmVnYXRpdmUgY2xvY2s6IGdvdCAldiwgd2FudCBFcnJJbnZhbGlkTm93IiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuUmVhcCg5OSwgMjUwKTsgZXJyICE9IEVyck5vdEZvdW5kIHsKCQl0LkVycm9yZigiUmVhcCB1bmtub3duOiBnb3QgJXYsIHdhbnQgRXJyTm90Rm91bmQiLCBlcnIpCgl9CgkvLyBQZXJtaXNzaW9ubGVzczogY2Fyb2wgaXMgbmVpdGhlciBvd25lciBub3Igc3BlbmRlciBhbmQgdGhlcmUgaXMgbm8KCS8vIGNhbGxlciBhcmd1bWVudCBhdCBhbGwsIHdoaWNoIGlzIHRoZSBwb2ludC4KCWlmIGVyciA6PSBiLlJlYXAoaWQsIDI1MCk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJSZWFwIGFuIGV4cGlyZWQgYWxsb3dhbmNlOiAldiIsIGVycikKCX0KCWlmIGIuQ291bnQoKSAhPSAwIHsKCQl0LkVycm9yZigiQ291bnQgYWZ0ZXIgUmVhcDogZ290ICVkLCB3YW50IDAiLCBiLkNvdW50KCkpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCAyNTApOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRXJyb3JmKCJzZWNvbmQgUmVhcDogZ290ICV2LCB3YW50IEVyck5vdEZvdW5kIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RSZWFwTmV2ZXJUYWtlc0FuQWxsb3dhbmNlV2l0aE5vRXhwaXJ5KHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCWlmIGVyciA6PSBiLlJlYXAoaWQsIG1heEludDY0KTsgZXJyICE9IEVyck5vdEV4cGlyZWQgewoJCXQuRXJyb3JmKCJnb3QgJXYsIHdhbnQgRXJyTm90RXhwaXJlZCIsIGVycikKCX0KfQoKZnVuYyBUZXN0UmVhcFJlY2xhaW1zQVNsb3QodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgZGVmZWN0IFJlYXAgZXhpc3RzIGZvcjogd2l0aG91dCBpdCBhbiBleHBpcmVkIGFsbG93YW5jZSByZWZ1c2VzCgkvLyBldmVyeSBTcGVuZCBmb3JldmVyIHdoaWxlIHN0aWxsIGhvbGRpbmcgYSBzbG90IGFnYWluc3QgbWF4TGl2ZS4KCWIgOj0gTXVzdE5ldygxKQoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogNTB9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIk9wZW46ICV2IiwgZXJyKQoJfQoJbGl2ZSA6PSBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0KCWlmIF8sIGVyciA6PSBiLk9wZW4oYWxpY2UsIGNhcm9sLCA1MCwgbGl2ZSk7IGVyciAhPSBFcnJCb29rRnVsbCB7CgkJdC5GYXRhbGYoIk9wZW4gb3ZlciBhIGNvcnBzZTogZ290ICV2LCB3YW50IEVyckJvb2tGdWxsIiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuUmVhcChpZCwgNTApOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmVhcDogJXYiLCBlcnIpCgl9CglpZiBfLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBjYXJvbCwgNTAsIGxpdmUpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbiBhZnRlciBSZWFwOiAldiIsIGVycikKCX0KfQoKLy8gLS0tIEFtZW5kOiB0aWdodGVyIGFwcGxpZXMgaW1tZWRpYXRlbHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0QW1lbmRUaWdodGVyQXBwbGllc0ltbWVkaWF0ZWx5KHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAsIDIwKQoKCW5vdywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAxMCwgVGVybXN7UGVyUGVyaW9kOiAzMCwgUGVyaW9kTGVuZ3RoOiBkYXl9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmICFub3cgewoJCXQuRmF0YWwoImEgdGlnaHRlbmluZyB3YXMgcXVldWVkIGluc3RlYWQgb2YgYXBwbGllZCIpCgl9CgkvLyAzMCBjYXAsIDIwIGFscmVhZHkgc3BlbnQgaW4gdGhpcyB3aW5kb3cuCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDEwKTsgZ290ICE9IDEwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgMTAiLCBnb3QpCgl9CglyZWZ1c2UodCwgYiwgaWQsIDEwLCAxMSwgRXJyUGVyaW9kRXhjZWVkZWQpCgltdXN0U3BlbmQodCwgYiwgaWQsIDEwLCAxMCkKfQoKZnVuYyBUZXN0QW1lbmRUaWdodGVuaW5nQmVsb3dXaGF0SXNTcGVudENsYW1wc1RvWmVybyh0ICp0ZXN0aW5nLlQpIHsKCS8vIFJlYWNoYWJsZSwgYW5kIHRoZSBhbGxvd2FuY2UgbXVzdCByZWFkIGFzIGRyYXduIHJhdGhlciB0aGFuIG5lZ2F0aXZlLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMCwgNDApCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsIFRlcm1ze1BlclBlcmlvZDogMTAsIFBlcmlvZExlbmd0aDogZGF5fSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJBbWVuZDogJXYiLCBlcnIpCgl9CglpZiAhYXBwbGllZCB7CgkJdC5GYXRhbCgidGlnaHRlbmluZyB3YXMgcXVldWVkIikKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgMCk7IGdvdCAhPSAwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgMCIsIGdvdCkKCX0KCXJlZnVzZSh0LCBiLCBpZCwgMCwgMSwgRXJyUGVyaW9kRXhjZWVkZWQpCgkvLyBUaGUgbmV4dCB3aW5kb3cgcmVmaWxscyB0byB0aGUgTkVXLCB0aWdodGVyIGNhcC4KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgZGF5KTsgZ290ICE9IDEwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nIGluIHRoZSBuZXh0IHdpbmRvdzogZ290ICVkLCB3YW50IDEwIiwgZ290KQoJfQp9CgpmdW5jIFRlc3RBbWVuZEVxdWFsVGVybXNBcHBseUltbWVkaWF0ZWx5KHQgKnRlc3RpbmcuVCkgewoJLy8gIlRpZ2h0ZXIgT1IgRVFVQUwiOiByZS1zdGF0aW5nIHRoZSBzYW1lIHRlcm1zIGlzIG5vdCBhIGxvb3NlbmluZyBhbmQKCS8vIG11c3Qgbm90IGJlIGRlZmVycmVkLCBvciBhIG5vLW9wIGFtZW5kbWVudCB3b3VsZCBzaXQgcXVldWVkLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCWFwcGxpZWQsIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXl9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmICFhcHBsaWVkIHsKCQl0LkVycm9yKCJpZGVudGljYWwgdGVybXMgd2VyZSBxdWV1ZWQiKQoJfQp9CgovLyAtLS0gQW1lbmQ6IGxvb3NlciBpcyBkZWZlcnJlZCB0byB0aGUgbmV4dCBib3VuZGFyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RBbWVuZExvb3NlcklzUGVuZGluZ1VudGlsVGhlTmV4dEJvdW5kYXJ5KHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMCwgNTApCgoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwMCwgUGVyaW9kTGVuZ3RoOiBkYXl9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRmF0YWwoImEgbG9vc2VuaW5nIHRvb2sgZWZmZWN0IGluc2lkZSB0aGUgbGl2ZSB3aW5kb3ciKQoJfQoJLy8gVGhlIGxpdmUgd2luZG93IGlzIHVudG91Y2hlZDogdGhpcyBpcyB0aGUgZHJhaW4tdGhlbi1yYWlzZS10ZXJtcwoJLy8gYXR0YWNrLCBhbmQgdGhlIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIHJhaXNlIGNhbm5vdCByZWFjaCBiYWNrLgoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCAwKTsgZ290ICE9IDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgaW4gdGhlIGxpdmUgd2luZG93OiBnb3QgJWQsIHdhbnQgMCIsIGdvdCkKCX0KCXJlZnVzZSh0LCBiLCBpZCwgOTksIDEsIEVyclBlcmlvZEV4Y2VlZGVkKQoKCS8vIEF0IHRoZSBib3VuZGFyeSB0aGUgcGVuZGluZyB0ZXJtcyBhcmUgaW4gZm9yY2UuCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIGRheSk7IGdvdCAhPSA1MDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgYXQgdGhlIGJvdW5kYXJ5OiBnb3QgJWQsIHdhbnQgNTAwIiwgZ290KQoJfQoJbXVzdFNwZW5kKHQsIGIsIGlkLCBkYXksIDUwMCkKCgkvLyBBbmQgdGhleSBhcmUgbm93IHRoZSBhbGxvd2FuY2UncyByZWFsIHRlcm1zLCBub3QgYSBvbmUtd2luZG93IGdyYW50LgoJYSwgXyA6PSBiLkdldChpZCkKCWlmIGEuSGFzUGVuZGluZyB7CgkJdC5FcnJvcigidGhlIHBlbmRpbmcgYW1lbmRtZW50IHdhcyBub3QgY29uc3VtZWQiKQoJfQoJaWYgYS5UZXJtcy5QZXJQZXJpb2QgIT0gNTAwIHsKCQl0LkVycm9yZigiVGVybXMuUGVyUGVyaW9kOiBnb3QgJWQsIHdhbnQgNTAwIiwgYS5UZXJtcy5QZXJQZXJpb2QpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDIqZGF5KTsgZ290ICE9IDUwMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyB0d28gd2luZG93cyBvbjogZ290ICVkLCB3YW50IDUwMCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0UGVuZGluZ0FtZW5kbWVudEFwcGxpZXNUaHJvdWdoUmVtYWluaW5nV2l0aG91dEFTcGVuZCh0ICp0ZXN0aW5nLlQpIHsKCS8vIFJlbWFpbmluZyBhbmQgU3BlbmQgc2hhcmUgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZSByb2xsb3ZlciBydWxlLCBzbyBhCgkvLyByZWFkIG11c3Qgbm90IHJlcG9ydCB0aGUgb2xkIHRlcm1zIGp1c3QgYmVjYXVzZSBub2JvZHkgaGFzIHNwZW50IHlldC4KCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAwLCBQZXJpb2RMZW5ndGg6IGRheX0pOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQ6ICV2IiwgZXJyKQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBkYXkpOyBnb3QgIT0gNTAwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgNTAwIiwgZ290KQoJfQoJLy8gLi4uIGFuZCB3aGF0IHRoZSByZWFkIHByb21pc2VkIGlzIHdoYXQgdGhlIHdyaXRlIGhvbm9ycy4KCW11c3RTcGVuZCh0LCBiLCBpZCwgZGF5LCA1MDApCn0KCmZ1bmMgVGVzdEFUaWdodGVuaW5nU3VwZXJzZWRlc0FRdWV1ZWRMb29zZW5pbmcodCAqdGVzdGluZy5UKSB7CgkvLyBPdGhlcndpc2UgdGhlIG93bmVyJ3MgdGlnaHRlbmluZyBzaWxlbnRseSBleHBpcmVzIGF0IHRoZSBuZXh0IGJvdW5kYXJ5CgkvLyBhbmQgdGhlIGxvb3NlciB0ZXJtcyB0aGV5IGp1c3QgcmVwbGFjZWQgY29tZSBiYWNrLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogZGF5fSk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJsb29zZW5pbmcgQW1lbmQ6ICV2IiwgZXJyKQoJfQoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDIwLCBQZXJpb2RMZW5ndGg6IGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigidGlnaHRlbmluZyBBbWVuZDogJXYiLCBlcnIpCgl9CglpZiAhYXBwbGllZCB7CgkJdC5GYXRhbCgidGhlIHRpZ2h0ZW5pbmcgd2FzIHF1ZXVlZCIpCgl9CglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5IYXNQZW5kaW5nIHsKCQl0LkVycm9yKCJ0aGUgcXVldWVkIGxvb3NlbmluZyBzdXJ2aXZlZCB0aGUgdGlnaHRlbmluZyIpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDApOyBnb3QgIT0gMjAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgbm93OiBnb3QgJWQsIHdhbnQgMjAiLCBnb3QpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIGRheSk7IGdvdCAhPSAyMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyBhZnRlciB0aGUgYm91bmRhcnk6IGdvdCAlZCwgd2FudCAyMCIsIGdvdCkKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgOTkqZGF5KTsgZ290ICE9IDIwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nIG11Y2ggbGF0ZXI6IGdvdCAlZCwgd2FudCAyMCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0QVNlY29uZExvb3NlbmluZ1JlcGxhY2VzVGhlUXVldWVkT25lKHQgKnRlc3RpbmcuVCkgewoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogZGF5fSk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJmaXJzdDogJXYiLCBlcnIpCgl9CglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsIFRlcm1ze1BlclBlcmlvZDogMzAwLCBQZXJpb2RMZW5ndGg6IGRheX0pOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigic2Vjb25kOiAldiIsIGVycikKCX0KCS8vIDMwMCBpcyBsb29zZXIgdGhhbiB0aGUgbGl2ZSA1MCAoc28gc3RpbGwgcXVldWVkKSBidXQgdGlnaHRlciB0aGFuIHRoZQoJLy8gcXVldWVkIDUwMDogdGhlIG93bmVyJ3MgbGF0ZXN0IHdvcmQgd2lucy4KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgZGF5KTsgZ290ICE9IDMwMCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyBhdCB0aGUgYm91bmRhcnk6IGdvdCAlZCwgd2FudCAzMDAiLCBnb3QpCgl9Cn0KCmZ1bmMgVGVzdEFtZW5kQWZ0ZXJBUXVpZXRTdHJldGNoSnVkZ2VzQWdhaW5zdFRoZVRlcm1zSW5Gb3JjZSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSBjbG9jayBoYXMgbW92ZWQgc2V2ZXJhbCB3aW5kb3dzIHBhc3QgYSBwZW5kaW5nIGFtZW5kbWVudCB3aXRob3V0IGEKCS8vIFNwZW5kIHRvIHJvbGwgdGhlIHJlY29yZC4gQW1lbmQgbXVzdCByb2xsIGZpcnN0LCBvciBpdCB3b3VsZCBjb21wYXJlCgkvLyB0aGUgbmV3IHRlcm1zIGFnYWluc3Qgc3RhbGUgb25lcy4KCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAwLCBQZXJpb2RMZW5ndGg6IGRheX0pOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigibG9vc2VuaW5nOiAldiIsIGVycikKCX0KCS8vIFdpbmRvdyA1LiBUaGUgcGVuZGluZyA1MDAgaXMgaW4gZm9yY2UgaGVyZSwgc28gMjAwIGlzIGEgVElHSFRFTklORyBhbmQKCS8vIG11c3QgYXBwbHkgaW1tZWRpYXRlbHkuIEp1ZGdlZCBhZ2FpbnN0IHRoZSBzdGFsZSA1MCBpdCB3b3VsZCBsb29rIGxpa2UKCS8vIGEgbG9vc2VuaW5nIGFuZCBiZSBxdWV1ZWQgZm9yIGEgYm91bmRhcnkgdGhhdCBoYXMgYWxyZWFkeSBwYXNzZWQuCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDUqZGF5LCBUZXJtc3tQZXJQZXJpb2Q6IDIwMCwgUGVyaW9kTGVuZ3RoOiBkYXl9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmICFhcHBsaWVkIHsKCQl0LkZhdGFsKCJqdWRnZWQgYWdhaW5zdCBzdGFsZSB0ZXJtczogYSB0aWdodGVuaW5nIHdhcyBxdWV1ZWQiKQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCA1KmRheSk7IGdvdCAhPSAyMDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmc6IGdvdCAlZCwgd2FudCAyMDAiLCBnb3QpCgl9Cn0KCmZ1bmMgVGVzdFJvbGxpbmdUaHJvdWdoQW1lbmRSZXNldHNUaGVXaW5kb3dTcGVuZCh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCgltdXN0U3BlbmQodCwgYiwgaWQsIDAsIDUwKQoJLy8gQW1lbmQgaW4gd2luZG93IDMgd2l0aCBlcXVhbCB0ZXJtczsgdGhlIHJvbGwgaXQgcGVyZm9ybXMgbXVzdCByZXNldCB0aGUKCS8vIGluLXdpbmRvdyBzcGVuZCByYXRoZXIgdGhhbiBjYXJyeSB3aW5kb3cgMCdzIDUwIGZvcndhcmQuCglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDMqZGF5LCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheX0pOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQ6ICV2IiwgZXJyKQoJfQoJYSwgXyA6PSBiLkdldChpZCkKCWlmIGEuV2luZG93SW5kZXggIT0gMyB8fCBhLlNwZW50V2luZG93ICE9IDAgewoJCXQuRXJyb3JmKCJXaW5kb3dJbmRleD0lZCBTcGVudFdpbmRvdz0lZCwgd2FudCAzIGFuZCAwIiwgYS5XaW5kb3dJbmRleCwgYS5TcGVudFdpbmRvdykKCX0KCWlmIGEuU3BlbnRUb3RhbCAhPSA1MCB7CgkJdC5FcnJvcmYoIlNwZW50VG90YWw6IGdvdCAlZCwgd2FudCA1MCAobGlmZXRpbWUgZG9lcyBub3QgcmVzZXQpIiwgYS5TcGVudFRvdGFsKQoJfQoJbXVzdFNwZW5kKHQsIGIsIGlkLCAzKmRheSwgNTApCn0KCi8vIC0tLSBBbWVuZDogdGhlIHplcm8tbWVhbnMtdW5saW1pdGVkIGludmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgVGVzdEFtZW5kVG90YWxaZXJvSXNMb29zZXJOb3RUaWdodGVyKHQgKnRlc3RpbmcuVCkgewoJLy8gVG90YWwgMCBtZWFucyBOTyBsaWZldGltZSBjYXAsIHNvIHJlcGxhY2luZyBhIHBvc2l0aXZlIFRvdGFsIHdpdGggMCBpcwoJLy8gcmVtb3ZpbmcgYSBjYXAuIFJlYWRpbmcgInNtYWxsZXIgaXMgdGlnaHRlciIgd291bGQgbGV0IGFuIG93bmVyIGxpZnQgaXQKCS8vIG1pZC13aW5kb3cgYW5kIGNhbGwgaXQgYSB0aWdodGVuaW5nLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgXyA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIFRvdGFsOiAxMDB9KQoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDB9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRXJyb3IoInJlbW92aW5nIHRoZSBsaWZldGltZSBjYXAgYXBwbGllZCBpbW1lZGlhdGVseSIpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDApOyBnb3QgIT0gNTAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmc6IGdvdCAlZCwgd2FudCA1MCAoc3RpbGwgY2FwcGVkIGJ5IHRoZSBsaXZlIDEwMCkiLCBnb3QpCgl9Cn0KCmZ1bmMgVGVzdEFtZW5kVG90YWxEb3dud2FyZElzVGlnaHRlcih0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJaWQsIF8gOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBUb3RhbDogMTAwfSkKCWFwcGxpZWQsIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIFRvdGFsOiA0MH0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQ6ICV2IiwgZXJyKQoJfQoJaWYgIWFwcGxpZWQgewoJCXQuRXJyb3IoImxvd2VyaW5nIHRoZSBsaWZldGltZSBjYXAgd2FzIHF1ZXVlZCIpCgl9CglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDApOyBnb3QgIT0gNDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmc6IGdvdCAlZCwgd2FudCA0MCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0QW1lbmRBZGRpbmdBVG90YWxUb0FuVW5jYXBwZWRBbGxvd2FuY2VJc1RpZ2h0ZXIodCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAwKSAvLyBUb3RhbCAwID09IHVubGltaXRlZAoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDYwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJBbWVuZDogJXYiLCBlcnIpCgl9CglpZiAhYXBwbGllZCB7CgkJdC5FcnJvcigiYWRkaW5nIGEgbGlmZXRpbWUgY2FwIHdhcyBxdWV1ZWQiKQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCAwKTsgZ290ICE9IDUwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgNTAiLCBnb3QpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQsIDAsIDUwKQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBkYXkpOyBnb3QgIT0gMTAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgaW4gd2luZG93IDE6IGdvdCAlZCwgd2FudCAxMCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0QW1lbmRFeHBpcmVzQXRaZXJvSXNMb29zZXJOb3RUaWdodGVyKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDQpCglpZCwgXyA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMTAgKiBkYXl9KQoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJBbWVuZDogJXYiLCBlcnIpCgl9CglpZiBhcHBsaWVkIHsKCQl0LkVycm9yKCJyZW1vdmluZyB0aGUgZXhwaXJ5IGFwcGxpZWQgaW1tZWRpYXRlbHkiKQoJfQoJLy8gVGhlIGxpdmUgZXhwaXJ5IHN0aWxsIGJpdGVzIHVudGlsIHRoZSBib3VuZGFyeSBjb25zdW1lcyB0aGUgcGVuZGluZwoJLy8gdGVybXMsIHdoaWNoIGhlcmUgaXQgZG9lcyBhdCBkYXkgMSAtLSB3ZWxsIGJlZm9yZSB0aGUgb2xkIGV4cGlyeS4KCWEsIF8gOj0gYi5HZXQoaWQpCglpZiAhYS5IYXNQZW5kaW5nIHsKCQl0LkZhdGFsKCJubyBwZW5kaW5nIGFtZW5kbWVudCByZWNvcmRlZCIpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQsIGRheSwgNTApCglhLCBfID0gYi5HZXQoaWQpCglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwIHsKCQl0LkVycm9yZigiRXhwaXJlc0F0IGFmdGVyIHRoZSBib3VuZGFyeTogZ290ICVkLCB3YW50IDAiLCBhLlRlcm1zLkV4cGlyZXNBdCkKCX0KCWlmIGEuSXNFeHBpcmVkKDEwMCAqIGRheSkgewoJCXQuRXJyb3IoInN0aWxsIGV4cGlyaW5nIG9uIHRoZSBvbGQgdGVybXMiKQoJfQp9CgpmdW5jIFRlc3RBbWVuZFNob3J0ZW5pbmdUaGVFeHBpcnlJc1RpZ2h0ZXIodCAqdGVzdGluZy5UKSB7CgliIDo9IE11c3ROZXcoNCkKCWlkLCBfIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAxMCAqIGRheX0pCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDIgKiBkYXl9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmICFhcHBsaWVkIHsKCQl0LkZhdGFsKCJzaG9ydGVuaW5nIHRoZSBleHBpcnkgd2FzIHF1ZXVlZCIpCgl9CgltdXN0U3BlbmQodCwgYiwgaWQsIGRheSwgMTApCglyZWZ1c2UodCwgYiwgaWQsIDIqZGF5LCAxLCBFcnJFeHBpcmVkKQp9CgpmdW5jIFRlc3RBbWVuZEFkZGluZ0FuRXhwaXJ5VG9BblVuZXhwaXJpbmdBbGxvd2FuY2VJc1RpZ2h0ZXIodCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAwKSAvLyBFeHBpcmVzQXQgMCA9PSBuZXZlcgoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAyICogZGF5fSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJBbWVuZDogJXYiLCBlcnIpCgl9CglpZiAhYXBwbGllZCB7CgkJdC5GYXRhbCgiYWRkaW5nIGFuIGV4cGlyeSB3YXMgcXVldWVkIikKCX0KCXJlZnVzZSh0LCBiLCBpZCwgMipkYXksIDEsIEVyckV4cGlyZWQpCn0KCmZ1bmMgVGVzdEFtZW5kTWl4ZWREaXJlY3Rpb25zSXNMb29zZXIodCAqdGVzdGluZy5UKSB7CgkvLyBUaWdodGVyIGluIG9uZSBkaW1lbnNpb24gYW5kIGxvb3NlciBpbiBhbm90aGVyIGlzIE5PVCB0aWdodGVyOiB0aGUKCS8vIHByZWRpY2F0ZSBpcyB3ZWFrbHkgdGlnaHRlciBpbiBFVkVSWSBkaW1lbnNpb24uCgliIDo9IE11c3ROZXcoNCkKCWlkLCBfIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDEwMH0pCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDAsCgkJVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiBkYXksIFRvdGFsOiAxMDAwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJBbWVuZDogJXYiLCBlcnIpCgl9CglpZiBhcHBsaWVkIHsKCQl0LkVycm9yKCJhIGxvd2VyIFBlclBlcmlvZCB3aXRoIGEgcmFpc2VkIFRvdGFsIGFwcGxpZWQgaW1tZWRpYXRlbHkiKQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCAwKTsgZ290ICE9IDUwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgNTAgKGxpdmUgdGVybXMgdW5jaGFuZ2VkKSIsIGdvdCkKCX0KfQoKLy8gLS0tIEFtZW5kOiBQZXJpb2RMZW5ndGggaXMgaW1tdXRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0QW1lbmRDYW5ub3RDaGFuZ2VQZXJpb2RMZW5ndGgodCAqdGVzdGluZy5UKSB7CgkvLyBNb3ZpbmcgZXZlcnkgZnV0dXJlIGJvdW5kYXJ5IGlzIGFuIGVubGFyZ2VtZW50IHZlY3RvciB3ZWFyaW5nIGEKCS8vIGRpZmZlcmVudCBoYXQsIHNvIGl0IGlzIHJlZnVzZWQgaW4gQk9USCBkaXJlY3Rpb25zIHJhdGhlciB0aGFuIHF1ZXVlZC4KCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCglmb3IgXywgcGwgOj0gcmFuZ2UgW11pbnQ2NHtkYXkgLSAxLCBkYXkgKyAxLCAwLCAxfSB7CgkJXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IHBsfSkKCQlpZiBlcnIgIT0gRXJySW52YWxpZFRlcm1zIHsKCQkJdC5FcnJvcmYoIlBlcmlvZExlbmd0aCAlZDogZ290ICV2LCB3YW50IEVyckludmFsaWRUZXJtcyIsIHBsLCBlcnIpCgkJfQoJfQoJLy8gQW5kIHRoZSB0aWdodGVyLW9yLWVxdWFsIHByZWRpY2F0ZSBpbmRlcGVuZGVudGx5IHJlZnVzZXMgaXQsIHNvIHRoZQoJLy8gY2hlY2sgaW4gQW1lbmQgaXMgbm90IHRoZSBvbmx5IHRoaW5nIHN0YW5kaW5nIGluIHRoZSB3YXkuCglhIDo9IFRlcm1ze1BlclBlcmlvZDogMSwgUGVyaW9kTGVuZ3RoOiBkYXl9CgljIDo9IFRlcm1ze1BlclBlcmlvZDogMSwgUGVyaW9kTGVuZ3RoOiBkYXkgKyAxfQoJaWYgYS50aWdodGVyT3JFcXVhbFRvKGMpIHx8IGMudGlnaHRlck9yRXF1YWxUbyhhKSB7CgkJdC5FcnJvcigidGlnaHRlck9yRXF1YWxUbyBhY2NlcHRlZCBhIFBlcmlvZExlbmd0aCBjaGFuZ2UiKQoJfQp9CgovLyAtLS0gQW1lbmQ6IG5vIHJlYWNoYWJsZSBib3VuZGFyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RBbWVuZExvb3Nlck9uQUxpZmV0aW1lQWxsb3dhbmNlSXNSZWZ1c2VkKHQgKnRlc3RpbmcuVCkgewoJLy8gUGVyaW9kTGVuZ3RoIDAgaGFzIG5vIG5leHQgYm91bmRhcnksIHNvIHF1ZXVlaW5nIHdvdWxkIHBhcmsgdGhlCgkvLyBhbWVuZG1lbnQgZm9yZXZlciBhbmQgcmVwb3J0IGl0IGFzIGFjY2VwdGVkLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgXyA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiAwfSkKCV8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogMH0pCglpZiBlcnIgIT0gRXJyTm9Cb3VuZGFyeSB7CgkJdC5FcnJvcmYoImdvdCAldiwgd2FudCBFcnJOb0JvdW5kYXJ5IiwgZXJyKQoJfQoJLy8gQSB0aWdodGVuaW5nIG9uIGEgbGlmZXRpbWUgYWxsb3dhbmNlIGlzIHN0aWxsIGZpbmU6IGl0IG5lZWRzIG5vIHdpbmRvdy4KCWFwcGxpZWQsIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiAwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJ0aWdodGVuaW5nIGEgbGlmZXRpbWUgYWxsb3dhbmNlOiAldiIsIGVycikKCX0KCWlmICFhcHBsaWVkIHsKCQl0LkVycm9yKCJ0aGUgdGlnaHRlbmluZyB3YXMgcXVldWVkIikKCX0KfQoKZnVuYyBUZXN0QW1lbmRMb29zZXJJc1JlZnVzZWRXaGVuVGhlRXhwaXJ5UHJlY2VkZXNUaGVOZXh0Qm91bmRhcnkodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgb3JkaW5hcnktdXNlIGNhc2U6IHRpZ2h0ZW5pbmcgRXhwaXJlc0F0IGFwcGxpZXMgSU1NRURJQVRFTFksIHNvIGFuCgkvLyBvd25lciBjYW4gcHVsbCB0aGUgZXhwaXJ5IGluIGJlbG93IHRoZSBuZXh0IGJvdW5kYXJ5IGFuZCB0aGVuIHRyeSB0bwoJLy8gbG9vc2VuIFBlclBlcmlvZC4gVGhlIGJvdW5kYXJ5IHRoZSBsb29zZW5pbmcgd2FpdHMgZm9yIG5ldmVyIG9wZW5zLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgXyA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMTAgKiBkYXl9KQoJYXBwbGllZCwgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLAoJCVRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IGRheSAvIDJ9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoInRpZ2h0ZW5pbmcgdGhlIGV4cGlyeTogJXYiLCBlcnIpCgl9CglpZiAhYXBwbGllZCB7CgkJdC5GYXRhbCgidGhlIHRpZ2h0ZW5pbmcgd2FzIHF1ZXVlZCIpCgl9CgkvLyBOZXh0IGJvdW5kYXJ5IGlzIGBkYXlgOyB0aGUgYWxsb3dhbmNlIGRpZXMgYXQgZGF5LzIuCglfLCBlcnIgPSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IGRheSAvIDJ9KQoJaWYgZXJyICE9IEVyck5vQm91bmRhcnkgewoJCXQuRXJyb3JmKCJnb3QgJXYsIHdhbnQgRXJyTm9Cb3VuZGFyeSIsIGVycikKCX0KCS8vIFB1c2hpbmcgdGhlIGV4cGlyeSBiYWNrIG91dCBpcyBpdHNlbGYgYSBsb29zZW5pbmcsIHNvIGl0IGNhbm5vdCBiZSB0aGUKCS8vIG93bmVyJ3Mgd2F5IG91dDogaXQgaXMganVkZ2VkIGFnYWluc3QgdGhlIHNhbWUgZGVhZCB3aW5kb3cgYW5kIHJlZnVzZWQKCS8vIGlkZW50aWNhbGx5LiBUaGUgdGlnaHRlbmluZyBpcyBvbmUtd2F5IHdpdGhvdXQgYSByZWFjaGFibGUgYm91bmRhcnksCgkvLyBhbmQgUmV2b2tlIHBsdXMgYSBmcmVzaCBPcGVuIGlzIHRoZSBvbmx5IHJvdXRlLgoJaWYgXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAwLAoJCVRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDUgKiBkYXl9KTsgZXJyICE9IEVyck5vQm91bmRhcnkgewoJCXQuRXJyb3JmKCJyZS1leHBhbmRpbmcgdGhlIGV4cGlyeTogZ290ICV2LCB3YW50IEVyck5vQm91bmRhcnkiLCBlcnIpCgl9CglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5UZXJtcy5FeHBpcmVzQXQgIT0gZGF5LzIgewoJCXQuRXJyb3JmKCJhIGxvb3NlbmVkIGV4cGlyeSBhcHBsaWVkIGltbWVkaWF0ZWx5OiAlZCIsIGEuVGVybXMuRXhwaXJlc0F0KQoJfQp9CgpmdW5jIFRlc3RUaGVVbnJlYWNoYWJsZUJvdW5kYXJ5VGVzdElzR3JlYXRlck9yRXF1YWxOb3RHcmVhdGVyKHQgKnRlc3RpbmcuVCkgewoJLy8gQW4gZXhwaXJ5IGV4YWN0bHkgQVQgdGhlIG5leHQgYm91bmRhcnkgaXMgdW5yZWFjaGFibGUsIGJlY2F1c2UgdGhlCgkvLyB3aW5kb3cgb3BlbnMgYXQgYGRheWAgYW5kIElzRXhwaXJlZCBpcyBhbHJlYWR5IHRydWUgYXQgYGRheWAuIE9mZiBieQoJLy8gb25lIGluIHRoZSBjb21wYXJpc29uIHdvdWxkIHF1ZXVlIGFuIGFtZW5kbWVudCBpbnRvIGEgd2luZG93IHRoYXQKCS8vIGV4aXN0cyBmb3IgemVybyBpbnN0YW50cy4KCWIgOj0gTXVzdE5ldyg0KQoJaWQsIF8gOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IGRheX0pCglsb29zZXIgOj0gVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IGRheX0KCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwgbG9vc2VyKTsgZXJyICE9IEVyck5vQm91bmRhcnkgewoJCXQuRXJyb3JmKCJleHBpcnkgYXQgdGhlIGJvdW5kYXJ5OiBnb3QgJXYsIHdhbnQgRXJyTm9Cb3VuZGFyeSIsIGVycikKCX0KCgkvLyBPbmUgaW5zdGFudCBsYXRlciB0aGUgYm91bmRhcnkgSVMgcmVhY2hhYmxlLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoZQoJLy8gY2hlY2sgYWJvdmUgZnJvbSBiZWluZyBhIHRvb2wgdGhhdCBtZXJlbHkgYWx3YXlzIHJlZnVzZXMuCgliMiA6PSBNdXN0TmV3KDQpCglpZDIsIF8gOj0gYjIuT3BlbihhbGljZSwgYm9iLCAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiBkYXkgKyAxfSkKCWFwcGxpZWQsIGVyciA6PSBiMi5BbWVuZChpZDIsIGFsaWNlLCAwLAoJCVRlcm1ze1BlclBlcmlvZDogNTAwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiBkYXkgKyAxfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJleHBpcnkgb25lIHBhc3QgdGhlIGJvdW5kYXJ5OiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRmF0YWwoInRoZSBsb29zZW5pbmcgYXBwbGllZCBpbW1lZGlhdGVseSIpCgl9CgkvLyBBbmQgdGhlIG9uZSBpbnN0YW50IGl0IGlzIGFsaXZlIGZvciBhY3R1YWxseSBob25vcnMgdGhlIG5ldyB0ZXJtcy4KCW11c3RTcGVuZCh0LCBiMiwgaWQyLCBkYXksIDUwMCkKfQoKZnVuYyBUZXN0TmV4dEJvdW5kYXJ5UmVmdXNlc1VucmVwcmVzZW50YWJsZUFyaXRobWV0aWModCAqdGVzdGluZy5UKSB7CgkvLyBBbiB1bmd1YXJkZWQgQW5jaG9yICsgKGlkeCsxKSpQZXJpb2RMZW5ndGggd291bGQgd3JhcCBhbmQgcmVwb3J0IGEKCS8vIGJvdW5kYXJ5IGluIHRoZSBQQVNULCB3aGljaCBpcyB0aGUgZGFuZ2Vyb3VzIGRpcmVjdGlvbjogQW1lbmQgd291bGQKCS8vIHF1ZXVlIGEgbG9vc2VuaW5nIGFzIHRob3VnaCBpdCB3ZXJlIGFib3V0IHRvIHRha2UgZWZmZWN0LgoJYSA6PSBBbGxvd2FuY2V7QW5jaG9yOiAwLCBUZXJtczogVGVybXN7UGVyUGVyaW9kOiAxLCBQZXJpb2RMZW5ndGg6IG1heEludDY0fX0KCWlmIF8sIG9rIDo9IGEubmV4dEJvdW5kYXJ5KDEpOyBvayB7CgkJdC5FcnJvcigic3RlcHMgKiBQZXJpb2RMZW5ndGggb3ZlcmZsb3cgd2FzIG5vdCBkZXRlY3RlZCIpCgl9CglpZiBuYiwgb2sgOj0gYS5uZXh0Qm91bmRhcnkoMCk7ICFvayB8fCBuYiAhPSBtYXhJbnQ2NCB7CgkJdC5FcnJvcmYoInRoZSByZXByZXNlbnRhYmxlIGJvdW5kYXJ5OiBnb3QgJWQvJXYsIHdhbnQgJWQvdHJ1ZSIsCgkJCW5iLCBvaywgbWF4SW50NjQpCgl9CgkvLyBPdmVyZmxvdyBpbiB0aGUgQW5jaG9yICsgb2Zmc2V0IHRlcm0gcmF0aGVyIHRoYW4gdGhlIHByb2R1Y3QuCglhMiA6PSBBbGxvd2FuY2V7QW5jaG9yOiBtYXhJbnQ2NCAtIDUsIFRlcm1zOiBUZXJtc3tQZXJQZXJpb2Q6IDEsIFBlcmlvZExlbmd0aDogMTB9fQoJaWYgXywgb2sgOj0gYTIubmV4dEJvdW5kYXJ5KDApOyBvayB7CgkJdC5FcnJvcigiQW5jaG9yICsgb2Zmc2V0IG92ZXJmbG93IHdhcyBub3QgZGV0ZWN0ZWQiKQoJfQoJLy8gQSBsaWZldGltZSBhbGxvd2FuY2UgaGFzIG5vbmUgYnkgY29uc3RydWN0aW9uLgoJYTMgOj0gQWxsb3dhbmNle1Rlcm1zOiBUZXJtc3tQZXJQZXJpb2Q6IDEsIFBlcmlvZExlbmd0aDogMH19CglpZiBfLCBvayA6PSBhMy5uZXh0Qm91bmRhcnkoMCk7IG9rIHsKCQl0LkVycm9yKCJhIGxpZmV0aW1lIGFsbG93YW5jZSByZXBvcnRlZCBhIGJvdW5kYXJ5IikKCX0KfQoKZnVuYyBUZXN0QW1lbmRMb29zZXJJc1JlZnVzZWRXaGVuVGhlQm91bmRhcnlJc1VucmVwcmVzZW50YWJsZSh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJaWQsIF8gOj0gYi5PcGVuKGFsaWNlLCBib2IsIG1heEludDY0LTUsIFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogMTB9KQoJXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCBtYXhJbnQ2NC01LCBUZXJtc3tQZXJQZXJpb2Q6IDUwMCwgUGVyaW9kTGVuZ3RoOiAxMH0pCglpZiBlcnIgIT0gRXJyTm9Cb3VuZGFyeSB7CgkJdC5FcnJvcmYoImdvdCAldiwgd2FudCBFcnJOb0JvdW5kYXJ5IiwgZXJyKQoJfQp9CgovLyAtLS0gQW1lbmQ6IGF1dGhvcml6YXRpb24gYW5kIGFyZ3VtZW50IGNoZWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RBbWVuZFJlamVjdHNOb25Pd25lcnModCAqdGVzdGluZy5UKSB7CgliLCBpZCA6PSBvcGVuRGVmYXVsdCh0LCAwKQoJdGlnaHRlciA6PSBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0KCWZvciBfLCB3aG8gOj0gcmFuZ2UgW11zdHJpbmd7Ym9iLCBjYXJvbCwgIiJ9IHsKCQlpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgd2hvLCAwLCB0aWdodGVyKTsgZXJyICE9IEVyck5vdE93bmVyIHsKCQkJdC5FcnJvcmYoIkFtZW5kIGFzICVxOiBnb3QgJXYsIHdhbnQgRXJyTm90T3duZXIiLCB3aG8sIGVycikKCQl9Cgl9CglpZiBfLCBlcnIgOj0gYi5BbWVuZCg5OSwgYWxpY2UsIDAsIHRpZ2h0ZXIpOyBlcnIgIT0gRXJyTm90Rm91bmQgewoJCXQuRXJyb3JmKCJ1bmtub3duIGlkOiBnb3QgJXYsIHdhbnQgRXJyTm90Rm91bmQiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdEFtZW5kUmVqZWN0c0JhZEFyZ3VtZW50c0FuZERlYWRBbGxvd2FuY2VzKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDQpCglpZCwgXyA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMTAwMCwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMjAwMH0pCgl0aWdodGVyIDo9IFRlcm1ze1BlclBlcmlvZDogMTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDIwMDB9CgoJaWYgXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAtMSwgdGlnaHRlcik7IGVyciAhPSBFcnJJbnZhbGlkTm93IHsKCQl0LkVycm9yZigibmVnYXRpdmUgbm93OiBnb3QgJXYsIHdhbnQgRXJySW52YWxpZE5vdyIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgOTk5LCB0aWdodGVyKTsgZXJyICE9IEVyck5vdFN0YXJ0ZWQgewoJCXQuRXJyb3JmKCJiZWZvcmUgdGhlIGFuY2hvcjogZ290ICV2LCB3YW50IEVyck5vdFN0YXJ0ZWQiLCBlcnIpCgl9CglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDIwMDAsIHRpZ2h0ZXIpOyBlcnIgIT0gRXJyRXhwaXJlZCB7CgkJdC5FcnJvcmYoImV4cGlyZWQ6IGdvdCAldiwgd2FudCBFcnJFeHBpcmVkIiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAxMDAwLCBUZXJtc3tQZXJQZXJpb2Q6IDAsIFBlcmlvZExlbmd0aDogZGF5fSk7IGVyciAhPSBFcnJJbnZhbGlkVGVybXMgewoJCXQuRXJyb3JmKCJpbnZhbGlkIHRlcm1zOiBnb3QgJXYsIHdhbnQgRXJySW52YWxpZFRlcm1zIiwgZXJyKQoJfQp9CgpmdW5jIFRlc3RBbWVuZElzVmFsaWRhdGVkQWdhaW5zdFRoZUFuY2hvck5vdE5vdyh0ICp0ZXN0aW5nLlQpIHsKCS8vIERvY3VtZW50ZWQgYW5kIGRlbGliZXJhdGU6IGFuIGV4cGlyeSBiZXR3ZWVuIHRoZSBhbmNob3IgYW5kIG5vdyBpcyBhCgkvLyB0aWdodGVuaW5nIHRvIHRoZSBwb2ludCBvZiBkZWF0aCwgd2hpY2ggaXMgdGhlIG93bmVyJ3MgcHJlcm9nYXRpdmUuCgliIDo9IE11c3ROZXcoNCkKCWlkLCBfIDo9IGIuT3BlbihhbGljZSwgYm9iLCAxMDAwLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheX0pCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDEwNTAsCgkJVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMTAwMX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQ6ICV2IiwgZXJyKQoJfQoJaWYgIWFwcGxpZWQgewoJCXQuRmF0YWwoIml0IHdhcyBxdWV1ZWQiKQoJfQoJcmVmdXNlKHQsIGIsIGlkLCAxMDUwLCAxLCBFcnJFeHBpcmVkKQoJLy8gQW5kIHRoZSBzbG90IGlzIHJlY2xhaW1hYmxlLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoaXMgZnJvbSBiZWluZyBhIGxlYWsuCglpZiBlcnIgOj0gYi5SZWFwKGlkLCAxMDUwKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlJlYXA6ICV2IiwgZXJyKQoJfQp9CgovLyAtLS0gSXRlcmF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBUZXN0SXRlcmF0ZVZpc2l0c0V2ZXJ5QWxsb3dhbmNlSW5JRE9yZGVyKHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDE2KQoJdGVybXMgOj0gVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiBkYXl9CgkvLyBFbm91Z2ggZW50cmllcyB0aGF0IGEgbGV4aWNhbCBrZXkgb3JkZXIgd291bGQgZGl2ZXJnZSBmcm9tIG51bWVyaWMKCS8vIG9yZGVyIHdpdGhvdXQgdGhlIHplcm8gcGFkZGluZyAoOSB0aGVuIDEwKS4KCXZhciB3YW50IFtddWludDY0Cglmb3IgaSA6PSAwOyBpIDwgMTI7IGkrKyB7CgkJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwgdGVybXMpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXQuRmF0YWxmKCJPcGVuICVkOiAldiIsIGksIGVycikKCQl9CgkJd2FudCA9IGFwcGVuZCh3YW50LCBpZCkKCX0KCXZhciBnb3QgW111aW50NjQKCWIuSXRlcmF0ZShmdW5jKGEgQWxsb3dhbmNlKSBib29sIHsKCQlnb3QgPSBhcHBlbmQoZ290LCBhLklEKQoJCXJldHVybiBmYWxzZQoJfSkKCWlmIGxlbihnb3QpICE9IGxlbih3YW50KSB7CgkJdC5GYXRhbGYoInZpc2l0ZWQgJWQsIHdhbnQgJWQiLCBsZW4oZ290KSwgbGVuKHdhbnQpKQoJfQoJZm9yIGkgOj0gcmFuZ2Ugd2FudCB7CgkJaWYgZ290W2ldICE9IHdhbnRbaV0gewoJCQl0LkZhdGFsZigib3JkZXIgZGl2ZXJnZWQgYXQgJWQ6IGdvdCAldiwgd2FudCAldiIsIGksIGdvdCwgd2FudCkKCQl9Cgl9Cn0KCmZ1bmMgVGVzdEl0ZXJhdGVTdG9wc0Vhcmx5KHQgKnRlc3RpbmcuVCkgewoJYiA6PSBNdXN0TmV3KDgpCgl0ZXJtcyA6PSBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheX0KCWZvciBpIDo9IDA7IGkgPCA1OyBpKysgewoJCWIuT3BlbihhbGljZSwgYm9iLCAwLCB0ZXJtcykKCX0KCW4gOj0gMAoJYi5JdGVyYXRlKGZ1bmMoYSBBbGxvd2FuY2UpIGJvb2wgewoJCW4rKwoJCXJldHVybiBuID09IDIKCX0pCglpZiBuICE9IDIgewoJCXQuRXJyb3JmKCJ2aXNpdGVkICVkLCB3YW50IDIiLCBuKQoJfQp9CgpmdW5jIFRlc3RJdGVyYXRlUGFzc2VzQnlWYWx1ZSh0ICp0ZXN0aW5nLlQpIHsKCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApCgliLkl0ZXJhdGUoZnVuYyhhIEFsbG93YW5jZSkgYm9vbCB7CgkJYS5UZXJtcy5QZXJQZXJpb2QgPSAxIDw8IDQwCgkJYS5TcGVudFdpbmRvdyA9IC0xCgkJcmV0dXJuIGZhbHNlCgl9KQoJYWZ0ZXIsIF8gOj0gYi5HZXQoaWQpCglpZiBhZnRlci5UZXJtcy5QZXJQZXJpb2QgIT0gNTAgfHwgYWZ0ZXIuU3BlbnRXaW5kb3cgIT0gMCB7CgkJdC5FcnJvcmYoImZuIG11dGF0ZWQgdGhlIGJvb2sgdGhyb3VnaCBpdHMgYXJndW1lbnQ6ICUrdiIsIGFmdGVyKQoJfQp9CgpmdW5jIFRlc3RJdGVyYXRlT25BbkVtcHR5Qm9vayh0ICp0ZXN0aW5nLlQpIHsKCWIgOj0gTXVzdE5ldyg0KQoJYi5JdGVyYXRlKGZ1bmMoYSBBbGxvd2FuY2UpIGJvb2wgewoJCXQuRXJyb3IoImZuIHdhcyBjYWxsZWQgb24gYW4gZW1wdHkgYm9vayIpCgkJcmV0dXJuIGZhbHNlCgl9KQp9CgovLyAtLS0gdGhlIHNoYXJlZC1pbXBsZW1lbnRhdGlvbiBwcm9wZXJ0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jIFRlc3RSZW1haW5pbmdBZ3JlZXNXaXRoV2hhdFNwZW5kSG9ub3JzKHQgKnRlc3RpbmcuVCkgewoJLy8gU3BlbmQgYW5kIFJlbWFpbmluZyBzaGFyZSBvbmUgYGF0YCwgc28gdGhlIHJlYWQgYW5kIHRoZSB3cml0ZSBjYW5ub3QKCS8vIGRpc2FncmVlIC0tIGFuIGFsbG93YW5jZSBtdXN0IG5ldmVyIHJlcG9ydCBtb3JlIHRoYW4gaXQgaG9ub3JzLCBub3IKCS8vIGhvbm9yIG1vcmUgdGhhbiBpdCByZXBvcnRzLiBUaGlzIHdhbGtzIGEgY2xvY2sgYWNyb3NzIGJvdW5kYXJpZXMsCgkvLyBhbWVuZG1lbnRzIGFuZCBjYXBzLCBhc3NlcnRpbmcgYm90aCBoYWx2ZXMgYXQgZXZlcnkgc3RlcC4KCWNsb2NrcyA6PSBbXWludDY0ezAsIDEwLCA5OSwgMTAwLCAxNTAsIDE5OSwgMjAwLCAyMDEsIDUwMCwgNTAxLCA5MDAsIDEwMDB9CgoJZm9yIF8sIGMgOj0gcmFuZ2UgY2xvY2tzIHsKCQliIDo9IE11c3ROZXcoNCkKCQlpZCwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCAwLAoJCQlUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDEyMCwgRXhwaXJlc0F0OiAxMDAwfSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJdC5GYXRhbGYoIk9wZW46ICV2IiwgZXJyKQoJCX0KCQkvLyBTb21lIGhpc3RvcnksIHNvIHRoZSBzdGF0ZSBhdCBjIGlzIG5vdCBwcmlzdGluZS4KCQlpZiBlcnIgOj0gYi5TcGVuZChpZCwgYm9iLCAwLCAzMCk7IGVyciAhPSBuaWwgewoJCQl0LkZhdGFsZigic2VlZCBTcGVuZDogJXYiLCBlcnIpCgkJfQoJCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwKCQkJVGVybXN7UGVyUGVyaW9kOiA1MDAsIFBlcmlvZExlbmd0aDogZGF5LCBUb3RhbDogMTIwLCBFeHBpcmVzQXQ6IDEwMDB9KTsgZXJyICE9IG5pbCB7CgkJCXQuRmF0YWxmKCJzZWVkIEFtZW5kOiAldiIsIGVycikKCQl9CgoJCXIgOj0gYi5SZW1haW5pbmcoaWQsIGMpCgkJaWYgciA8IDAgewoJCQl0LkZhdGFsZigiY2xvY2sgJWQ6IFJlbWFpbmluZyBpcyBuZWdhdGl2ZTogJWQiLCBjLCByKQoJCX0KCQlpZiByID4gMCB7CgkJCS8vIEV4YWN0bHkgd2hhdCBpdCBwcm9taXNlZCBtdXN0IGJlIHNwZW5kYWJsZS4uLgoJCQlpZiBlcnIgOj0gYi5TcGVuZChpZCwgYm9iLCBjLCByKTsgZXJyICE9IG5pbCB7CgkJCQl0LkVycm9yZigiY2xvY2sgJWQ6IFJlbWFpbmluZyBzYWlkICVkIGJ1dCBTcGVuZCByZWZ1c2VkIGl0OiAldiIsCgkJCQkJYywgciwgZXJyKQoJCQl9CgkJCS8vIC4uLmFuZCBub3RoaW5nIGJleW9uZCBpdC4KCQkJaWYgZXJyIDo9IGIuU3BlbmQoaWQsIGJvYiwgYywgMSk7IGVyciA9PSBuaWwgewoJCQkJdC5FcnJvcmYoImNsb2NrICVkOiBob25vcmVkIDEgcGFzdCB0aGUgcmVwb3J0ZWQgJWQiLCBjLCByKQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgZXJyIDo9IGIuU3BlbmQoaWQsIGJvYiwgYywgMSk7IGVyciA9PSBuaWwgewoJCQkJdC5FcnJvcmYoImNsb2NrICVkOiBSZW1haW5pbmcgc2FpZCAwIGJ1dCBTcGVuZCBob25vcmVkIGEgZHJhdyIsIGMpCgkJCX0KCQl9Cgl9Cn0KCi8vIC0tLSB0aGUgbGFzdC13cml0dGVuIHJlY29yZCB2cyB0aGUgbGl2ZSB2aWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBUaGUgdGhyZWUgdGVzdHMgYmVsb3cgd2VyZSB3cml0dGVuIEFGVEVSIHRoZSBmYWN0LCBmcm9tIG1lYXN1cmVtZW50cyB0YWtlbgovLyBvbiBvbnl4LTEgYWdhaW5zdCB0aGUgZGVwbG95ZWQgYnl0ZXMsIGFuZCB0aGV5IGFyZSBDSEFSQUNURVJJWkFUSU9OIHRlc3RzOgovLyB0aGV5IGFzc2VydCB0aGUgYmVoYXZpb3VyIHRoaXMgcGFja2FnZSBhY3R1YWxseSBoYXMsIG5vdCB0aGUgYmVoYXZpb3VyIGl0Ci8vIG91Z2h0IHRvIGhhdmUuIFRoZXkgZXhpc3QgYmVjYXVzZSB0aGF0IGJlaGF2aW91ciBtaXNsZWQgaXRzIG93biBmaXJzdAovLyBjb25zdW1lciwgYW5kIGEgaGF6YXJkIG5vdGhpbmcgYXNzZXJ0cyBpcyBhIGhhemFyZCB0aGF0IGdldHMgcmUtZGlzY292ZXJlZC4KLy8KLy8gVGhlIGhhemFyZCwgc3RhdGVkIG9uY2U6IEFsbG93YW5jZSdzIGV4cG9ydGVkIEZJRUxEUyBhcmUgdGhlIGxhc3QtV1JJVFRFTgovLyByZWNvcmQsIHdoaWxlIHRoZSBvbmx5IGxpdmUtcmVzb2x2ZWQgdmlldyBpcyBiZWhpbmQgdGhlIHVuZXhwb3J0ZWQgYXQoKSwKLy8gcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGlzIHBhY2thZ2UgdGhyb3VnaCBSZW1haW5pbmcgYWxvbmUuIEJldHdlZW4gYQovLyB3aW5kb3cgYm91bmRhcnkgYW5kIHRoZSBuZXh0IHdyaXRlIHRoZXJlIGlzIG5vIHdyaXRlIHRvIHVwZGF0ZSB0aGUgcmVjb3JkLAovLyBzbyBUZXJtcywgUGVuZGluZywgSGFzUGVuZGluZywgV2luZG93SW5kZXggYW5kIFNwZW50V2luZG93IGFsbCBkZXNjcmliZSBhCi8vIHdpbmRvdyB0aGUgY2xvY2sgaGFzIGxlZnQgLS0gYW5kIGEgY29uc3VtZXIgdGhhdCByZWFkcyB0aGVtIHRvIERJU1BMQVkKLy8gc3RhdGUgcHVibGlzaGVzIGZpZ3VyZXMgdGhhdCBkaXNhZ3JlZSB3aXRoIHdoYXQgU3BlbmQgd2lsbCBob25vci4KLy8KLy8gTm90aGluZyBoZXJlIGlzIGEgY29ycmVjdG5lc3MgYnVnIGluIGVuZm9yY2VtZW50LiBTcGVuZCBhbmQgUmVtYWluaW5nIGJvdGgKLy8gcm91dGUgdGhyb3VnaCBhdCgpIGFuZCB3ZXJlIGNvcnJlY3QgaW4gYWxsIHRlbiBsaXZlIHRyYW5zYWN0aW9uczsgc2VlCi8vIG9ueXgvREVQTE9ZTUVOVC5tZCwgR3JvdXAgOS4gV2hhdCBpcyB3cm9uZyBpcyB0aGUgc2hhcGUgb2YgdGhlIEFQSS4KCmZ1bmMgVGVzdEV4cG9ydGVkRmllbGRzQXJlVGhlTGFzdFdyaXR0ZW5SZWNvcmROb3RUaGVMaXZlVmlldyh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoaXMgaXMgdGhlIG9uLWNoYWluIHNlcXVlbmNlIG9mIGJ1ZGdldHMgZ3JhbnQgIzEsIGluIG1pbmlhdHVyZToKCS8vIG9wZW4sIHNwZW5kLCB0aWdodGVuLCBxdWV1ZSBhIGxvb3NlbmluZywgdGhlbiBsZXQgdGhlIHdpbmRvdyByb2xsIHdpdGgKCS8vIG5vIHdyaXRlIGF0IGFsbC4gTWVhc3VyZWQgb24gb255eC0xIGF0IGhlaWdodCAxODk0MTEsIDMxIHdpbmRvd3MgYWZ0ZXIKCS8vIHRoZSBncmFudCB3YXMgb3BlbmVkIGF0IDE4NjI2Ny4KCWIsIGlkIDo9IG9wZW5EZWZhdWx0KHQsIDApIC8vIFBlclBlcmlvZCA1MCwgUGVyaW9kTGVuZ3RoIDEwMAoJbXVzdFNwZW5kKHQsIGIsIGlkLCAxMCwgMzApCgoJLy8gVGlnaHRlci1vci1lcXVhbCBhcHBsaWVzIG5vdy4KCWFwcGxpZWQsIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMjAsIFRlcm1ze1BlclBlcmlvZDogMjAsIFBlcmlvZExlbmd0aDogZGF5fSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJ0aWdodGVuaW5nIEFtZW5kOiAldiIsIGVycikKCX0KCWlmICFhcHBsaWVkIHsKCQl0LkZhdGFsZigiYSB0aWdodGVuaW5nIGFtZW5kbWVudCBzaG91bGQgYXBwbHkgaW1tZWRpYXRlbHkiKQoJfQoKCS8vIExvb3NlciBpcyBxdWV1ZWQgZm9yIHRoZSBuZXh0IGJvdW5kYXJ5LgoJYXBwbGllZCwgZXJyID0gYi5BbWVuZChpZCwgYWxpY2UsIDMwLCBUZXJtc3tQZXJQZXJpb2Q6IDgwLCBQZXJpb2RMZW5ndGg6IGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigibG9vc2VuaW5nIEFtZW5kOiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRmF0YWxmKCJhIGxvb3NlbmluZyBhbWVuZG1lbnQgc2hvdWxkIGJlIHF1ZXVlZCwgbm90IGFwcGxpZWQiKQoJfQoKCS8vIE5vdyBjcm9zcyBzZXZlcmFsIGJvdW5kYXJpZXMgV0lUSE9VVCB3cml0aW5nLiBub3cgPSAzMTUwIGlzIHdpbmRvdyAzMSwKCS8vIG1hdGNoaW5nIHRoZSBsaXZlIG1lYXN1cmVtZW50LgoJY29uc3Qgbm93ID0gaW50NjQoMzE1MCkKCglhLCBlcnIgOj0gYi5HZXQoaWQpCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiR2V0OiAldiIsIGVycikKCX0KCgkvLyBUaGUgbGl2ZSB2aWV3LCB0aHJvdWdoIHRoZSBvbmx5IGV4cG9ydGVkIGRvb3IgdGhhdCByZXNvbHZlcyBpdC4KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgbm93KTsgZ290ICE9IDgwIHsKCQl0LkZhdGFsZigiUmVtYWluaW5nOiBnb3QgJWQsIHdhbnQgODAgKHRoZSBxdWV1ZWQgdGVybXMgdG9vayBlZmZlY3QgIisKCQkJImF0IHRoZSBib3VuZGFyeSBhbmQgdGhlIHdpbmRvdyBzcGVuZCByZXNldCkiLCBnb3QpCgl9CgkvLyBBbmQgZW5mb3JjZW1lbnQgYWdyZWVzIHdpdGggdGhlIGxpdmUgdmlldywgd2hpY2ggaXMgdGhlIGhhbGYgdGhhdAoJLy8gbWF0dGVyczogb24gY2hhaW4gdGhpcyB3YXMgYSByZWFsIDgwMDAwMHVnbm90IGRyYXcgYXQgaGVpZ2h0IDE4OTQzNgoJLy8gKHR4IGY1OGJjOTEwMTZiMDU1YmZkZmVhZTVlNjBmN2FlYTFmNjY1MmQwZjlkNDUxNTJjODlmN2EwYmNjMGJhZmJmNjQpCgkvLyBhZ2FpbnN0IGEgcmVjb3JkIHN0aWxsIHJlcG9ydGluZyBhIGNhcCBvZiAyMDAwMDAuCglpZiBlcnIgOj0gYi5TcGVuZChpZCwgYm9iLCBub3csIDgwKTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIlNwZW5kIG9mIHRoZSBmdWxsIGxpdmUgUmVtYWluaW5nIHdhcyByZWZ1c2VkOiAldiIsIGVycikKCX0KCgkvLyBUaGUgcmVjb3JkLCBtZWFud2hpbGUsIHNheXMgdGhyZWUgdGhpbmdzIHRoYXQgYXJlIGFsbCBmYWxzZSBhdCBgbm93YC4KCS8vIEVhY2ggaXMgYXNzZXJ0ZWQgaW5kaXZpZHVhbGx5IHNvIGEgZnV0dXJlIGNoYW5nZSBicmVha3MgdGhlIHNwZWNpZmljCgkvLyBjbGFpbSByYXRoZXIgdGhhbiBhIGx1bXAuCglpZiBhLlRlcm1zLlBlclBlcmlvZCAhPSAyMCB7CgkJdC5FcnJvcmYoIkFsbG93YW5jZS5UZXJtcy5QZXJQZXJpb2Q6IGdvdCAlZCwgd2FudCB0aGUgU1VQRVJTRURFRCAyMCAiKwoJCQkiLS0gdGhlIGZpZWxkIGlzIHRoZSBsYXN0LXdyaXR0ZW4gcmVjb3JkIiwgYS5UZXJtcy5QZXJQZXJpb2QpCgl9CglpZiAhYS5IYXNQZW5kaW5nIHsKCQl0LkVycm9yZigiQWxsb3dhbmNlLkhhc1BlbmRpbmc6IGdvdCBmYWxzZSwgd2FudCB0cnVlIC0tIHRoZSBwZW5kaW5nICIgKwoJCQkiZmxhZyBzdGF5cyBzZXQgYWZ0ZXIgaXRzIGJvdW5kYXJ5IHVudGlsIHRoZSBuZXh0IHdyaXRlLCBzbyBhICIgKwoJCQkiY29uc3VtZXIgcmVwb3J0cyBhbiBhbWVuZG1lbnQgYXMgJ3F1ZXVlZCcgdGhhdCBpcyBhbHJlYWR5IGxpdmUiKQoJfQoJaWYgYS5QZW5kaW5nLlBlclBlcmlvZCAhPSA4MCB7CgkJdC5FcnJvcmYoIkFsbG93YW5jZS5QZW5kaW5nLlBlclBlcmlvZDogZ290ICVkLCB3YW50IDgwIiwKCQkJYS5QZW5kaW5nLlBlclBlcmlvZCkKCX0KCWlmIGEuV2luZG93SW5kZXggIT0gMCB7CgkJdC5FcnJvcmYoIkFsbG93YW5jZS5XaW5kb3dJbmRleDogZ290ICVkLCB3YW50IHRoZSBMRUZUIHdpbmRvdyAwIiwKCQkJYS5XaW5kb3dJbmRleCkKCX0KCWlmIGEuU3BlbnRXaW5kb3cgIT0gMzAgewoJCXQuRXJyb3JmKCJBbGxvd2FuY2UuU3BlbnRXaW5kb3c6IGdvdCAlZCwgd2FudCB0aGUgbGVmdCB3aW5kb3cncyAzMCIsCgkJCWEuU3BlbnRXaW5kb3cpCgl9CgoJLy8gVGhlIGRpc2FncmVlbWVudCwgc3RhdGVkIGFzIHRoZSBvbmUgYXNzZXJ0aW9uIGEgY29uc3VtZXIgY2FyZXMgYWJvdXQ6CgkvLyBhIGRpc3BsYXkgcGF0aCByZWFkaW5nIHRoZSBmaWVsZCBwdWJsaXNoZXMgYSBjYXAgb2YgMjAgb3ZlciB0aGUgdmVyeQoJLy8gd2luZG93IGluIHdoaWNoIHRoZSBlbmZvcmNlciBqdXN0IGhvbm9yZWQgODAgLS0gYSBmYWN0b3Igb2YgZm91ciwgYW5kCgkvLyBpbiB0aGUgZGFuZ2Vyb3VzIGRpcmVjdGlvbiAodGhlIG93bmVyIGlzIHNob3duIExFU1MgYXV0aG9yaXR5IHRoYW4gdGhlCgkvLyBkZWxlZ2F0ZSBhY3R1YWxseSBob2xkcykuCglpZiBhLlRlcm1zLlBlclBlcmlvZCA+PSA4MCB7CgkJdC5GYXRhbGYoIlRlcm1zLlBlclBlcmlvZCBpcyAlZCwgd2hpY2ggbm8gbG9uZ2VyIHVuZGVyc3RhdGVzIHRoZSAiKwoJCQkiaG9ub3JlZCBjYXAgb2YgODA6IHRoaXMgdGVzdCBpcyBkZXNjcmliaW5nIGJlaGF2aW91ciB0aGUgIisKCQkJInBhY2thZ2UgaGFzIHN0b3BwZWQgaGF2aW5nIiwgYS5UZXJtcy5QZXJQZXJpb2QpCgl9Cn0KCmZ1bmMgVGVzdFRoZVN0YWxlUmVjb3JkU2VsZkhlYWxzT25UaGVOZXh0V3JpdGUodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgaGF6YXJkIGlzIGJvdW5kZWQ6IGl0IGxhc3RzIGZyb20gYSBib3VuZGFyeSB1bnRpbCB0aGUgbmV4dCB3cml0ZSwKCS8vIGFuZCBhbnkgd3JpdGUgZW5kcyBpdC4gTWVhc3VyZWQgb24gY2hhaW4gLS0gYWZ0ZXIgdGhlIGRyYXcgYXQgMTg5NDM2LAoJLy8gR3JhbnRJbmZvIHJlcG9ydGVkIDgwMDAwMCBhbmQgUGVuZGluZ1Rlcm1zIHJlcG9ydGVkIG5vdGhpbmcgcXVldWVkLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAsIDMwKQoJaWYgXywgZXJyIDo9IGIuQW1lbmQoaWQsIGFsaWNlLCAzMCwgVGVybXN7UGVyUGVyaW9kOiA4MCwgUGVyaW9kTGVuZ3RoOiBkYXl9KTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCgljb25zdCBub3cgPSBpbnQ2NCgzMTUwKQoJbXVzdFNwZW5kKHQsIGIsIGlkLCBub3csIDUpCgoJYSwgZXJyIDo9IGIuR2V0KGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkdldDogJXYiLCBlcnIpCgl9CglpZiBhLlRlcm1zLlBlclBlcmlvZCAhPSA4MCB7CgkJdC5FcnJvcmYoImFmdGVyIGEgd3JpdGUsIFRlcm1zLlBlclBlcmlvZDogZ290ICVkLCB3YW50IDgwIiwgYS5UZXJtcy5QZXJQZXJpb2QpCgl9CglpZiBhLkhhc1BlbmRpbmcgewoJCXQuRXJyb3JmKCJhZnRlciBhIHdyaXRlLCBIYXNQZW5kaW5nIHNob3VsZCBiZSBjbGVhcmVkIikKCX0KCWlmIGEuV2luZG93SW5kZXggIT0gMzEgewoJCXQuRXJyb3JmKCJhZnRlciBhIHdyaXRlLCBXaW5kb3dJbmRleDogZ290ICVkLCB3YW50IDMxIiwgYS5XaW5kb3dJbmRleCkKCX0KCWlmIGEuU3BlbnRXaW5kb3cgIT0gNSB7CgkJdC5FcnJvcmYoImFmdGVyIGEgd3JpdGUsIFNwZW50V2luZG93OiBnb3QgJWQsIHdhbnQgNSIsIGEuU3BlbnRXaW5kb3cpCgl9Cn0KCmZ1bmMgVGVzdFJlbWFpbmluZ0lzVGhlT25seUV4cG9ydGVkTGl2ZVZpZXcodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgcmVtZWR5IGEgZnV0dXJlIHZlcnNpb24gd2FudHMgaXMgYW4gZXhwb3J0ZWQgbGl2ZS1yZXNvbHZlZCB2aWV3IC0tCgkvLyBBbGxvd2FuY2UuQXQobm93KSwgc2F5IC0tIHNvIGEgY29uc3VtZXIncyBkaXNwbGF5IHBhdGggY2Fubm90IHJlYWQgYQoJLy8gc3RhbGUgZmllbGQgYnkgYWNjaWRlbnQuCgkvLwoJLy8gVEhJUyBURVNUIERPRVMgTk9UIEVORk9SQ0UgVEhBVCBBQlNFTkNFLCBhbmQgdGhlIGZpcnN0IGRyYWZ0IG9mIHRoaXMKCS8vIGNvbW1lbnQgY2xhaW1lZCBpdCBkaWQgKCJpdCBmYWlscyB0aGUgbW9tZW50IHN1Y2ggYSBtZXRob2QgaXMgYWRkZWQiKS4KCS8vIFRoYXQgd2FzIGZhbHNlOiBub3RoaW5nIGJlbG93IHdvdWxkIGZhaWwgaWYgQXQgd2VyZSBhZGRlZCwgYW5kIEdubwoJLy8gb2ZmZXJzIG5vIHJlZmxlY3Rpb24gb3ZlciBhIG1ldGhvZCBzZXQgdG8gd3JpdGUgdGhlIGNoZWNrIHdpdGguIFRoZQoJLy8gY2xhaW0gaXMgcmVtb3ZlZCByYXRoZXIgdGhhbiByZXdvcmRlZCwgYmVjYXVzZSBhIHRlc3Qgd2hvc2UgY29tbWVudAoJLy8gcHJvbWlzZXMgYSBndWFyZCBpdCBkb2VzIG5vdCBoYXZlIGlzIHdvcnNlIHRoYW4gbm8gdGVzdCAtLSBhIHJlYWRlcgoJLy8gc3RvcHMgbG9va2luZywgd2hpY2ggaXMgdGhlIMKnN2EvQzExIGZhaWx1cmUgaW4gbWluaWF0dXJlLgoJLy8KCS8vIFdoYXQgaXQgYWN0dWFsbHkgZG9lczogcGluIHRoZSB0d28gbGl2ZS1yZXNvbHZpbmcgZG9vcnMgdGhhdCBETyBleGlzdCwKCS8vIHNvIGEgY2hhbmdlIHRvIGVpdGhlciBicmVha3MgaGVyZS4gVGhlIGRlbGliZXJhdGVuZXNzIG9mIEF0J3MgYWJzZW5jZQoJLy8gbGl2ZXMgaW4gcHJvc2UgKG9ueXgvcC9zcGVuZGJvb2svTUFJTk5FVF9BU1NFU1NNRU5ULm1kKSBhbmQgbm93aGVyZQoJLy8gZWxzZTsgdGhhdCBpcyBhIGRvY3VtZW50ZWQgZ2FwLCBub3QgYW4gZW5mb3JjZWQgb25lLgoJYiwgaWQgOj0gb3BlbkRlZmF1bHQodCwgMCkKCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAsIDMwKQoKCS8vIElzRXhwaXJlZCByZXNvbHZlcyBsaXZlLiBJbiB2MSB0aGlzIGNvbW1lbnQgcmVhZCAiSXNFeHBpcmVkIHJlc29sdmVzCgkvLyBsaXZlLCBidXQgZXhwaXJ5IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgd2luZG93LCBzbyBpdCBpcyBub3QgYWZmZWN0ZWQKCS8vIGJ5IHRoZSBoYXphcmQiIC0tIGFuZCB0aGUgc2Vjb25kIGhhbGYgd2FzIEZBTFNFIGFib3V0IHRoZSBwYWNrYWdlIGl0CgkvLyB3YXMgd3JpdHRlbiBpbi4gRXhwaXJ5IERJRCBkZXBlbmQgb24gdGhlIHdpbmRvdywgYmVjYXVzZSBhIHBlbmRpbmcKCS8vIGFtZW5kbWVudCBjYW4gbW92ZSBFeHBpcmVzQXQgYW5kIHYxJ3MgSXNFeHBpcmVkIHJlYWQgdGhlIHN0b3JlZCBmaWVsZAoJLy8gcmF0aGVyIHRoYW4gYXNraW5nIGF0KCkuIFRoYXQgaXMgWTIsIHN0YXRlZCBpbiB0aGUgYWZmaXJtYXRpdmUsIGluIGEKCS8vIHRlc3QgY29tbWVudC4gSXQgaXMgY29ycmVjdGVkIHJhdGhlciB0aGFuIGRlbGV0ZWQsIGJlY2F1c2UgdGhlCgkvLyBzZW50ZW5jZSBpcyBhIHJlY29yZCBvZiBob3cgdGhlIGRlZmVjdCBzdGF5ZWQgaW52aXNpYmxlOiB0aGUgY2xhaW0KCS8vIHJlYWQgbGlrZSBhIHJlYXNvbiBub3QgdG8gbG9vay4KCS8vCgkvLyBUaGlzIGNhc2UgaXMgdW5hZmZlY3RlZCBlaXRoZXIgd2F5IC0tIHRoZSBhbGxvd2FuY2UgaGFzIG5vIGV4cGlyeSBhbmQKCS8vIG5vIHBlbmRpbmcgZXhwaXJ5IC0tIHdoaWNoIGlzIGV4YWN0bHkgd2h5IGl0IG5ldmVyIGNhdWdodCBhbnl0aGluZy4KCS8vIFRoZSBjbGFpbSBpcyBlbmZvcmNlZCBpbiB0aGUgWTIgcmVncmVzc2lvbiBibG9jayBhdCB0aGUgYm90dG9tIG9mCgkvLyB0aGlzIGZpbGUuCglpZiBhLCBfIDo9IGIuR2V0KGlkKTsgYS5Jc0V4cGlyZWQoMzE1MCkgewoJCXQuRXJyb3JmKCJhbiBhbGxvd2FuY2Ugd2l0aCBubyBleHBpcnkgaXMgbmV2ZXIgZXhwaXJlZCIpCgl9CgkvLyBSZW1haW5pbmcgcmVzb2x2ZXMgbGl2ZSBhbmQgSVMgYWZmZWN0ZWQgLS0gaXQgaXMgdGhlIHdob2xlIHJlbWVkeSBhCgkvLyBjb25zdW1lciBoYXMgdG9kYXkuCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDMxNTApOyBnb3QgIT0gNTAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgYWNyb3NzIGEgYm91bmRhcnk6IGdvdCAlZCwgd2FudCB0aGUgcmVmaWxsZWQgNTAiLCBnb3QpCgl9CglpZiBhLCBfIDo9IGIuR2V0KGlkKTsgYS5SZW1haW5pbmcoMzE1MCkgIT0gNTAgewoJCXQuRXJyb3JmKCJBbGxvd2FuY2UuUmVtYWluaW5nIG11c3QgYWdyZWUgd2l0aCBCb29rLlJlbWFpbmluZyIpCgl9Cn0KCi8vIC0tLSBZMiByZWdyZXNzaW9uOiB0aGUgZXhwaXJ5IGlzIHJlc29sdmVkIExJVkUsIGluIGJvdGggZGlyZWN0aW9ucyAtLS0tLS0tCi8vCi8vIEVWRVJZIGNhc2UgYmVsb3cgY2FycmllcyBpdHMgb3duICJ2MToiIGxpbmUgc2F5aW5nIHdoZXRoZXIgaXQgZmFpbHMgb3IgcGFzc2VzCi8vIGFnYWluc3QgdjEsIGFuZCB3aGVyZSBpdCBmYWlscywgdjEncyB3cm9uZyBhbnN3ZXIgaXMgd3JpdHRlbiBvdXQgYmVzaWRlIHRoZQovLyBhc3NlcnRpb24uIFRoZSBmaXJzdCBkcmFmdCBvZiB0aGlzIGhlYWRlciBpbnN0ZWFkIGNsYWltZWQgImV2ZXJ5IGNhc2UgYmVsb3cKLy8gRkFJTFMgYWdhaW5zdCB2MSB1bmxlc3MgaXQgaXMgbWFya2VkIG90aGVyd2lzZSIgLS0gb25lIGJsYW5rZXQgYWRqZWN0aXZlIG92ZXIKLy8gYSB3aG9sZSBzdWJqZWN0IHNldCwgd2hpY2ggaXMgdGhlIGRlZmVjdCB0aGlzIHJlcG8ga2VlcHMgY2F0Y2hpbmcgaW4gaXRzIG93bgovLyBwcm9zZS4gTWVhc3VyZWQsIGl0IHdhcyB3cm9uZyBhYm91dCBmaXZlIG9mIHRoZSBmb3VydGVlbjogYSBwcmVzZXJ2YXRpb24gY2FzZQovLyAoYXV0aG9yaXphdGlvbiB1bmNoYW5nZWQsIHRoZSB6ZXJvIHZhbHVlIHVuY2hhbmdlZCwgdGhlIHByZS1hbmNob3IgZ3VhcmQsIHRoZQovLyBwZW5kaW5nIHRlcm1zIG5vdCBwcm9tb3RlZCBlYXJseSkgaXMgU1VQUE9TRUQgdG8gcGFzcyBhZ2FpbnN0IHYxLCBhbmQgcmVhZGluZwovLyB0aGUgaGVhZGVyIHdvdWxkIGhhdmUgbWFkZSBhIHJlYWRlciBleHBlY3QgaXQgdG8gZmFpbCBhbmQgZGlzdHJ1c3QgdGhlIHN1aXRlLgovLwovLyBUaGUgc3BsaXQgaXMgbm90IHJlc3RhdGVkIGhlcmU7IGl0IGlzIHJlLWRlcml2YWJsZSwgYW5kIHRoZSBwcm9iZSB0aGF0Ci8vIGRlcml2ZXMgaXQgaXMgdGhlIG5vbi12YWN1aXR5IGNvbnRyb2wgZm9yIHRoaXMgd2hvbGUgYmxvY2sgLS0gYSByZWdyZXNzaW9uCi8vIHRlc3QgdGhhdCBwYXNzZXMgYWdhaW5zdCB0aGUgc291cmNlIGl0IHdhcyB3cml0dGVuIHRvIGluZGljdCBwcm92ZXMgbm90aGluZzoKLy8KLy8JbWtkaXIgL3RtcC92MXByb2JlICYmIGNkIC90bXAvdjFwcm9iZQovLwljcCA8cmVwbz4vb255eC9wL3NwZW5kYm9vay9zcGVuZGJvb2suZ25vIC4gICAgICAgICAgIyB0aGUgREVQTE9ZRUQgYnl0ZXMKLy8JY3AgPHJlcG8+L29ueXgvcC9zcGVuZGJvb2svdjIvc3BlbmRib29rX3Rlc3QuZ25vIC4gICMgdGhpcyBmaWxlCi8vCWNwIDxyZXBvPi9vbnl4L3Avc3BlbmRib29rL3YyL2dub21vZC50b21sIC4KLy8JZ25vIHRlc3QgLXYgLiAgICAgICMgZXhwZWN0IGV4aXQgMTsgcmVhZCBXSElDSCBuYW1lcyBmYWlsCi8vCi8vIFRoZSBibG9jayBpcyBvcmdhbmlzZWQgYnkgdGhlIHR3byBkaXJlY3Rpb25zIHRoZSBzdGFsZSByZWFkIHBvaW50ZWQ6Ci8vCi8vCVVOREVSLWF1dGhvcml6YXRpb24gIGFuIGV4dGVuc2lvbiBvciBhIHJlbW92YWwgb2YgdGhlIGV4cGlyeSBpcyBhY2NlcHRlZCwKLy8JICAgICAgICAgICAgICAgICAgICAgcXVldWVkLCBjb21lcyBpbnRvIGZvcmNlIGF0IHRoZSBib3VuZGFyeSwgYW5kIGlzIHRoZW4KLy8JICAgICAgICAgICAgICAgICAgICAgaWdub3JlZCBhdCB0aGUgT0xEIGV4cGlyeSAtLSBzbyB0aGUgb3duZXIncyBvd24KLy8JICAgICAgICAgICAgICAgICAgICAgYW1lbmRtZW50IGlzIGRpc2NhcmRlZCBhbmQgYSB0aGlyZCBwYXJ0eSBtYXkgUmVhcC4KLy8JT1ZFUi1hdXRob3JpemF0aW9uICAgYW4gYW1lbmRtZW50IHRoYXQgUkFJU0VTIFBlclBlcmlvZCBhbmQgTE9XRVJTCi8vCSAgICAgICAgICAgICAgICAgICAgIEV4cGlyZXNBdCBxdWV1ZXMgYXMgYSB3aG9sZSwgYW5kIHBhc3QgdGhlIGJvdW5kYXJ5IHRoZQovLwkgICAgICAgICAgICAgICAgICAgICByYWlzZWQgY2FwIGlzIGhvbm91cmVkIHdoaWxlIHRoZSBsb3dlcmVkIGV4cGlyeSBpcwovLwkgICAgICAgICAgICAgICAgICAgICBub3QgLS0gYSBkcmF3IHBhc3QgYW4gZXhwaXJ5IHRoZSBvd25lciBzZXQuCgovLyBvcGVuRXh0ZW5kYWJsZSBvcGVucyB0aGUgc2hhcGUgZXZlcnkgZXh0ZW5zaW9uIGNhc2UgYmVsb3cgbmVlZHM6IGEgd2luZG93Ci8vIG9mIDEwMCB3aXRoIGEgY2FwIG9mIDUwLCBleHBpcmluZyBhdCAzMDAsIHNvIHRoZSBuZXh0IGJvdW5kYXJ5ICgxMDApIGxhbmRzCi8vIHN0cmljdGx5IGJlZm9yZSB0aGUgZXhwaXJ5IGFuZCBhIGxvb3NlbmluZyBpcyB0aGVyZWZvcmUgcXVldWVhYmxlLgpmdW5jIG9wZW5FeHRlbmRhYmxlKHQgKnRlc3RpbmcuVCkgKCpCb29rLCB1aW50NjQpIHsKCXQuSGVscGVyKCkKCWIgOj0gTXVzdE5ldyg0KQoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAzICogZGF5fSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCXJldHVybiBiLCBpZAp9CgovLyBxdWV1ZUV4dGVuc2lvbiByYWlzZXMgUGVyUGVyaW9kIHRvIDgwIGFuZCBwdXNoZXMgRXhwaXJlc0F0IG91dCB0byAxMDAwLgovLyBCb3RoIG1vdmVzIGFyZSBsb29zZXIsIHNvIHRoZSB3aG9sZSBhbWVuZG1lbnQgcXVldWVzOyByYWlzaW5nIFBlclBlcmlvZAovLyBhbG9uZ3NpZGUgdGhlIGV4cGlyeSBpcyB3aGF0IG1ha2VzICJ0aGUgcGVuZGluZyB0ZXJtcyBhcmUgbm90IGluIGZvcmNlCi8vIHlldCIgb2JzZXJ2YWJsZSBiZWZvcmUgdGhlIGJvdW5kYXJ5LCB3aGVyZSB0aGUgZXhwaXJ5IGFsb25lIGlzIG5vdC4KZnVuYyBxdWV1ZUV4dGVuc2lvbih0ICp0ZXN0aW5nLlQsIGIgKkJvb2ssIGlkIHVpbnQ2NCwgbm93IGludDY0KSB7Cgl0LkhlbHBlcigpCglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIG5vdywKCQlUZXJtc3tQZXJQZXJpb2Q6IDgwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAxMCAqIGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQoZXh0ZW5kKTogJXYiLCBlcnIpCgl9CglpZiBhcHBsaWVkIHsKCQl0LkZhdGFsZigiYW4gZXh0ZW5zaW9uIG9mIHRoZSBleHBpcnkgYXBwbGllZCBpbW1lZGlhdGVseTsgaXQgaXMgIiArCgkJCSJMT09TRVIgYW5kIHRpZ2h0ZXJPckVxdWFsVG8gbXVzdCBxdWV1ZSBpdCIpCgl9Cn0KCmZ1bmMgVGVzdEFuRXh0ZW5zaW9uQ2FuT25seUV2ZXJCZVF1ZXVlZE5vdEFwcGxpZWQodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgcHJlbWlzZSBvZiB0aGUgd2hvbGUgZGVmZWN0LCBhc3NlcnRlZCBmaXJzdCBiZWNhdXNlIHdpdGhvdXQgaXQKCS8vIHRoZXJlIHdvdWxkIGJlIGEgd29ya2Fyb3VuZDogdGhlcmUgaXMgTk8gd2F5IHRvIGV4dGVuZCBhbiBleHBpcnkKCS8vIGltbWVkaWF0ZWx5LiB0aWdodGVyT3JFcXVhbFRvIHJlYWRzIEV4cGlyZXNBdCAwIGFzIHVubGltaXRlZCwgc28gYQoJLy8gbGF0ZXIgZXhwaXJ5IGlzIGxvb3NlciBpbiB0aGF0IGRpbWVuc2lvbiBhbmQgYSBsYXRlci1vci1yZW1vdmVkIGV4cGlyeQoJLy8gaXMgdGhlIG9ubHkga2luZCBvZiBleHBpcnkgY2hhbmdlIHRoYXQgY2FuIGJlIHF1ZXVlZCBhdCBhbGwuCgkvLwoJLy8gdjE6IFBBU1NFUyAtLSBpdCBpcyBhYm91dCB0aWdodGVyT3JFcXVhbFRvLCB3aGljaCB0aGUgZml4IGRvZXMgbm90CgkvLyB0b3VjaC4gSXQgaXMgaGVyZSBzbyBhIHJlYWRlciBjYW5ub3QgY29uY2x1ZGUgdGhlIHF1ZXVlaW5nIHBhdGggd2FzCgkvLyBhdm9pZGFibGUuCglsaXZlIDo9IFRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDMgKiBkYXl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgW11zdHJ1Y3QgewoJCW5hbWUgc3RyaW5nCgkJdG8gICBUZXJtcwoJfXsKCQl7InB1c2hlZCBvdXQiLCBUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiA0ICogZGF5fX0sCgkJeyJyZW1vdmVkIiwgVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMH19LAoJfSB7CgkJaWYgdGMudG8udGlnaHRlck9yRXF1YWxUbyhsaXZlKSB7CgkJCXQuRXJyb3JmKCIlczogdGlnaHRlck9yRXF1YWxUbyBzYXlzIGFuIGV4cGlyeSAlcyBpcyB0aWdodGVyOyBpdCBpcyAiKwoJCQkJImxvb3NlciwgYW5kIHRyZWF0aW5nIGl0IGFzIHRpZ2h0ZXIgd291bGQgbGV0IGFuIG93bmVyIHVuZG8gYW4gIisKCQkJCSJleHBpcnkgbWlkLXdpbmRvdyIsIHRjLm5hbWUsIHRjLm5hbWUpCgkJfQoJfQp9CgpmdW5jIFRlc3RUaGVPbGRFeHBpcnlJc05ldmVyUmVhY2hhYmxlV2hpbGVTdGlsbEluRm9yY2UodCAqdGVzdGluZy5UKSB7CgkvLyBBIHN0cnVjdHVyYWwgY29uc2VxdWVuY2Ugb2YgQW1lbmQncyBxdWV1ZWFiaWxpdHkgZ3VhcmQsIGFuZCB0aGUgcmVhc29uCgkvLyB0aGUgc3RhbGUgcmVhZCBoYWQgbm8gbGVnaXRpbWF0ZSB3aW5kb3cgdG8gYmUgcmlnaHQgaW46IGEgbG9vc2VuaW5nIGlzCgkvLyBvbmx5IHF1ZXVlZCB3aGVuIHRoZSBuZXh0IGJvdW5kYXJ5IGFycml2ZXMgU1RSSUNUTFkgYmVmb3JlIHRoZSBjdXJyZW50CgkvLyBleHBpcnkgKG5iID49IEV4cGlyZXNBdCBpcyByZWZ1c2VkKS4gU28gYnkgdGhlIHRpbWUgdGhlIGNsb2NrIHJlYWNoZXMKCS8vIHRoZSBvbGQgZXhwaXJ5LCB0aGUgYm91bmRhcnkgaGFzIGFscmVhZHkgcGFzc2VkIGFuZCB0aGUgcGVuZGluZyB0ZXJtcwoJLy8gYXJlIGFscmVhZHkgdGhlIHRlcm1zIGluIGZvcmNlLiB2MSBjb25zdWx0ZWQgdGhlIG9sZCBleHBpcnkgYXQgYW4KCS8vIGluc3RhbnQgd2hlcmUgaXQgd2FzLCB3aXRob3V0IGV4Y2VwdGlvbiwgc3VwZXJzZWRlZC4KCS8vCgkvLyB2MTogUEFTU0VTIC0tIGl0IGlzIEFtZW5kJ3MgZ3VhcmQsIHdoaWNoIHRoZSBmaXggZG9lcyBub3QgdG91Y2guCgliIDo9IE11c3ROZXcoNCkKCS8vIEV4cGlyeSBhdCA1MCwgaW5zaWRlIHdpbmRvdyAwLCBzbyB0aGUgbmV4dCBib3VuZGFyeSAoMTAwKSBpcyBwYXN0IGl0LgoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiBkYXkgLyAyfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDgwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAxMCAqIGRheX0pOyBlcnIgIT0gRXJyTm9Cb3VuZGFyeSB7CgkJdC5GYXRhbGYoInF1ZXVlaW5nIGFnYWluc3QgYW4gZXhwaXJ5IGluc2lkZSB0aGUgY3VycmVudCB3aW5kb3c6IGdvdCAldiwgIisKCQkJIndhbnQgRXJyTm9Cb3VuZGFyeSIsIGVycikKCX0KfQoKZnVuYyBUZXN0UGVuZGluZ1Rlcm1zQXJlTm90SW5Gb3JjZUJlZm9yZVRoZUJvdW5kYXJ5KHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIG90aGVyIGhhbGYgb2YgdGhlIGZpeCdzIGNvcnJlY3RuZXNzOiByb3V0aW5nIElzRXhwaXJlZCB0aHJvdWdoIGF0KCkKCS8vIG11c3Qgbm90IHByb21vdGUgYSBwZW5kaW5nIGFtZW5kbWVudCBFQVJMWS4gV2luZG93IDAgc3RpbGwgcnVucyBvbiB0aGUKCS8vIG9sZCB0ZXJtcyBpbiBldmVyeSBkaW1lbnNpb24uCgkvLwoJLy8gdjE6IFBBU1NFUyAtLSBhbmQgdGhhdCBpcyB0aGUgcG9pbnQuIFRoaXMgaXMgYSBQUkVTRVJWQVRJT04gY2FzZTogaXQKCS8vIHBpbnMgdGhlIGJlaGF2aW91ciB0aGUgZml4IG11c3Qgbm90IGRpc3R1cmIsIHNvIGl0IGlzIHN1cHBvc2VkIHRvIGhvbGQKCS8vIG9uIGJvdGggc2lkZXMuIEEgcmVhZGVyIHdobyBleHBlY3RzIGl0IHRvIGZhaWwgYWdhaW5zdCB2MSBoYXMgbWlzcmVhZAoJLy8gd2hpY2ggaGFsZiBvZiB0aGUgZml4IGl0IGNvdmVycy4KCWIsIGlkIDo9IG9wZW5FeHRlbmRhYmxlKHQpCglxdWV1ZUV4dGVuc2lvbih0LCBiLCBpZCwgMTApCgoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCA1MCk7IGdvdCAhPSA1MCB7CgkJdC5FcnJvcmYoIlJlbWFpbmluZyBpbnNpZGUgd2luZG93IDA6IGdvdCAlZCwgd2FudCB0aGUgT0xEIGNhcCA1MCIsIGdvdCkKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgZGF5LTEpOyBnb3QgIT0gNTAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgYXQgdGhlIGxhc3QgaW5zdGFudCBvZiB3aW5kb3cgMDogZ290ICVkLCB3YW50IDUwIiwgZ290KQoJfQoJcmVmdXNlKHQsIGIsIGlkLCA1MCwgNTEsIEVyclBlcmlvZEV4Y2VlZGVkKQoJYSwgXyA6PSBiLkdldChpZCkKCWlmIGEuVGVybXMuRXhwaXJlc0F0ICE9IDMqZGF5IHsKCQl0LkVycm9yZigidGhlIGxpdmUgZXhwaXJ5IGluIHdpbmRvdyAwOiBnb3QgJWQsIHdhbnQgdGhlIE9MRCAlZCIsCgkJCWEuVGVybXMuRXhwaXJlc0F0LCAzKmRheSkKCX0KCWlmIGEuSXNFeHBpcmVkKGRheSAtIDEpIHsKCQl0LkVycm9yKCJub3QgZXhwaXJlZCB5ZXQgYXQgdGhlIGxhc3QgaW5zdGFudCBvZiB3aW5kb3cgMCIpCgl9Cn0KCmZ1bmMgVGVzdFBlbmRpbmdUZXJtc1Rha2VFZmZlY3RFeGFjdGx5QXRUaGVCb3VuZGFyeSh0ICp0ZXN0aW5nLlQpIHsKCS8vIE9mZiBieSBvbmUgaGVyZSB3b3VsZCBlaXRoZXIgZGVsYXkgdGhlIGV4dGVuc2lvbiBieSBhIHdob2xlIHdpbmRvdyBvcgoJLy8gZ3JhbnQgaXQgYSB3aW5kb3cgZWFybHkuCgkvLwoJLy8gdjE6IFBBU1NFUyAtLSBSZW1haW5pbmcgYWxyZWFkeSByZXNvbHZlZCB0aHJvdWdoIGF0KCkgaW4gdjEsIHNvIHRoZQoJLy8gYm91bmRhcnkgYXJpdGhtZXRpYyB3YXMgbmV2ZXIgdGhlIGJyb2tlbiBwYXJ0LiBJc0V4cGlyZWQgd2FzLgoJYiwgaWQgOj0gb3BlbkV4dGVuZGFibGUodCkKCXF1ZXVlRXh0ZW5zaW9uKHQsIGIsIGlkLCAxMCkKCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIGRheS0xKTsgZ290ICE9IDUwIHsKCQl0LkVycm9yZigib25lIGluc3RhbnQgYmVmb3JlIHRoZSBib3VuZGFyeTogZ290ICVkLCB3YW50IDUwIiwgZ290KQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBkYXkpOyBnb3QgIT0gODAgewoJCXQuRXJyb3JmKCJBVCB0aGUgYm91bmRhcnk6IGdvdCAlZCwgd2FudCB0aGUgcGVuZGluZyA4MCIsIGdvdCkKCX0KfQoKZnVuYyBUZXN0QVF1ZXVlZEV4cGlyeUV4dGVuc2lvblN1cnZpdmVzVGhlT2xkRXhwaXJ5KHQgKnRlc3RpbmcuVCkgewoJLy8gVEhFIFkyIENBU0UuIE5vIHdyaXRlIG9mIGFueSBraW5kIGJldHdlZW4gcXVldWVpbmcgdGhlIGFtZW5kbWVudCBhbmQKCS8vIHRoZSBvbGQgZXhwaXJ5IC0tIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50LCBiZWNhdXNlIGFueSB3cml0ZSBwcm9tb3RlcwoJLy8gdGhlIHBlbmRpbmcgdGVybXMgaW50byB0aGUgcmVjb3JkIGFuZCBlbmRzIHRoZSBoYXphcmQuCgkvLwoJLy8gdjE6IEZBSUxTLiBBdCBub3c9MzAwOiBJc0V4cGlyZWQgcmVhZHMgdGhlIHN0b3JlZCBFeHBpcmVzQXQgb2YgMzAwLCByZXBvcnRzCgkvLyBFWFBJUkVELCBSZW1haW5pbmcgYW5zd2VycyAwIGFuZCBTcGVuZCByZXR1cm5zIEVyckV4cGlyZWQgLS0gb24gYW4KCS8vIGFsbG93YW5jZSB3aG9zZSBvd25lciBleHRlbmRlZCBpdCB0byAxMDAwIGFuZCB3YXMgdG9sZCAiYWNjZXB0ZWQiLgoJYiwgaWQgOj0gb3BlbkV4dGVuZGFibGUodCkKCXF1ZXVlRXh0ZW5zaW9uKHQsIGIsIGlkLCAxMCkKCgljb25zdCBvbGRFeHBpcnkgPSAzICogZGF5IC8vIDMwMAoJY29uc3QgbmV3RXhwaXJ5ID0gMTAgKiBkYXkKCglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5Jc0V4cGlyZWQob2xkRXhwaXJ5KSB7CgkJdC5GYXRhbGYoIklzRXhwaXJlZCglZCkgaXMgdHJ1ZTogdGhlIGV4dGVuc2lvbiB0byAlZCB3YXMgYWNjZXB0ZWQgYW5kICIrCgkJCSJxdWV1ZWQsIHRvb2sgZWZmZWN0IGF0IHRoZSBib3VuZGFyeSwgYW5kIGhhcyBiZWVuIGRpc2NhcmRlZCIsCgkJCW9sZEV4cGlyeSwgbmV3RXhwaXJ5KQoJfQoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBvbGRFeHBpcnkpOyBnb3QgIT0gODAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcoJWQpOiBnb3QgJWQsIHdhbnQgdGhlIGV4dGVuZGVkIHRlcm1zJyA4MCIsCgkJCW9sZEV4cGlyeSwgZ290KQoJfQoJLy8gRW5mb3JjZW1lbnQgbXVzdCBhZ3JlZSB3aXRoIHRoZSB2aWV3LCB3aGljaCBpcyB0aGUgaGFsZiB0aGF0IG1vdmVzIHZhbHVlLgoJaWYgZXJyIDo9IGIuU3BlbmQoaWQsIGJvYiwgb2xkRXhwaXJ5LCA4MCk7IGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJTcGVuZCBhdCB0aGUgb2xkIGV4cGlyeSB3YXMgcmVmdXNlZDogJXYiLCBlcnIpCgl9CgkvLyBBbmQgdGhlIG5ldyBleHBpcnkgZG9lcyBiaXRlLCBhdCBleGFjdGx5IHRoZSByaWdodCBpbnN0YW50LgoJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBuZXdFeHBpcnktMSk7IGdvdCA9PSAwIHsKCQl0LkVycm9yKCJvbmUgaW5zdGFudCBiZWZvcmUgdGhlIG5ldyBleHBpcnkgdGhlIGFsbG93YW5jZSBtdXN0IGJlIGFsaXZlIikKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgbmV3RXhwaXJ5KTsgZ290ICE9IDAgewoJCXQuRXJyb3JmKCJSZW1haW5pbmcgYXQgdGhlIG5ldyBleHBpcnkgJWQ6IGdvdCAlZCwgd2FudCAwIiwgbmV3RXhwaXJ5LCBnb3QpCgl9CglyZWZ1c2UodCwgYiwgaWQsIG5ld0V4cGlyeSwgMSwgRXJyRXhwaXJlZCkKfQoKZnVuYyBUZXN0QVRoaXJkUGFydHlDYW5ub3RSZWFwQW5FeHRlbmRlZEFsbG93YW5jZSh0ICp0ZXN0aW5nLlQpIHsKCS8vIHYxOiBGQUlMUy4KCS8vCgkvLyBSZWFwIGlzIFBFUk1JU1NJT05MRVNTLCB3aGljaCBpcyBzb3VuZCBvbmx5IGJlY2F1c2UgYW4gZXhwaXJlZAoJLy8gYWxsb3dhbmNlIGNhbiBhdXRob3JpemUgbm90aGluZy4gVW5kZXIgdjEgdGhlIGV4dGVuZGVkIGFsbG93YW5jZSByZWFkCgkvLyBhcyBleHBpcmVkIGF0IDMwMCwgc28gdGhlIGp1c3RpZmljYXRpb24gZmFpbGVkIGFuZCBhbnkgY2FsbGVyIGNvdWxkCgkvLyBkZXN0cm95IGEgbGl2ZSBncmFudCAtLSB0aGUgb25lIHBsYWNlIHRoZSBkZWZlY3QgbGV0IGEgdGhpcmQgcGFydHkgYWN0LgoJYiwgaWQgOj0gb3BlbkV4dGVuZGFibGUodCkKCXF1ZXVlRXh0ZW5zaW9uKHQsIGIsIGlkLCAxMCkKCgljb25zdCBvbGRFeHBpcnkgPSAzICogZGF5CglpZiBlcnIgOj0gYi5SZWFwKGlkLCBvbGRFeHBpcnkpOyBlcnIgIT0gRXJyTm90RXhwaXJlZCB7CgkJdC5GYXRhbGYoIlJlYXAgYXQgdGhlIG9sZCBleHBpcnk6IGdvdCAldiwgd2FudCBFcnJOb3RFeHBpcmVkIC0tIGEgIisKCQkJInRoaXJkIHBhcnR5IGp1c3QgZGVsZXRlZCBhIGxpdmUgYWxsb3dhbmNlIiwgZXJyKQoJfQoJaWYgYi5Db3VudCgpICE9IDEgewoJCXQuRmF0YWxmKCJsaXZlIGNvdW50IGFmdGVyIHRoZSByZWZ1c2VkIFJlYXA6IGdvdCAlZCwgd2FudCAxIiwgYi5Db3VudCgpKQoJfQoJLy8gT25jZSBnZW51aW5lbHkgZXhwaXJlZCBpdCBpcyByZWFwYWJsZSwgd2hpY2ggaXMgdGhlIGJlaGF2aW91ciBSZWFwIGlzCgkvLyBmb3IgYW5kIG11c3Qgbm90IGJlIGxvc3QgYnkgZml4aW5nIHRoZSBwcmVkaWNhdGUuCglpZiBlcnIgOj0gYi5SZWFwKGlkLCAxMCpkYXkpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmVhcCBhdCB0aGUgcmVhbCBleHBpcnk6ICV2IiwgZXJyKQoJfQoJaWYgYi5Db3VudCgpICE9IDAgewoJCXQuRXJyb3JmKCJsaXZlIGNvdW50IGFmdGVyIHRoZSBSZWFwOiBnb3QgJWQsIHdhbnQgMCIsIGIuQ291bnQoKSkKCX0KfQoKZnVuYyBUZXN0RXhwaXJ5UmVtb3ZhbFN1cnZpdmVzVGhlT2xkRXhwaXJ5V2l0aE5vV3JpdGUodCAqdGVzdGluZy5UKSB7CgkvLyBFeHBpcmVzQXQgLT4gMCBpcyB0aGUgc2FtZSBjbGFzcyBhcyBhbiBleHRlbnNpb24gYnkgd2F5IG9mCgkvLyB0aWdodGVyT3JFcXVhbFRvJ3Mgb3RoZXIgYXJtOiAwIG1lYW5zIHVubGltaXRlZCwgc28gcmVtb3ZpbmcgdGhlIGV4cGlyeQoJLy8gaXMgTE9PU0VSIGFuZCBjYW4gb25seSBiZSBxdWV1ZWQuCgkvLwoJLy8gdjE6IEZBSUxTLiB2MSBjb3ZlcmVkIHRoaXMgb25seSBvbiB0aGUgV1JJVFRFTiBwYXRoIC0tIHNlZQoJLy8gVGVzdEFtZW5kRXhwaXJlc0F0WmVyb0lzTG9vc2VyTm90VGlnaHRlciBhYm92ZSwgd2hpY2ggc3BlbmRzIGF0IHRoZQoJLy8gYm91bmRhcnkgYW5kIHNvIHByb21vdGVzIHRoZSBwZW5kaW5nIHRlcm1zIGJlZm9yZSByZWFkaW5nIHRoZW0uIFdpdGggbm8KCS8vIHdyaXRlIHRoZSByZW1vdmFsIHdhcyBkaXNjYXJkZWQgYXQgdGhlIG9sZCBleHBpcnkgZXhhY3RseSBhcyBhbgoJLy8gZXh0ZW5zaW9uIHdhcywgYW5kICJubyB3cml0ZSIgaXMgdGhlIG9yZGluYXJ5IGNhc2UgZm9yIGFuIGFsbG93YW5jZQoJLy8gbm9ib2R5IGhhcyBkcmF3biBvbiB5ZXQuCgliIDo9IE11c3ROZXcoNCkKCWlkLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsCgkJVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMyAqIGRheX0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CglhcHBsaWVkLCBlcnIgOj0gYi5BbWVuZChpZCwgYWxpY2UsIDEwLAoJCVRlcm1ze1BlclBlcmlvZDogNTAsIFBlcmlvZExlbmd0aDogZGF5LCBFeHBpcmVzQXQ6IDB9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kKHJlbW92ZSBleHBpcnkpOiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRmF0YWwoInJlbW92aW5nIHRoZSBleHBpcnkgYXBwbGllZCBpbW1lZGlhdGVseSIpCgl9CgoJY29uc3Qgb2xkRXhwaXJ5ID0gMyAqIGRheQoJYSwgXyA6PSBiLkdldChpZCkKCWlmIGEuSXNFeHBpcmVkKG9sZEV4cGlyeSkgewoJCXQuRmF0YWxmKCJJc0V4cGlyZWQoJWQpIGlzIHRydWUgYWZ0ZXIgdGhlIGV4cGlyeSB3YXMgUkVNT1ZFRCIsIG9sZEV4cGlyeSkKCX0KCWlmIGdvdCA6PSBiLlJlbWFpbmluZyhpZCwgb2xkRXhwaXJ5KTsgZ290ICE9IDUwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nKCVkKTogZ290ICVkLCB3YW50IDUwIiwgb2xkRXhwaXJ5LCBnb3QpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCBvbGRFeHBpcnkpOyBlcnIgIT0gRXJyTm90RXhwaXJlZCB7CgkJdC5FcnJvcmYoIlJlYXAoJWQpOiBnb3QgJXYsIHdhbnQgRXJyTm90RXhwaXJlZCIsIG9sZEV4cGlyeSwgZXJyKQoJfQoJLy8gIk5vIGV4cGlyeSIgbWVhbnMgbm8gZXhwaXJ5LCBhdCBhbnkgaW5zdGFudCwgZm9yZXZlci4KCWlmIGEuSXNFeHBpcmVkKG1heEludDY0KSB7CgkJdC5FcnJvcigiYW4gYWxsb3dhbmNlIHdob3NlIGV4cGlyeSB3YXMgcmVtb3ZlZCBtdXN0IG5ldmVyIGV4cGlyZSIpCgl9CglpZiBlcnIgOj0gYi5TcGVuZChpZCwgYm9iLCAxMDAwKmRheSwgNTApOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiU3BlbmQgbG9uZyBhZnRlciB0aGUgcmVtb3ZlZCBleHBpcnk6ICV2IiwgZXJyKQoJfQoJLy8gVGhlIHN0b3JlZCByZWNvcmQgaXMgc3RpbGwgc3RhbGUgLS0gdGhlIGZpeCBkb2VzIG5vdCB3cml0ZSwgaXQgc3RvcHMKCS8vIFJFQURJTkcgdGhlIHN0YWxlIGZpZWxkLiBBc3NlcnRlZCBzbyB0aGUgbWVjaGFuaXNtIGlzIG5vdCBtaXN0YWtlbiBmb3IKCS8vIGEgbWlncmF0aW9uIG9mIHN0b3JlZCBzdGF0ZS4KCWEsIF8gPSBiLkdldChpZCkKCWlmIGEuVGVybXMuRXhwaXJlc0F0ICE9IDAgewoJCXQuRXJyb3JmKCJhZnRlciB0aGUgc3BlbmQgcHJvbW90ZWQgdGhlIHRlcm1zLCBFeHBpcmVzQXQ6IGdvdCAlZCwgd2FudCAwIiwKCQkJYS5UZXJtcy5FeHBpcmVzQXQpCgl9Cn0KCmZ1bmMgVGVzdEFRdWV1ZWRUaWdodGVuaW5nT2ZUaGVFeHBpcnlTdG9wc0F1dGhvcml6aW5nRHJhd3ModCAqdGVzdGluZy5UKSB7CgkvLyB2MTogRkFJTFMgLS0gVEhFIE1JUlJPUiBDQVNFLCBhbmQgdGhlIGRhbmdlcm91cyBkaXJlY3Rpb246IHYxCgkvLyBPVkVSLWF1dGhvcml6ZWQgaGVyZS4KCS8vCgkvLyB0aWdodGVyT3JFcXVhbFRvIGlzIHdlYWtseS10aWdodGVyIGluIEVWRVJZIGRpbWVuc2lvbiwgc28gYW4gYW1lbmRtZW50CgkvLyB0aGF0IHJhaXNlcyBQZXJQZXJpb2QgYW5kIGxvd2VycyBFeHBpcmVzQXQgaXMgbG9vc2VyIGFzIGEgd2hvbGUgYW5kCgkvLyBxdWV1ZXMgYXMgYSB3aG9sZS4gUGFzdCB0aGUgYm91bmRhcnksIHYxJ3MgYXQoKSBoYW5kZWQgU3BlbmQgdGhlIFJBSVNFRAoJLy8gY2FwIHdoaWxlIHYxJ3MgSXNFeHBpcmVkIHJlcG9ydGVkIHRoZSBhbGxvd2FuY2UgYWxpdmUgb24gdGhlIE9MRCwgbGF0ZXIKCS8vIGV4cGlyeSAtLSBzbyB0aGUgc3BlbmRlciBjb3VsZCBkcmF3LCBhdCB0aGUgbmV3IGhpZ2hlciBjYXAsIHBhc3QgYW4KCS8vIGV4cGlyeSB0aGUgb3duZXIgdGhlbXNlbHZlcyBoYWQgc2V0LiBObyBib3VuZCBpbiB0aGUgcGFja2FnZSBzdG9wcGVkCgkvLyBpdDogdGhlIGJvdW5kIGhhZCBtb3ZlZCBhbmQgdGhlIGdhdGUgaGFkIG5vdCBiZWVuIHRvbGQuCgliIDo9IE11c3ROZXcoNCkKCWlkLCBlcnIgOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsCgkJVGVybXN7UGVyUGVyaW9kOiAxMDAsIFBlcmlvZExlbmd0aDogMTAwMCwgRXhwaXJlc0F0OiA1MDAwfSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCWFwcGxpZWQsIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDIwMCwgUGVyaW9kTGVuZ3RoOiAxMDAwLCBFeHBpcmVzQXQ6IDMwMDB9KQoJaWYgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kKHJhaXNlIGNhcCwgcHVsbCBleHBpcnkgaW4pOiAldiIsIGVycikKCX0KCWlmIGFwcGxpZWQgewoJCXQuRmF0YWwoImEgbWl4ZWQtZGlyZWN0aW9uIGFtZW5kbWVudCBhcHBsaWVkIGltbWVkaWF0ZWx5IikKCX0KCgkvLyBCZWZvcmUgdGhlIG5ldyBleHBpcnkgdGhlIG93bmVyJ3MgaW50ZW50IGhvbGRzIGluIGZ1bGw6IHJhaXNlZCBjYXAuCglpZiBnb3QgOj0gYi5SZW1haW5pbmcoaWQsIDE1MDApOyBnb3QgIT0gMjAwIHsKCQl0LkVycm9yZigiUmVtYWluaW5nKDE1MDApOiBnb3QgJWQsIHdhbnQgdGhlIHJhaXNlZCAyMDAiLCBnb3QpCgl9CgoJLy8gQXQgYW5kIGFmdGVyIHRoZSBuZXcgZXhwaXJ5IGl0IGlzIGRlYWQsIGV2ZW4gdGhvdWdoIHRoZSByZWNvcmQgc3RpbGwKCS8vIHNheXMgNTAwMC4KCWEsIF8gOj0gYi5HZXQoaWQpCglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSA1MDAwIHsKCQl0LkZhdGFsZigicHJlY29uZGl0aW9uOiB0aGUgc3RvcmVkIGV4cGlyeSBzaG91bGQgc3RpbGwgYmUgdGhlIHN0YWxlICIrCgkJCSI1MDAwLCBnb3QgJWQiLCBhLlRlcm1zLkV4cGlyZXNBdCkKCX0KCWZvciBfLCBub3cgOj0gcmFuZ2UgW11pbnQ2NHszMDAwLCAzNTAwLCA0OTk5fSB7CgkJaWYgIWEuSXNFeHBpcmVkKG5vdykgewoJCQl0LkVycm9yZigiSXNFeHBpcmVkKCVkKSBpcyBmYWxzZTogdGhlIG93bmVyIHB1bGxlZCB0aGUgZXhwaXJ5IGluIHRvICIrCgkJCQkiMzAwMCBhbmQgdjEgd291bGQgYXV0aG9yaXplIGEgMjAwIGRyYXcgaGVyZSIsIG5vdykKCQl9CgkJaWYgZ290IDo9IGIuUmVtYWluaW5nKGlkLCBub3cpOyBnb3QgIT0gMCB7CgkJCXQuRXJyb3JmKCJSZW1haW5pbmcoJWQpOiBnb3QgJWQsIHdhbnQgMCIsIG5vdywgZ290KQoJCX0KCX0KCXJlZnVzZSh0LCBiLCBpZCwgMzUwMCwgMSwgRXJyRXhwaXJlZCkKCXJlZnVzZSh0LCBiLCBpZCwgMzUwMCwgMjAwLCBFcnJFeHBpcmVkKQoKCS8vIEl0IGlzIG5vdyBnZW51aW5lbHkgZGVhZCwgc28gUmVhcCdzIHBlcm1pc3Npb25sZXNzIGp1c3RpZmljYXRpb24gaG9sZHMKCS8vIGFuZCB0aGUgc2xvdCBpcyByZWNsYWltYWJsZS4KCWlmIGVyciA6PSBiLlJlYXAoaWQsIDM1MDApOyBlcnIgIT0gbmlsIHsKCQl0LkVycm9yZigiUmVhcCBvbiB0aGUgY29ycmVjdGx5LWV4cGlyZWQgYWxsb3dhbmNlOiAldiIsIGVycikKCX0KfQoKZnVuYyBUZXN0UmV2b2tlU3RpbGxXb3Jrc09uV2hhdFRoZUZpeERlY2xhcmVzRXhwaXJlZCh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSBvd25lcidzIGZhc3QgcmVtZWR5IG11c3Qgbm90IGJlIHRha2VuIGF3YXkgYnkgbWFraW5nIElzRXhwaXJlZAoJLy8gc3RyaWN0ZXIuIFJldm9rZSBjYXJyaWVzIG5vIElzRXhwaXJlZCBnYXRlLCBkZWxpYmVyYXRlbHksIGFuZCB0aGUKCS8vIG1pcnJvciBjYXNlIGlzIHRoZSBmaXJzdCBzdGF0ZSBpbiB3aGljaCB0aGUgZGlzdGluY3Rpb24gaXMgb2JzZXJ2YWJsZToKCS8vIHRoZSBhbGxvd2FuY2UgaXMgZXhwaXJlZCBvbiB0ZXJtcyB0aGF0IGFyZSBub3QgaW4gdGhlIHJlY29yZC4KCS8vCgkvLyB2MTogRkFJTFMsIG9uIGl0cyBTRUNPTkQgaGFsZiBvbmx5LiBSZXZva2UgcGFzc2VzIG9uIGJvdGggc2lkZXMgLS0gaXQgaGFzCgkvLyBubyBleHBpcnkgZ2F0ZSB0byBnZXQgd3JvbmcuIFRoZSBBbWVuZCBhc3NlcnRpb24gaXMgd2hhdCB2MSBtaXNzZXM6IGF0CgkvLyAzNTAwIHYxIHJlYWRzIHRoZSBzdG9yZWQgNTAwMCwgY2FsbHMgdGhlIGFsbG93YW5jZSBhbGl2ZSwgYW5kIGxldHMgdGhlCgkvLyBvd25lciBhbWVuZCBhIGdyYW50IHRoYXQgaXMgZGVhZCBvbiBpdHMgb3duIHF1ZXVlZCB0ZXJtcy4KCWIgOj0gTXVzdE5ldyg0KQoJaWQsIF8gOj0gYi5PcGVuKGFsaWNlLCBib2IsIDAsCgkJVGVybXN7UGVyUGVyaW9kOiAxMDAsIFBlcmlvZExlbmd0aDogMTAwMCwgRXhwaXJlc0F0OiA1MDAwfSkKCWlmIF8sIGVyciA6PSBiLkFtZW5kKGlkLCBhbGljZSwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDIwMCwgUGVyaW9kTGVuZ3RoOiAxMDAwLCBFeHBpcmVzQXQ6IDMwMDB9KTsgZXJyICE9IG5pbCB7CgkJdC5GYXRhbGYoIkFtZW5kOiAldiIsIGVycikKCX0KCWlmIGVyciA6PSBiLlJldm9rZShpZCwgYWxpY2UpOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiUmV2b2tlOiAldiIsIGVycikKCX0KCWlmIGIuQ291bnQoKSAhPSAwIHsKCQl0LkVycm9yZigibGl2ZSBjb3VudCBhZnRlciBSZXZva2U6IGdvdCAlZCwgd2FudCAwIiwgYi5Db3VudCgpKQoJfQoJLy8gQW1lbmQsIGJ5IGNvbnRyYXN0LCBJUyBnYXRlZCBvbiBleHBpcnkgYW5kIG5vdyBjb3JyZWN0bHkgcmVmdXNlcyAtLQoJLy8gdGhlIG93bmVyIGNhbm5vdCBhbWVuZCBhIGdyYW50IHRoYXQgaXMgZGVhZCBvbiBpdHMgb3duIHF1ZXVlZCB0ZXJtcy4KCWIyIDo9IE11c3ROZXcoNCkKCWlkMiwgXyA6PSBiMi5PcGVuKGFsaWNlLCBib2IsIDAsCgkJVGVybXN7UGVyUGVyaW9kOiAxMDAsIFBlcmlvZExlbmd0aDogMTAwMCwgRXhwaXJlc0F0OiA1MDAwfSkKCWlmIF8sIGVyciA6PSBiMi5BbWVuZChpZDIsIGFsaWNlLCAwLAoJCVRlcm1ze1BlclBlcmlvZDogMjAwLCBQZXJpb2RMZW5ndGg6IDEwMDAsIEV4cGlyZXNBdDogMzAwMH0pOyBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiQW1lbmQ6ICV2IiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IGIyLkFtZW5kKGlkMiwgYWxpY2UsIDM1MDAsCgkJVGVybXN7UGVyUGVyaW9kOiAxMCwgUGVyaW9kTGVuZ3RoOiAxMDAwLCBFeHBpcmVzQXQ6IDMwMDB9KTsgZXJyICE9IEVyckV4cGlyZWQgewoJCXQuRXJyb3JmKCJBbWVuZCBvbiBhIGNvcnJlY3RseS1leHBpcmVkIGFsbG93YW5jZTogZ290ICV2LCB3YW50IEVyckV4cGlyZWQiLAoJCQllcnIpCgl9Cn0KCmZ1bmMgVGVzdFRoZUZpeEdyYW50c05vQXV0aG9yaXR5VG9BbnlvbmVOZXcodCAqdGVzdGluZy5UKSB7CgkvLyBUaGUgZXh0ZW5kZWQgd2luZG93IGlzIGEgbmV3IHN0YXRlLCBzbyB0aGUgYXV0aG9yaXphdGlvbiBjaGVja3MgYXJlCgkvLyByZS1hc3NlcnRlZCBpbnNpZGUgaXQgcmF0aGVyIHRoYW4gYXNzdW1lZCB0byBjYXJyeS4KCS8vCgkvLyB2MTogUEFTU0VTIC0tIGEgUFJFU0VSVkFUSU9OIGNhc2UuIFRoZSBkZWZlY3Qgd2FzIG5ldmVyIGFuIGF1dGhvcml6YXRpb24KCS8vIGRlZmVjdCBmb3IgU3BlbmQsIEFtZW5kIG9yIFJldm9rZTsgaXQgd2FzIGEgbGl2ZW5lc3MgZGVmZWN0IHRoYXQgbGV0IGEKCS8vIHBlcm1pc3Npb25sZXNzIFJlYXAgYWN0IChjb3ZlcmVkIGFib3ZlKSBhbmQgbGV0IGFuIGF1dGhvcml6ZWQgc3BlbmRlcgoJLy8gZHJhdyBwYXN0IGFuIGV4cGlyeS4gTm9ib2R5IG5ldyBldmVyIGdhaW5lZCBhIHJpZ2h0LCBvbiBlaXRoZXIgc2lkZS4KCWIsIGlkIDo9IG9wZW5FeHRlbmRhYmxlKHQpCglxdWV1ZUV4dGVuc2lvbih0LCBiLCBpZCwgMTApCgljb25zdCBvbGRFeHBpcnkgPSAzICogZGF5CgoJaWYgZXJyIDo9IGIuU3BlbmQoaWQsIGNhcm9sLCBvbGRFeHBpcnksIDEpOyBlcnIgIT0gRXJyTm90U3BlbmRlciB7CgkJdC5FcnJvcmYoIlNwZW5kIGJ5IGEgc3RyYW5nZXI6IGdvdCAldiwgd2FudCBFcnJOb3RTcGVuZGVyIiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuU3BlbmQoaWQsIGFsaWNlLCBvbGRFeHBpcnksIDEpOyBlcnIgIT0gRXJyTm90U3BlbmRlciB7CgkJdC5FcnJvcmYoIlNwZW5kIGJ5IHRoZSBPV05FUjogZ290ICV2LCB3YW50IEVyck5vdFNwZW5kZXIiLCBlcnIpCgl9CglpZiBfLCBlcnIgOj0gYi5BbWVuZChpZCwgY2Fyb2wsIG9sZEV4cGlyeSwKCQlUZXJtc3tQZXJQZXJpb2Q6IDk5OSwgUGVyaW9kTGVuZ3RoOiBkYXl9KTsgZXJyICE9IEVyck5vdE93bmVyIHsKCQl0LkVycm9yZigiQW1lbmQgYnkgYSBzdHJhbmdlcjogZ290ICV2LCB3YW50IEVyck5vdE93bmVyIiwgZXJyKQoJfQoJaWYgXywgZXJyIDo9IGIuQW1lbmQoaWQsIGJvYiwgb2xkRXhwaXJ5LAoJCVRlcm1ze1BlclBlcmlvZDogOTk5LCBQZXJpb2RMZW5ndGg6IGRheX0pOyBlcnIgIT0gRXJyTm90T3duZXIgewoJCXQuRXJyb3JmKCJBbWVuZCBieSB0aGUgU1BFTkRFUjogZ290ICV2LCB3YW50IEVyck5vdE93bmVyIiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuUmV2b2tlKGlkLCBjYXJvbCk7IGVyciAhPSBFcnJOb3RPd25lciB7CgkJdC5FcnJvcmYoIlJldm9rZSBieSBhIHN0cmFuZ2VyOiBnb3QgJXYsIHdhbnQgRXJyTm90T3duZXIiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZXZva2UoaWQsIGJvYik7IGVyciAhPSBFcnJOb3RPd25lciB7CgkJdC5FcnJvcmYoIlJldm9rZSBieSB0aGUgU1BFTkRFUjogZ290ICV2LCB3YW50IEVyck5vdE93bmVyIiwgZXJyKQoJfQoJaWYgYi5Db3VudCgpICE9IDEgewoJCXQuRXJyb3JmKCJsaXZlIGNvdW50IGFmdGVyIHNpeCByZWZ1c2VkIGNhbGxzOiBnb3QgJWQsIHdhbnQgMSIsIGIuQ291bnQoKSkKCX0KfQoKZnVuYyBUZXN0QWNjb3VudGluZ0lzVW5jaGFuZ2VkQWNyb3NzVGhlRXh0ZW5kZWRCb3VuZGFyeSh0ICp0ZXN0aW5nLlQpIHsKCS8vIFRoZSBmaXggbXVzdCBtb3ZlIHRoZSBleHBpcnkgZ2F0ZSBhbmQgbm90aGluZyBlbHNlLiBUaGUgd2luZG93IHJlc2V0LAoJLy8gdGhlIGxpZmV0aW1lIGFjY3VtdWxhdG9yIGFuZCB0aGUgd2luZG93IGluZGV4IGFsbCBiZWhhdmUgZXhhY3RseSBhcyB0aGUKCS8vIHBhY2thZ2UgZG9jIGRlc2NyaWJlcywgbWVhc3VyZWQgYWNyb3NzIHRoZSBib3VuZGFyeSB0aGUgZXh0ZW5zaW9uIG1hZGUKCS8vIHJlYWNoYWJsZS4KCS8vCgkvLyB2MTogRkFJTFMgLS0gbm90IG9uIGFuIGFjY291bnRpbmcgYXNzZXJ0aW9uLCBidXQgb24gbXVzdFNwZW5kIGF0IHRoZSBvbGQKCS8vIGV4cGlyeSwgd2hpY2ggdjEgcmVmdXNlcyB3aXRoIEVyckV4cGlyZWQuIFRoZSBhY2NvdW50aW5nIGl0IHdhcyB3cml0dGVuCgkvLyB0byBwaW4gaXMgdGhlcmVmb3JlIFVOUkVBQ0hBQkxFIG9uIHYxOiB0aGVyZSBpcyBubyB2MSBzdGF0ZSBpbiB3aGljaAoJLy8gdGhlc2UgZmlndXJlcyBjb3VsZCBiZSBjb21wYXJlZCwgd2hpY2ggaXMgaXRzZWxmIHRoZSBtZWFzdXJlbWVudC4KCWIgOj0gTXVzdE5ldyg0KQoJaWQsIGVyciA6PSBiLk9wZW4oYWxpY2UsIGJvYiwgMCwKCQlUZXJtc3tQZXJQZXJpb2Q6IDUwLCBQZXJpb2RMZW5ndGg6IGRheSwgVG90YWw6IDEyMCwgRXhwaXJlc0F0OiAzICogZGF5fSkKCWlmIGVyciAhPSBuaWwgewoJCXQuRmF0YWxmKCJPcGVuOiAldiIsIGVycikKCX0KCW11c3RTcGVuZCh0LCBiLCBpZCwgMTAsIDQwKSAvLyB3aW5kb3cgMAoJcXVldWVFeHRlbnNpb24odCwgYiwgaWQsIDIwKQoKCS8vIHF1ZXVlRXh0ZW5zaW9uIGtlZXBzIFRvdGFsIGF0IDAgLS0gaXQgbmFtZXMgbm8gVG90YWwsIHNvIHRoZSBwZW5kaW5nCgkvLyB0ZXJtcyBSRU1PVkUgdGhlIGxpZmV0aW1lIGNhcC4gQXNzZXJ0IHRoYXQgcHJlbWlzZSByYXRoZXIgdGhhbiByZWx5aW5nCgkvLyBvbiBpdCBzaWxlbnRseSwgc2luY2UgaXQgaXMgd2hhdCBtYWtlcyB0aGUgZHJhdyBiZWxvdyBwZXJtaXR0ZWQuCglhLCBfIDo9IGIuR2V0KGlkKQoJaWYgYS5QZW5kaW5nLlRvdGFsICE9IDAgfHwgYS5UZXJtcy5Ub3RhbCAhPSAxMjAgewoJCXQuRmF0YWxmKCJwcmVjb25kaXRpb246IHBlbmRpbmcgVG90YWwgJWQsIGxpdmUgVG90YWwgJWQiLAoJCQlhLlBlbmRpbmcuVG90YWwsIGEuVGVybXMuVG90YWwpCgl9CgoJbXVzdFNwZW5kKHQsIGIsIGlkLCAzKmRheSwgODApIC8vIHBhc3QgdGhlIG9sZCBleHBpcnksIG9uIHRoZSBuZXcgdGVybXMKCglhLCBfID0gYi5HZXQoaWQpCglpZiBhLlNwZW50VG90YWwgIT0gMTIwIHsKCQl0LkVycm9yZigiU3BlbnRUb3RhbDogZ290ICVkLCB3YW50IDQwKzgwPTEyMCIsIGEuU3BlbnRUb3RhbCkKCX0KCWlmIGEuU3BlbnRXaW5kb3cgIT0gODAgewoJCXQuRXJyb3JmKCJTcGVudFdpbmRvdzogZ290ICVkLCB3YW50IDgwICh0aGUgd2luZG93IHJlc2V0LCBpdCBkaWQgbm90ICIrCgkJCSJjYXJyeSB0aGUgNDApIiwgYS5TcGVudFdpbmRvdykKCX0KCWlmIGEuV2luZG93SW5kZXggIT0gMyB7CgkJdC5FcnJvcmYoIldpbmRvd0luZGV4OiBnb3QgJWQsIHdhbnQgMyIsIGEuV2luZG93SW5kZXgpCgl9CglpZiBhLkhhc1BlbmRpbmcgewoJCXQuRXJyb3IoIkhhc1BlbmRpbmcgbXVzdCBiZSBjbGVhcmVkIG9uY2UgdGhlIHdyaXRlIHByb21vdGVzIHRoZSB0ZXJtcyIpCgl9CglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAxMCpkYXkgewoJCXQuRXJyb3JmKCJwcm9tb3RlZCBFeHBpcmVzQXQ6IGdvdCAlZCwgd2FudCAlZCIsIGEuVGVybXMuRXhwaXJlc0F0LCAxMCpkYXkpCgl9CgkvLyBUaGUgd2luZG93IGNhcCBzdGlsbCBiaXRlcyBhdCB0aGUgbmV3IGZpZ3VyZSwgbm90IGFib3ZlIGl0LgoJcmVmdXNlKHQsIGIsIGlkLCAzKmRheSwgMSwgRXJyUGVyaW9kRXhjZWVkZWQpCn0KCmZ1bmMgVGVzdFJlbWFpbmluZ0FncmVlc1dpdGhTcGVuZEFjcm9zc0V2ZXJ5UXVldWVkRXhwaXJ5Q2hhbmdlKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIGNyb3NzLWNoZWNrIHRoZSBwYWNrYWdlIGRvYyBuYW1lcyBhcyB0aGUgcmVhc29uIGV2ZXJ5dGhpbmcgcm91dGVzCgkvLyB0aHJvdWdoIGF0KCk6IGEgdmlldyB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBlbmZvcmNlciBpcyB0aGUgZGVmZWN0LAoJLy8gd2hpY2hldmVyIHdheSBpdCBwb2ludHMuIEVhY2ggcm93IGdldHMgYSBGUkVTSCBib29rLCBiZWNhdXNlIFNwZW5kCgkvLyB3cml0ZXMgYW5kIGEgd3JpdGUgZW5kcyB0aGUgaGF6YXJkIGJlaW5nIG1lYXN1cmVkLgoJLy8KCS8vIHYxOiBGQUlMUy4gTm90ZSBXSEVSRTogdjEga2VlcHMgUmVtYWluaW5nIGFuZCBTcGVuZCBpbiBBR1JFRU1FTlQgb24KCS8vIGV2ZXJ5IHJvdyAtLSBib3RoIHJvdXRlIHRocm91Z2ggYXQoKSAtLSBzbyB0aGUgYWdyZWVtZW50IGludmFyaWFudCBhbG9uZQoJLy8gd291bGQgaGF2ZSBwYXNzZWQgYWdhaW5zdCB0aGUgZGVmZWN0aXZlIHBhY2thZ2UuIFdoYXQgZmFpbHMgaXMgdGhlCgkvLyBgYWxpdmVgIGNvbHVtbjogdjEgY2FsbHMgdGhlIHRocmVlIHBvc3QtYm91bmRhcnkgbGl2ZSByb3dzIGRlYWQuIFR3bwoJLy8gdmlld3MgYWdyZWVpbmcgaXMgbm90IHRoZSBzYW1lIGFzIGVpdGhlciBiZWluZyByaWdodCwgd2hpY2ggaXMgd2h5IHRoZQoJLy8gZXhwZWN0ZWQgbGl2ZW5lc3MgaXMgc3BlbGxlZCBvdXQgcGVyIHJvdyBpbnN0ZWFkIG9mIG9ubHkgY3Jvc3MtY2hlY2tlZC4KCWZvciBfLCB0YyA6PSByYW5nZSBbXXN0cnVjdCB7CgkJbmFtZSAgc3RyaW5nCgkJbm93ICAgaW50NjQKCQlhbGl2ZSBib29sCgl9ewoJCXsiZXh0ZW5zaW9uOiBpbnNpZGUgdGhlIG9yaWdpbmFsIHdpbmRvdyIsIDUwLCB0cnVlfSwKCQl7ImV4dGVuc2lvbjogYXQgdGhlIGJvdW5kYXJ5IiwgZGF5LCB0cnVlfSwKCQl7ImV4dGVuc2lvbjogYXQgdGhlIG9sZCBleHBpcnkiLCAzICogZGF5LCB0cnVlfSwKCQl7ImV4dGVuc2lvbjogb25lIGJlZm9yZSB0aGUgbmV3IGV4cGlyeSIsIDEwKmRheSAtIDEsIHRydWV9LAoJCXsiZXh0ZW5zaW9uOiBhdCB0aGUgbmV3IGV4cGlyeSIsIDEwICogZGF5LCBmYWxzZX0sCgkJeyJleHRlbnNpb246IGxvbmcgYWZ0ZXIgdGhlIG5ldyBleHBpcnkiLCAxMDAgKiBkYXksIGZhbHNlfSwKCX0gewoJCWIsIGlkIDo9IG9wZW5FeHRlbmRhYmxlKHQpCgkJcXVldWVFeHRlbnNpb24odCwgYiwgaWQsIDEwKQoKCQlyZW1haW5pbmcgOj0gYi5SZW1haW5pbmcoaWQsIHRjLm5vdykKCQllcnIgOj0gYi5TcGVuZChpZCwgYm9iLCB0Yy5ub3csIDEpCgoJCWlmIHRjLmFsaXZlIHsKCQkJaWYgcmVtYWluaW5nIDw9IDAgewoJCQkJdC5FcnJvcmYoIiVzOiBSZW1haW5pbmc9JWQsIHdhbnQgPiAwIiwgdGMubmFtZSwgcmVtYWluaW5nKQoJCQl9CgkJCWlmIGVyciAhPSBuaWwgewoJCQkJdC5FcnJvcmYoIiVzOiBTcGVuZD0ldiwgd2FudCBuaWwiLCB0Yy5uYW1lLCBlcnIpCgkJCX0KCQl9IGVsc2UgewoJCQlpZiByZW1haW5pbmcgIT0gMCB7CgkJCQl0LkVycm9yZigiJXM6IFJlbWFpbmluZz0lZCwgd2FudCAwIiwgdGMubmFtZSwgcmVtYWluaW5nKQoJCQl9CgkJCWlmIGVyciAhPSBFcnJFeHBpcmVkIHsKCQkJCXQuRXJyb3JmKCIlczogU3BlbmQ9JXYsIHdhbnQgRXJyRXhwaXJlZCIsIHRjLm5hbWUsIGVycikKCQkJfQoJCX0KCQlpZiAocmVtYWluaW5nID4gMCkgIT0gKGVyciA9PSBuaWwpIHsKCQkJdC5FcnJvcmYoIiVzOiB0aGUgdmlldyBhbmQgdGhlIGVuZm9yY2VyIGRpc2FncmVlIChSZW1haW5pbmc9JWQsICIrCgkJCQkiU3BlbmQ9JXYpIiwgdGMubmFtZSwgcmVtYWluaW5nLCBlcnIpCgkJfQoJfQp9CgpmdW5jIFRlc3RJc0V4cGlyZWRUb2xlcmF0ZXNBUHJlQW5jaG9yTm93KHQgKnRlc3RpbmcuVCkgewoJLy8gSXNFeHBpcmVkIGlzIEVYUE9SVEVEIGFuZCBub3cgcm91dGVzIHRocm91Z2ggYXQoKSwgc28gaXQgaXMgdGhlIG9uZQoJLy8gcGxhY2UgYSBjYWxsZXItc3VwcGxpZWQgbm93IGNhbiByZWFjaCB3aW5kb3dJbmRleCB3aXRob3V0IGFuIHVwc3RyZWFtCgkvLyBFcnJOb3RTdGFydGVkLiBSZWFwIGlzIHRoZSBpbi1wYWNrYWdlIGNhbGxlciB3aXRoIG5vIGFuY2hvciBjaGVjayBvZgoJLy8gaXRzIG93bi4KCS8vCgkvLyB2MTogUEFTU0VTIC0tIGFuZCB0aGUgYWdyZWVtZW50IGlzIHRoZSBjbGFpbS4gdjEgY291bGQgbm90IHJlYWNoCgkvLyB3aW5kb3dJbmRleCBmcm9tIElzRXhwaXJlZCBhdCBhbGwsIHNvIHRoaXMgY2FzZSBleGlzdHMgdG8gcHJvdmUgdGhlIG5ldwoJLy8gcGF0aCBkaWQgbm90IGludHJvZHVjZSBhIGRpdmVyZ2VuY2Ugd2hlcmUgdjEgaGFkIG5vIGV4cG9zdXJlLiBBIEZBSUwKCS8vIGhlcmUgd291bGQgbWVhbiB0aGUgZml4IGhhZCBtb3ZlZCBiZWhhdmlvdXIgaXQgd2FzIHN1cHBvc2VkIHRvIGxlYXZlCgkvLyBhbG9uZSwgc28gInBhc3NlcyBvbiBib3RoIHNpZGVzIiBpcyB0aGUgb25seSBhY2NlcHRhYmxlIG91dGNvbWUuCgkvLwoJLy8gRmlyc3QsIHRoZSBoYXphcmQgdGhlIGd1YXJkIGV4aXN0cyBmb3IsIG1lYXN1cmVkIHJhdGhlciB0aGFuIGFzc2VydGVkOgoJLy8gYSBuZWdhdGl2ZSBudW1lcmF0b3IgZm9sZHMgcm91Z2hseSB0d28gd2luZG93cyBpbnRvIG9uZSwgYmVjYXVzZSBHbwoJLy8gdHJ1bmNhdGVzIHRvd2FyZCB6ZXJvLgoJYSA6PSBBbGxvd2FuY2V7QW5jaG9yOiA1MDAsIFRlcm1zOiBUZXJtc3tQZXJQZXJpb2Q6IDEsIFBlcmlvZExlbmd0aDogZGF5fX0KCWlmIGEud2luZG93SW5kZXgoNDAxKSAhPSBhLndpbmRvd0luZGV4KDU5OSkgewoJCXQuRmF0YWxmKCJwcmVjb25kaXRpb246IHdpbmRvd0luZGV4KDQwMSk9JWQgd2luZG93SW5kZXgoNTk5KT0lZCAtLSB0aGUgIisKCQkJImZvbGQgdGhpcyBndWFyZCBhdm9pZHMgaXMgbm90IHByZXNlbnQsIHNvIHRoZSBndWFyZCdzIHN0YXRlZCAiKwoJCQkicmVhc29uIGlzIHdyb25nIiwgYS53aW5kb3dJbmRleCg0MDEpLCBhLndpbmRvd0luZGV4KDU5OSkpCgl9CgoJLy8gVGhlbiB0aGUgZ3VhcmQ6IGV2ZXJ5IHByZS1hbmNob3Igbm93IGFuc3dlcnMgZmFsc2UsIHdoaWNoIGlzIGFsc28gd2hhdAoJLy8gdjEgYW5zd2VyZWQgZm9yIGFueSBhbGxvd2FuY2UgdmFsaWQoKSB3b3VsZCBhY2NlcHQsIHNpbmNlIHZhbGlkKCkKCS8vIHJlcXVpcmVzIEV4cGlyZXNBdCA+IEFuY2hvci4KCWUgOj0gQWxsb3dhbmNlewoJCUFuY2hvcjogNTAwLAoJCVRlcm1zOiAgVGVybXN7UGVyUGVyaW9kOiAxLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiAxMDAwfSwKCX0KCWZvciBfLCBub3cgOj0gcmFuZ2UgW11pbnQ2NHstMSwgMCwgNDAxLCA0OTl9IHsKCQlpZiBlLklzRXhwaXJlZChub3cpIHsKCQkJdC5FcnJvcmYoIklzRXhwaXJlZCglZCkgd2l0aCBBbmNob3IgNTAwOiBnb3QgdHJ1ZSwgd2FudCBmYWxzZSIsIG5vdykKCQl9Cgl9CgkvLyBSZWFjaCBpdCB0aHJvdWdoIFJlYXAsIHRoZSBjYWxsZXIgdGhhdCBoYXMgbm8gYW5jaG9yIGNoZWNrLgoJYiA6PSBNdXN0TmV3KDQpCglpZCwgZXJyIDo9IGIuT3BlbihhbGljZSwgYm9iLCA1MDAsCgkJVGVybXN7UGVyUGVyaW9kOiA1MCwgUGVyaW9kTGVuZ3RoOiBkYXksIEV4cGlyZXNBdDogMTAwMH0pCglpZiBlcnIgIT0gbmlsIHsKCQl0LkZhdGFsZigiT3BlbjogJXYiLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCAxMDApOyBlcnIgIT0gRXJyTm90RXhwaXJlZCB7CgkJdC5FcnJvcmYoIlJlYXAgYmVmb3JlIHRoZSBhbmNob3I6IGdvdCAldiwgd2FudCBFcnJOb3RFeHBpcmVkIiwgZXJyKQoJfQoJaWYgZXJyIDo9IGIuUmVhcChpZCwgLTEpOyBlcnIgIT0gRXJySW52YWxpZE5vdyB7CgkJdC5FcnJvcmYoIlJlYXAgd2l0aCBhIG5lZ2F0aXZlIG5vdzogZ290ICV2LCB3YW50IEVyckludmFsaWROb3ciLCBlcnIpCgl9CglpZiBlcnIgOj0gYi5SZWFwKGlkLCAxMDAwKTsgZXJyICE9IG5pbCB7CgkJdC5FcnJvcmYoIlJlYXAgYXQgdGhlIGV4cGlyeTogJXYiLCBlcnIpCgl9Cn0KCmZ1bmMgVGVzdFRoZVByZUFuY2hvckd1YXJkSXNMb2FkQmVhcmluZ09uQUNhbGxlckJ1aWx0QWxsb3dhbmNlKHQgKnRlc3RpbmcuVCkgewoJLy8gVGhlIGNvbXBhbmlvbiB0byB0aGUgdGVzdCBhYm92ZSwgYW5kIGl0IGV4aXN0cyBiZWNhdXNlIHRoZSBzYWJvdGFnZQoJLy8gaGFybmVzcyBmb3VuZCB0aGUgZ2FwOiBkZWxldGluZyB0aGUgYG5vdyA8IGEuQW5jaG9yYCBndWFyZCBvdXRyaWdodCB3YXMKCS8vIFVOQ0FVR0hUIGJ5IHRoZSB3aG9sZSBzdWl0ZS4gVGVzdElzRXhwaXJlZFRvbGVyYXRlc0FQcmVBbmNob3JOb3cgY291bGQKCS8vIG5vdCBjYXRjaCBpdCwgYW5kIHRoYXQgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgRE9NQUlOIHJhdGhlciB0aGFuIGEKCS8vIHdlYWtuZXNzIGluIHRoZSB0ZXN0IC0tIG92ZXIgYWxsb3dhbmNlcyB2YWxpZCgpIGFjY2VwdHMgdGhlIGd1YXJkIGlzCgkvLyBnZW51aW5lbHkgaW5lcnQsIHdoaWNoIGlzIGFsc28gd2hhdCBSRUFETUUubWQgY2xhaW1zLCBpbiBhIHNlbnRlbmNlCgkvLyBjYXJlZnVsbHkgc2NvcGVkIHRvICJldmVyeSBhbGxvd2FuY2UgaXQgd291bGQgYWNjZXB0Ii4KCS8vCgkvLyBNZWFzdXJlZCByYXRoZXIgdGhhbiByZWFzb25lZDogYSBzd2VlcCBvZiA0LDE3NiB2YWxpZCgpLWFjY2VwdGVkCgkvLyAoYW5jaG9yLCBQZXJpb2RMZW5ndGgsIEV4cGlyZXNBdCwgcGVuZGluZywgbm93KSBjb21iaW5hdGlvbnMgZm91bmQgWkVSTwoJLy8gaW5wdXRzIGRpc3Rpbmd1aXNoaW5nIHRoZSBndWFyZGVkIGJvZHkgZnJvbSB0aGUgdW5ndWFyZGVkIG9uZSwgY291bnRpbmcKCS8vIGEgcGFuaWMgYXMgYSBkaWZmZXJlbmNlLiBXaWRlbmluZyBwYXN0IHZhbGlkaXR5IGZvdW5kIDMsNTcwLgoJLy8KCS8vIFNvIHRoZSBvYnNlcnZhYmxlIGRvbWFpbiBpcyBleGFjdGx5IGAwICE9IEV4cGlyZXNBdCA8PSBub3cgPCBBbmNob3JgLAoJLy8gYW5kIHZhbGlkKCkgcmVqZWN0cyBldmVyeSBtZW1iZXIgb2YgaXQgKGBFeHBpcmVzQXQgPD0gYW5jaG9yYCBpcyBvbmUgb2YKCS8vIGl0cyByZWZ1c2FscykuIEl0IGlzIHJlYWNoYWJsZSBhbnl3YXksIHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcwoJLy8gdGVzdCBpcyBoZXJlIHJhdGhlciB0aGFuIGEgY29tbWVudCBzYXlpbmcgdGhlIHRlcm0gY2Fubm90IGJlIHNhYm90YWdlZDoKCS8vIEdldCByZXR1cm5zIGFuIEFsbG93YW5jZSBCWSBWQUxVRSBhbmQgSXRlcmF0ZSBwYXNzZXMgb25lLCBJc0V4cGlyZWQgaXMKCS8vIGV4cG9ydGVkIHdpdGggYSB2YWx1ZSByZWNlaXZlciwgc28gYSBjb25zdW1lciBjYW4gaG9sZCBhIGNvcHksIG11dGF0ZQoJLy8gaXRzIFRlcm1zLCBhbmQgY2FsbCBJc0V4cGlyZWQgb24gYSBzaGFwZSB0aGUgQm9vayB3b3VsZCBuZXZlciBzdG9yZS4KCS8vCgkvLyB2MTogUEFTU0VTLiB2MSByZWFkIGEuVGVybXMuRXhwaXJlc0F0IGRpcmVjdGx5IGFuZCBuZXZlciByZWFjaGVkCgkvLyB3aW5kb3dJbmRleCBmcm9tIGhlcmUsIHNvIGl0IGFuc3dlcmVkIGZhbHNlIHRvbyAtLSBhbm90aGVyIFBSRVNFUlZBVElPTgoJLy8gY2FzZS4gVGhlIGd1YXJkIGlzIHdoYXQga2VlcHMgdjIgYWdyZWVpbmcgd2l0aCBpdC4KCS8vCgkvLyBXaGF0IGlzIE5PVCBjbGFpbWVkOiBubyBhdXRob3JpemF0aW9uIGNvbnNlcXVlbmNlLiBSZWFwIHJlc29sdmVzIHRoZQoJLy8gU1RPUkVEIGFsbG93YW5jZSwgd2hpY2ggaXMgYWx3YXlzIHZhbGlkKCktYWNjZXB0ZWQsIHNvIGEgY2FsbGVyJ3MKCS8vIG11dGF0ZWQgY29weSBjYW5ub3QgbWFrZSBSZWFwIGRlbGV0ZSBhbnl0aGluZy4gVGhpcyBwaW5zIGNvbnNpc3RlbmN5IG9mCgkvLyBhbiBleHBvcnRlZCBtZXRob2QsIG5vdCBhIHBlcm1pc3Npb24uCglhIDo9IEFsbG93YW5jZXsKCQlPd25lcjogYWxpY2UsIFNwZW5kZXI6IGJvYiwgQW5jaG9yOiAxMDAwLAoJCVRlcm1zOiBUZXJtc3tQZXJQZXJpb2Q6IDEwLCBQZXJpb2RMZW5ndGg6IGRheSwgRXhwaXJlc0F0OiA1fSwKCX0KCWlmIGEuVGVybXMudmFsaWQoYS5BbmNob3IpIHsKCQl0LkZhdGFsZigicHJlY29uZGl0aW9uOiB2YWxpZCgxMDAwKSBhY2NlcHRlZCBFeHBpcmVzQXQgNSwgc28gdGhpcyBjYXNlICIgKwoJCQkiaXMgbm8gbG9uZ2VyIGFib3V0IGEgc2hhcGUgdGhlIEJvb2sgcmVmdXNlcyB0byBzdG9yZSIpCgl9CgkvLyBub3cgc2l0cyBhdCBvciBhZnRlciB0aGUgZXhwaXJ5IGFuZCBzdHJpY3RseSBiZWZvcmUgdGhlIGFuY2hvcjogdGhlCgkvLyBndWFyZCBhbnN3ZXJzIGZhbHNlLCB0aGUgdW5ndWFyZGVkIGJvZHkgd291bGQgYW5zd2VyIHRydWUuCglmb3IgXywgbm93IDo9IHJhbmdlIFtdaW50NjR7NSwgNiwgMTAwLCA5OTl9IHsKCQlpZiBhLklzRXhwaXJlZChub3cpIHsKCQkJdC5FcnJvcmYoIklzRXhwaXJlZCglZCkgd2l0aCBBbmNob3IgMTAwMCAvIEV4cGlyZXNBdCA1OiBnb3QgdHJ1ZSwgIisKCQkJCSJ3YW50IGZhbHNlIC0tIHRoZSBwcmUtYW5jaG9yIGd1YXJkIGlzIG5vdCBpbiBmb3JjZSwgc28gYW4gIisKCQkJCSJleHBvcnRlZCBtZXRob2QgZGlzYWdyZWVzIHdpdGggdjEgb24gYSBjYWxsZXItYnVpbHQgc2hhcGUiLCBub3cpCgkJfQoJfQoJLy8gVGhlIHNhbWUgd2l0aCBubyB3aW5kb3cgYXQgYWxsLCBzbyBib3RoIG9mIHdpbmRvd0luZGV4J3MgYXJtcyBhcmUKCS8vIGNvdmVyZWQgb24gdGhpcyBwYXRoIGFuZCBub3QganVzdCB0aGUgZm9sZGluZyBvbmUuCglsaWZldGltZSA6PSBhCglsaWZldGltZS5UZXJtcy5QZXJpb2RMZW5ndGggPSAwCglpZiBsaWZldGltZS5Jc0V4cGlyZWQoMTAwKSB7CgkJdC5FcnJvcmYoIklzRXhwaXJlZCgxMDApIG9uIGEgbGlmZXRpbWUgYWxsb3dhbmNlIHdpdGggQW5jaG9yIDEwMDAgLyAiICsKCQkJIkV4cGlyZXNBdCA1OiBnb3QgdHJ1ZSwgd2FudCBmYWxzZSIpCgl9CgkvLyBUaGUgY29udHJvbDogcGFzdCB0aGUgYW5jaG9yIHRoZSBleHBpcnkgSVMgaG9ub3VyZWQsIHNvIHRoZSBndWFyZCBpcwoJLy8gcHJvdmVuIHRvIGJlIGEgcHJlLWFuY2hvciBzaG9ydGN1dCBhbmQgbm90IGEgYmxhbmtldCBgcmV0dXJuIGZhbHNlYC4KCS8vIFdpdGhvdXQgdGhpcywgZGVsZXRpbmcgdGhlIGd1YXJkJ3MgY29uZGl0aW9uIGFuZCBrZWVwaW5nIGByZXR1cm4gZmFsc2VgCgkvLyB3b3VsZCBwYXNzIGV2ZXJ5dGhpbmcgYWJvdmUuCglpZiAhYS5Jc0V4cGlyZWQoMTAwMCkgewoJCXQuRXJyb3JmKCJJc0V4cGlyZWQoMTAwMCkgYXQgdGhlIGFuY2hvciB3aXRoIEV4cGlyZXNBdCA1OiBnb3QgZmFsc2UsICIgKwoJCQkid2FudCB0cnVlIC0tIHRoZSBndWFyZCBoYXMgYmVjb21lIGFuIHVuY29uZGl0aW9uYWwgZmFsc2UgYW5kICIgKwoJCQkiSXNFeHBpcmVkIG5vIGxvbmdlciByZXBvcnRzIGV4cGlyeSBhdCBhbGwiKQoJfQp9CgpmdW5jIFRlc3RUaGVaZXJvQWxsb3dhbmNlSXNVbmNoYW5nZWRCeVRoZUZpeCh0ICp0ZXN0aW5nLlQpIHsKCS8vIEEgaGFuZC1idWlsdCBBbGxvd2FuY2UgaXMgcmVhY2hhYmxlOiBHZXQgcmV0dXJucyBvbmUgYnkgdmFsdWUgYW5kCgkvLyBJdGVyYXRlIHBhc3NlcyBvbmUuIFRoZSB6ZXJvIHZhbHVlIG11c3QgYW5zd2VyIGV4YWN0bHkgYXMgaXQgZGlkIGluCgkvLyB2MSwgb3IgdGhlIGZpeCBoYXMgY2hhbmdlZCBhIHNoYXBlIG5vIGNvbnN1bWVyIGRlY2xhcmVkLgoJLy8KCS8vIHYxOiBQQVNTRVMgLS0gYSBQUkVTRVJWQVRJT04gY2FzZSwgYW5kIHRoZSBvbmUgd2l0aCB0aGUgbGVhc3QgbWFyZ2luOgoJLy8gdGhlIHplcm8gdmFsdWUgaGFzIEFuY2hvciAwIGFuZCBQZXJpb2RMZW5ndGggMCwgc28gaXQgdGFrZXMgdGhlIGd1YXJkJ3MKCS8vIGZhbHNlIGJyYW5jaCBvbiBub3cgPCAwIGFuZCB3aW5kb3dJbmRleCdzIFBlcmlvZExlbmd0aCA9PSAwIGJyYW5jaAoJLy8gb3RoZXJ3aXNlLiBCb3RoIGFybXMgYXJlIGV4ZXJjaXNlZCBiZWxvdy4KCXZhciB6IEFsbG93YW5jZQoJZm9yIF8sIG5vdyA6PSByYW5nZSBbXWludDY0ey0xLCAwLCAxLCBtYXhJbnQ2NH0gewoJCWlmIHouSXNFeHBpcmVkKG5vdykgewoJCQl0LkVycm9yZigidGhlIHplcm8gQWxsb3dhbmNlIGhhcyBFeHBpcmVzQXQgMCBhbmQgbXVzdCBuZXZlciBleHBpcmU7ICIrCgkJCQkiSXNFeHBpcmVkKCVkKSBzYWlkIHRydWUiLCBub3cpCgkJfQoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMjAwMDAwMDB1Z25vdBITCIDKte4BEgsyNTAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQI+F/3SD44LzJd5QXHh1vF/QcCo6KniXCcPaMD4J5RVpxJAuoxWBed/25qkLJ4mMhecdTQ3HxsjmUwq7Phkk2jmFjRhp78Q33gQ6h3nvykFG1tix1F7HUchRrpsQsXE0JvO2xooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}