{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "n52fQrFPrlMmHy6BwYYvkHg2UfvqdMxDRwLSvlXDfJk=",
    "height": "628080",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "57203",
            "fee_delta": "5720300ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/service_market"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "83170377",
      "GasUsed": "55446918"
    },
    "tx": "CpeHAgoML3ZtLm1fYWRkcGtnEoWHAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLIhgIKDnNlcnZpY2VfbWFya2V0EkJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvc2VydmljZV9tYXJrZXQaaQoLZ25vbW9kLnRvbWwSWm1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvc2VydmljZV9tYXJrZXQiCmdubyA9ICIwLjkiChqFhQIKEnNlcnZpY2VfbWFya2V0LmdubxLthAIvLyBSZWFsbSBzZXJ2aWNlX21hcmtldCBpcyBhIGN1c3RvZGlhbCBHTk9UIG1hcmtldHBsYWNlIGZvciBTRVJWSUNFUzoKLy8gcHJvdmlkZXJzIHB1Ymxpc2ggYSBzdGFuZGluZyBvZmZlciAodGl0bGUsIGRlc2NyaXB0aW9uLCBwcmljZSwKLy8gZGVsaXZlcnkgd2luZG93KSwgYSBjdXN0b21lciBwdXJjaGFzZXMgaXQgYnkgcGF5aW5nIHRoZSBleGFjdCBwcmljZQovLyBpbnRvIGVzY3JvdywgdGhlIHByb3ZpZGVyIG1hcmtzIHRoZSB3b3JrIGRlbGl2ZXJlZCwgYW5kIHRoZSBlc2Nyb3cgaXMKLy8gcmVsZWFzZWQgdG8gdGhlIHByb3ZpZGVyIG9ubHkgb25jZSB0aGUgY3VzdG9tZXIgYWNjZXB0cyDigJQgb3Igb25jZSB0aGUKLy8gYWNjZXB0YW5jZSB3aW5kb3cgbGFwc2VzLgovLwovLyBDT01QT1NJVElPTiAocGVyIHRoZSByZWNvcmRlZCBESVNDT1ZFUlkgLyBSRVVTRSBBTkFMWVNJUyBpbgovLyBESVNDT1ZFUlkubWQpOiBiYWxhbmNlIGFjY291bnRpbmcgaXMgZmVlbGVkZ2VyLCBjb2luIG1vdmVtZW50IGlzCi8vIGNvaW5pbywgZnJlZS10ZXh0IHJlbmRlciBzYWZldHkgaXMgcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MC4gVGhpcwovLyByZWFsbSBvd25zIG9ubHkgdGhlIHR3by1sZXZlbCBvZmZlci9vcmRlciBzdGF0ZSBtYWNoaW5lLCB3aGljaCB0aGUKLy8gZGlzY292ZXJ5IGdhdGUgZm91bmQgbm93aGVyZSBlbHNlOiBldmVyeSBlc2Nyb3cgcmVhbG0gaW4gdGhlIHNlYXJjaGVkCi8vIHNvdXJjZXMgZXNjcm93cyBGVU5ERVItRklSU1QgKHRoZSBwYXJ0eSB3aG8gd2lsbCBsYXRlciBkZWNpZGUgZXNjcm93cwovLyBmaXJzdCwgdGhlbiBzb2xpY2l0cyB3b3JrKSwgd2hpbGUgYSBzZXJ2aWNlIG1hcmtldHBsYWNlIG11c3QgZXNjcm93Ci8vIENVU1RPTUVSLUZJUlNUIGFnYWluc3QgYSBzdGFuZGluZyBvZmZlci4KLy8KLy8gTElGRUNZQ0xFLiBBIHNlcnZpY2UgaXMgYSByZXVzYWJsZSBvZmZlcjsgYW4gb3JkZXIgaXMgb25lIHB1cmNoYXNlIG9mCi8vIGl0LiBPcmRlciB0ZXJtaW5hbCBzdGF0ZXMgYXJlIGZyb3plbiBhbmQgcmVhY2hlZCBleGFjdGx5IG9uY2UuCi8vCi8vCVJlZ2lzdGVyU2VydmljZSAoYW55b25lLCBubyBjb2lucykgOiBzdGF0dXMgQWN0aXZlLiBUaGUgZmVlIGJwcyBpcwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05BUFNIT1RURUQgdW5kZXIgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcidzIG93biBtYXhGZWVCcHMKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlaWxpbmcuCi8vCVJldGlyZVNlcnZpY2UgKHByb3ZpZGVyIG9ubHkpICAgICAgOiBBY3RpdmUgLT4gUmV0aXJlZC4gQmxvY2tzIE5FVwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJzIG9ubHk7IG9yZGVycyBhbHJlYWR5IGluCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlnaHQgYXJlIHVudG91Y2hlZC4KLy8JUHVyY2hhc2VTZXJ2aWNlIChFT0EgKyAtc2VuZCkgICAgICA6IG9yZGVyIFB1cmNoYXNlZCwgYW1vdW50IGludG8KLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY3Jvdy4gU2V0cyB0aGUgZGVsaXZlcnkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lLgovLwlNYXJrRGVsaXZlcmVkIChwcm92aWRlciBvbmx5KSAgICAgIDogUHVyY2hhc2VkIC0+IERlbGl2ZXJlZC4gU3RhcnRzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXB0YW5jZSB3aW5kb3cuCi8vCUFjY2VwdERlbGl2ZXJ5IChjdXN0b21lciBvbmx5KSAgICAgOiBEZWxpdmVyZWQgLT4gUmVsZWFzZWQuIFRIRQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTT0xVVElPTi4gRXNjcm93IGJlY29tZXMgdGhlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51cyB0aGUgc25hcHNob3R0ZWQgZmVlLgovLwlSZWxlYXNlVGltZW91dCAoYW55b25lKSAgICAgICAgICAgIDogRGVsaXZlcmVkIC0+IFJlbGVhc2VkIGFmdGVyCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhbmNlQmxvY2tzLiBEZWVtZWQKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGFuY2UuCi8vCURlY2xpbmVPcmRlciAocHJvdmlkZXIgb25seSkgICAgICAgOiBQdXJjaGFzZWQgLT4gUmVmdW5kZWQsIGZlZS1mcmVlLgovLwlDbGFpbVJlZnVuZCAoYW55b25lKSAgICAgICAgICAgICAgIDogUHVyY2hhc2VkIC0+IFJlZnVuZGVkIGFmdGVyIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnkgZGVhZGxpbmUsIGZlZS1mcmVlLgovLwlDbGFpbSAvIENsYWltQWxsIChhbnlvbmUpICAgICAgICAgIDogcGF5cyBvdXQgdGhlIGNhbGxlcidzIG93bgovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhaW1hYmxlIGJhbGFuY2UuCi8vCi8vIEVWRVJZIFZBTFVFIEVYSVQgSVMgQSBQVUxMLiBSZWxlYXNlIGFuZCByZWZ1bmQgb25seSBtb3ZlIG51bWJlcnMKLy8gYmV0d2VlbiB0aGUgZXNjcm93IHBvb2wgYW5kIGEgY2xhaW1hYmxlIGJhbGFuY2U7IHRoZSBiZW5lZmljaWFyeQovLyBsYXRlciBjYWxscyBDbGFpbS4gTm90aGluZyBpbiB0aGlzIHJlYWxtIGV2ZXIgcHVzaGVzIGNvaW5zIHRvIGEgdGhpcmQKLy8gcGFydHksIHdoaWNoIGlzIHdoYXQgbGV0cyBib3RoIHRpbWVvdXQgdmFsdmVzIHN0YXkgcGVybWlzc2lvbmxlc3M6IGEKLy8gc3RyYW5nZXIgdHJpZ2dlcmluZyBSZWxlYXNlVGltZW91dCBvciBDbGFpbVJlZnVuZCBwZXJmb3JtcyBubyBzZW5kLCBzbwovLyBhIGJlbmVmaWNpYXJ5IHRoYXQgY2Fubm90IHJlY2VpdmUgYSBzZW5kIGNhbiBuZXZlciBicmljayB0aGUgdmFsdmUuCi8vCi8vIFRIRSBUSFJFRSBSRVFVSVJFRCBQUk9URUNUSU9OUy4KLy8KLy8gVW5hdXRob3JpemVkIHNldHRsZW1lbnQ6IGV2ZXJ5IGlkZW50aXR5IGRlcml2ZXMgZnJvbSB0aGUgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKTsgbm8gZnVuY3Rpb24gdGFrZXMgYSBjYWxsZXIKLy8gaWRlbnRpdHkgYXMgYSBwYXJhbWV0ZXIgKHRoZSBkZXNpZ25hdGlvbi1mb3JnZXJ5IHNoYXBlIHRoYXQKLy8gZGlzcXVhbGlmaWVkIG1vc3Qgb2YgdGhlIGVzY3JvdyByZWFsbXMgZm91bmQgaW4gZGlzY292ZXJ5KS4gVGhlIHBheWVlCi8vIGlzIENPUElFRCBJTlRPIFRIRSBPUkRFUiBhdCBwdXJjaGFzZSwgc28gbmVpdGhlciByZXRpcmluZyB0aGUgc2VydmljZQovLyBub3IgYW55IGxhdGVyIGVkaXQgY2FuIHJlZGlyZWN0IGFuIGluLWZsaWdodCBvcmRlcidzIHBheW1lbnQuIFRoZXJlIGlzCi8vIG5vIGFkbWluIHBhdGggdG8gYW55IG9yZGVyJ3MgZXNjcm93OiB0aGUgYWRtaW4gc2V0cyB0aGUgZmVlIGZvciBGVVRVUkUKLy8gcmVnaXN0cmF0aW9ucyBhbmQgbm90aGluZyBlbHNlLgovLwovLyBEb3VibGUgcGF5bWVudDogYW4gb3JkZXIncyBzdGF0dXMgaXMgY2hlY2tlZCBhbmQgZHJpdmVuIHRlcm1pbmFsIGluCi8vIHRoZSBzYW1lIHRyYW5zYWN0aW9uIHRoYXQgbW92ZXMgaXRzIHZhbHVlLCBhbmQgZXNjcm93VG90YWwgaXMKLy8gZGVjcmVtZW50ZWQgaW4gbG9ja3N0ZXAgd2l0aCB0aGUgY3JlZGl0LiBSZWxlYXNlIGFuZCByZWZ1bmQgYm90aAovLyByZXF1aXJlIGEgbm9uLXRlcm1pbmFsIHN0YXR1cywgc28gYXQgbW9zdCBvbmUgb2YgdGhlbSBjYW4gZXZlcgovLyBzdWNjZWVkIGZvciBhIGdpdmVuIG9yZGVyLCBhbmQgbmVpdGhlciBjYW4gc3VjY2VlZCB0d2ljZS4KLy8KLy8gU3R1Y2sgZnVuZHM6IGJvdGggY291bnRlcnBhcnRpZXMgaGF2ZSBhIHBlcm1pc3Npb25sZXNzIHZhbHZlIGFnYWluc3QKLy8gdGhlIG90aGVyJ3MgaW5hY3Rpb24uIEEgcHJvdmlkZXIgd2hvIG5ldmVyIGRlbGl2ZXJzIGxvc2VzIHRoZSBlc2Nyb3cKLy8gYmFjayB0byB0aGUgY3VzdG9tZXIgYXQgdGhlIGRlbGl2ZXJ5IGRlYWRsaW5lIChDbGFpbVJlZnVuZCk7IGEKLy8gY3VzdG9tZXIgd2hvIG5ldmVyIGFjY2VwdHMgbG9zZXMgaXQgdG8gdGhlIHByb3ZpZGVyIGF0IHRoZSBhY2NlcHRhbmNlCi8vIGRlYWRsaW5lIChSZWxlYXNlVGltZW91dCkuIE5laXRoZXIgdmFsdmUgdHJ1c3RzIGl0cyBjYWxsZXIuCi8vCi8vIEFDQ0VQVEFOQ0UgSVMgQSBQUk9UT0NPTCBDT05TVEFOVCwgTk9UIEEgUFJPVklERVIgU0VUVElORy4gVGhlCi8vIHByb3ZpZGVyIGNob29zZXMgdGhlIGRlbGl2ZXJ5IHdpbmRvdyAodGhlaXIgb3duIGNvbW1pdG1lbnQsIGFuZCB0aGVpcgovLyBvd24gcmlzayksIGJ1dCBBY2NlcHRhbmNlQmxvY2tzIGlzIGZpeGVkLiBXZXJlIGl0IHByb3ZpZGVyLWNob3NlbiwgYQovLyBwcm92aWRlciB3b3VsZCBzZXQgaXQgdG8gemVybywgbWFyayB3b3JrIGRlbGl2ZXJlZCwgYW5kIGF1dG8tcmVsZWFzZQovLyBpbiB0aGUgc2FtZSBibG9jayDigJQgc2V0dGxlbWVudCB3aXRob3V0IHJlc29sdXRpb24sIHdlYXJpbmcgdGhlCi8vIGNvc3R1bWUgb2YgYSB0aW1lb3V0LgovLwovLyBNT05FVEFSWSBJTlZBUklBTlQgKGNvbnNlcnZhdGlvbikuIFdpdGggSCA9IHVnbm90IGhlbGQgYXQgdGhlIHJlYWxtCi8vIGFkZHJlc3MsIEUgPSBlc2Nyb3dUb3RhbCAozqMgYW1vdW50IG92ZXIgUHVyY2hhc2VkIGFuZCBEZWxpdmVyZWQKLy8gb3JkZXJzKSwgVSA9IGNsYWltYWJsZSBiYWxhbmNlcywgRiA9IHRoZSBmZWUgcG90LCBTID49IDAgb3V0LW9mLWJhbmQKLy8gc3VycGx1czoKLy8KLy8JSCA9PSBFICsgVSArIEYgKyBTCi8vCi8vIFB1cmNoYXNlU2VydmljZSByYWlzZXMgSCBhbmQgRSBieSBleGFjdGx5IHRoZSBwcmljZS4gUmVsZWFzZSBtb3ZlcwovLyBhbW91bnQgZnJvbSBFIHRvIFUrRiAoZmVlbGVkZ2VyIGd1YXJhbnRlZXMgY3JlZGl0ZWQgKyBmZWUgPT0gYW1vdW50KTsKLy8gcmVmdW5kIG1vdmVzIGFtb3VudCBmcm9tIEUgdG8gVSBhdCB6ZXJvIGZlZS4gQ2xhaW0qL1dpdGhkcmF3RmVlcyBkZWJpdAovLyB0aGUgbGVkZ2VyIGJlZm9yZSBjb2luaW8uUGF5b3V0IG1vdmVzIHRoZSBpZGVudGljYWwgYW1vdW50IG91dC4gQW55Ci8vIHBhbmljIGFib3J0cyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IHRoaXMgcmVhbG0gbmV2ZXIgaXNzdWVzIG9yIHJlbW92ZXMKLy8gY29pbnMuIFN1cnBsdXMgaXMgcmVjb3ZlcmFibGUgb25seSB2aWEgU3dlZXBEZW5vbSAoZmVlIHJlY2lwaWVudCksCi8vIHdoaWNoIHJlc2VydmVzIExpYWJpbGl0aWVzKCkgPSBFICsgVSArIEYuCi8vCi8vIExJTUlUQVRJT04g4oCUIE5PIERJU1BVVEUgQVJCSVRSQVRJT04sIERFTElCRVJBVEVMWS4gVGhpcyByZWFsbSByZXNvbHZlcwovLyBvbiBhY2NlcHRhbmNlIG9yIG9uIHRoZSBhY2NlcHRhbmNlIHRpbWVvdXQuIEl0IGRvZXMgTk9UIGFkanVkaWNhdGUKLy8gd2hldGhlciBkZWxpdmVyZWQgd29yayB3YXMgZ29vZC4gQSBjdXN0b21lciB3aG8gY29uc2lkZXJzIHRoZSB3b3JrCi8vIGluYWRlcXVhdGUgaGFzIG5vIGxldmVyIGhlcmUgYmV5b25kIGRlY2xpbmluZyB0byBhY2NlcHQsIGFuZCB0aGUKLy8gdGltZW91dCB3aWxsIHN0aWxsIHBheSB0aGUgcHJvdmlkZXIuIFRoYXQgaXMgYSByZWFsIGxpbWl0YXRpb24gYW5kIGl0Ci8vIGlzIHRoZSBkZWxpYmVyYXRlIHByaWNlIG9mIHRoZSBwcm9wZXJ0eSBhYm92ZTogYW4gYXJiaXRlciBlbXBvd2VyZWQgdG8KLy8gcmVkaXJlY3QgZXNjcm93IGlzIGEgcGFydHkgd2hvIGNhbiBzZWl6ZSBmdW5kcywgYW5kIHRoZSBjbG9zZXN0IHJlYWxtCi8vIGZvdW5kIGluIGRpc2NvdmVyeSAoci9zYW1jcmV3L2VzY3Jvd192MykgY2FycmllcyBleGFjdGx5IHRoYXQgc2hhcGUg4oCUCi8vIGEgc2luZ2xlIGhhcmRjb2RlZCBhZG1pbiBrZXksIHdpdGggbm8gcm90YXRpb24gZnVuY3Rpb24sIHRoYXQgaXMKLy8gc2ltdWx0YW5lb3VzbHkgc29sZSBhcmJpdGVyLCBhIHVuaWxhdGVyYWwgcmVsZWFzZSBwYXRoLCBhbmQgYQovLyBwZXJtYW5lbnQgcGF1c2Ugc3dpdGNoIG92ZXIgZXZlcnkgZnVuZCBwYXRoLiBBZGRpbmcgYXJiaXRyYXRpb24gaGVyZQovLyB3b3VsZCBjaGFuZ2Ugd2hhdCB0aGlzIGFwcGxpY2F0aW9uIElTIGFuZCBleHBhbmQgaXRzIHNlY3VyaXR5IG1vZGVsLAovLyBzbyBpdCBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIHNtdWdnbGVkIGluLiBBIGRlcGxveW1lbnQgdGhhdCBuZWVkcwovLyBhZGp1ZGljYXRlZCBkaXNwdXRlcyBuZWVkcyB0aGF0IGRlc2lnbmVkLCBhdWRpdGVkIGFuZCBhdXRob3JpemVkIGFzCi8vIGl0cyBvd24gYXBwbGljYXRpb24uCi8vCi8vIFJFQUxNLUNBTExFUiBDQVZFQVQ6IGFzc2VydE5vU2VuZCByZWFkcyB0aGUgT1JJR0lOIHRyYW5zYWN0aW9uJ3Mgc2VuZAovLyBlbnZlbG9wZSwgbm90IHRoaXMgcmVhbG0ncyByZWNlaXB0LCBzbyBhIHJlYWxtIGNhbGxlciBpcyByZWZ1c2VkIGJ5Ci8vIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uIHdoZW5ldmVyIHRoZSBTQU1FIHRyYW5zYWN0aW9uIGF0dGFjaGVkIGEKLy8gLXNlbmQgYW55d2hlcmUg4oCUIGV2ZW4gdGhvdWdoIHRoaXMgcmVhbG0gcmVjZWl2ZWQgbm90aGluZy4gSXQgZmFpbHMKLy8gY2xvc2VkLCBpdCBpcyBub3QgdGhpcmQtcGFydHkgdHJpZ2dlcmFibGUsIGFuZCB0aGUgd29ya2Fyb3VuZCBpcyB0bwovLyBpc29sYXRlIHRoZSBjYWxsIGluIGl0cyBvd24gLXNlbmQtZnJlZSB0cmFuc2FjdGlvbi4KLy8KLy8gTmFtZWQgY29uY3JldGVseSwgYmVjYXVzZSB0aGUgZ2VuZXJpYyBwaHJhc2luZyB1bmRlcnN0YXRlcyB3aGVyZSBpdAovLyBsYW5kcy4gSXQgYXBwbGllcyB0byBldmVyeSBleHBvcnRlZCBmdW5jdGlvbiBleGNlcHQgUHVyY2hhc2VTZXJ2aWNlLAovLyB0aGUgb25seSBwYXlhYmxlIG9uZSwgYnV0IGZvdXIgb2YgdGhlbSBjYXJyeSB0aGUgd2VpZ2h0OgovLyBNYXJrRGVsaXZlcmVkLCB3aXRob3V0IHdoaWNoIG5vIG9yZGVyIGFnYWluc3QgYSByZWFsbSBwcm92aWRlciBjYW4KLy8gZXZlciByZWFjaCBhIHJlbGVhc2U7IFJlbGVhc2VUaW1lb3V0IGFuZCBDbGFpbVJlZnVuZCwgdGhlIHR3byB2YWx2ZXMKLy8gdGhpcyBkZXNpZ24gZGVsaWJlcmF0ZWx5IGxlYXZlcyBwZXJtaXNzaW9ubGVzczsgYW5kIENsYWltIC8gQ2xhaW1BbGwsCi8vIHRoZSBvbmx5IHBhdGhzIHRoYXQgZXh0cmFjdCBhIGNyZWRpdGVkIGJhbGFuY2UuIEEgcmVhbG0tYmFzZWQga2VlcGVyCi8vIGJvdCB0aGF0IGJhdGNoZXMgYSB2YWx2ZSBjYWxsIGludG8gYSB0cmFuc2FjdGlvbiBjYXJyeWluZyBjb2lucyBmb3IKLy8gc29tZSBvdGhlciBwdXJwb3NlIGlzIHRoZXJlZm9yZSBzaWxlbnRseSB1bnVzYWJsZSwgYW5kIGEgcmVhbG0KLy8gcHJvdmlkZXIgbXVzdCBidWRnZXQgYSBkZWRpY2F0ZWQgdHJhbnNhY3Rpb24gYm90aCB0byBkZWxpdmVyIGFuZCB0bwovLyBjb2xsZWN0LgovLyBSZXF1aXJlbWVudCAzIChubyBzdHVjayBmdW5kcykgc3Vydml2ZXMgdGhpczogYm90aCB2YWx2ZXMgYXJlCi8vIHBlcm1pc3Npb25sZXNzIGFuZCBhbnkgRU9BIGNhbiBwdWxsIHRoZW0sIHNvIG5vIG9yZGVyIGRlcGVuZHMgb24gYQovLyByZWFsbSBjYWxsZXIgdG8gdW5zdGljay4KcGFja2FnZSBzZXJ2aWNlX21hcmtldAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGFjY2VwdHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIHByb3RvY29sLWZlZSBjYXA6IDEwMDAgYnBzID0gMTAlLgpjb25zdCBNYXhGZWVCcHMgPSBpbnQ2NCgxMDAwKQoKLy8gQWNjZXB0YW5jZUJsb2NrcyBpcyBob3cgbG9uZyBhIGN1c3RvbWVyIGhhcyB0byBhY2NlcHQgYSBkZWxpdmVyeQovLyBiZWZvcmUgYW55b25lIG1heSByZWxlYXNlIGl0IHRvIHRoZSBwcm92aWRlci4gSXQgaXMgYSBQUk9UT0NPTAovLyBjb25zdGFudCBvbiBwdXJwb3NlIOKAlCBzZWUgdGhlIGhlYWRlci4gfjcgZGF5cyBhdCBwZWFybCdzIG9ic2VydmVkCi8vIH40LjJzIGJsb2Nrcy4KY29uc3QgQWNjZXB0YW5jZUJsb2NrcyA9IGludDY0KDE0MDAwMCkKCi8vIFNlcnZpY2Ugc3RhdHVzIHZhbHVlcy4KY29uc3QgKAoJU2VydmljZUFjdGl2ZSAgPSAiYWN0aXZlIgoJU2VydmljZVJldGlyZWQgPSAicmV0aXJlZCIKKQoKLy8gT3JkZXIgc3RhdHVzIHZhbHVlcy4gUmVsZWFzZWQgYW5kIFJlZnVuZGVkIGFyZSB0ZXJtaW5hbC4KY29uc3QgKAoJT3JkZXJQdXJjaGFzZWQgPSAicHVyY2hhc2VkIgoJT3JkZXJEZWxpdmVyZWQgPSAiZGVsaXZlcmVkIgoJT3JkZXJSZWxlYXNlZCAgPSAicmVsZWFzZWQiCglPcmRlclJlZnVuZGVkICA9ICJyZWZ1bmRlZCIKKQoKLy8gSW5wdXQgYm91bmRzLgpjb25zdCAoCglNYXhUaXRsZUxlbiA9IDgwCglNYXhEZXNjTGVuICA9IDIwMDAKCU1heFVSSUxlbiAgID0gNDAwCglNaW5QcmljZSAgICA9IGludDY0KDEpCgoJLy8gTWluRGVsaXZlcnlCbG9ja3MvTWF4RGVsaXZlcnlCbG9ja3MgYm91bmQgdGhlIHByb3ZpZGVyJ3Mgb3duCgkvLyB0dXJuYXJvdW5kIGNvbW1pdG1lbnQ6IH4xIGhvdXIgdG8gfjYwIGRheXMuCglNaW5EZWxpdmVyeUJsb2NrcyA9IGludDY0KDg1MCkKCU1heERlbGl2ZXJ5QmxvY2tzID0gaW50NjQoMTIwMDAwMCkKCgkvLyBNYXhTZXJ2aWNlc1BlclByb3ZpZGVyIGJvdW5kcyBjYXRhbG9nIG1vbm9wb2xpemF0aW9uIGJ5IGEgc2luZ2xlCgkvLyBhZGRyZXNzLiBUaGUgc2FtZSBmaW5kaW5nIHdhcyBSRUQgaW4gYm90aCBwZXJtaXNzaW9uX3JlZ2lzdHJ5IGFuZAoJLy8gc2VydmljZV9yZWdpc3RyeTsgaXQgaXMgY2hlYXBlciB0byBjYXJyeSB0aGUgY291bnRlciBmcm9tIHRoZQoJLy8gc3RhcnQgdGhhbiB0byBkaXNjb3ZlciBpdCBpbiBhbiBhdWRpdC4KCU1heFNlcnZpY2VzUGVyUHJvdmlkZXIgPSAyMAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyB0aGUgaG9tZSBwYWdlLiBBbiB1bmJvdW5kZWQgUmVuZGVyIHdhcyBZRUxMT1cKCS8vIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKdHlwZSBzZXJ2aWNlIHN0cnVjdCB7CglpZCAgICAgICAgICAgICBpbnQ2NAoJcHJvdmlkZXIgICAgICAgYWRkcmVzcwoJdGl0bGUgICAgICAgICAgc3RyaW5nCglkZXNjcmlwdGlvbiAgICBzdHJpbmcKCXByaWNlICAgICAgICAgIGludDY0CglkZWxpdmVyeUJsb2NrcyBpbnQ2NAoJZmVlQnBzICAgICAgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgYXQgcmVnaXN0cmF0aW9uLCBjaGFyZ2VkIGF0IHJlbGVhc2UKCXN0YXR1cyAgICAgICAgIHN0cmluZwoJb3JkZXJzICAgICAgICAgaW50NjQgLy8gbGlmZXRpbWUgY291bnQsIG5ldmVyIGRlY3JlbWVudGVkCn0KCnR5cGUgb3JkZXIgc3RydWN0IHsKCWlkICAgICAgICBpbnQ2NAoJc2VydmljZUlEIGludDY0CgljdXN0b21lciAgYWRkcmVzcwoJcHJvdmlkZXIgIGFkZHJlc3MgLy8gY29waWVkIGF0IHB1cmNoYXNlOyBuZXZlciByZS1yZWFkIGZyb20gdGhlIHNlcnZpY2UKCWFtb3VudCAgICBpbnQ2NAoJZmVlQnBzICAgIGludDY0IC8vIGNvcGllZCBhdCBwdXJjaGFzZSBmcm9tIHRoZSBzZXJ2aWNlJ3Mgc25hcHNob3QKCXN0YXR1cyAgICBzdHJpbmcKCglkZWxpdmVyeURlYWRsaW5lICAgaW50NjQgLy8gYWJzb2x1dGUgaGVpZ2h0OyBtZWFuaW5nZnVsIHdoaWxlIFB1cmNoYXNlZAoJYWNjZXB0YW5jZURlYWRsaW5lIGludDY0IC8vIGFic29sdXRlIGhlaWdodDsgc2V0IGF0IE1hcmtEZWxpdmVyZWQKCWRlbGl2ZXJ5VVJJICAgICAgICBzdHJpbmcKfQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzIC8vIG1heSBzZXQgZmVlLCBmZWUgcmVjaXBpZW50LCBzdGFnZSBzdWNjZXNzb3IKCXBlbmRpbmdBZG1pbiBhZGRyZXNzIC8vIHN0YWdlZCBieSBUcmFuc2ZlckFkbWluLCBjb21wbGV0ZXMgdmlhIEFjY2VwdEFkbWluCglmZWVSZWNpcGllbnQgYWRkcmVzcyAvLyBtYXkgd2l0aGRyYXcgZmVlcyBhbmQgc3dlZXAgc3VycGx1cwoJZmVlQnBzICAgICAgIGludDY0ICAgLy8gZmVlIHNuYXBzaG90dGVkIGludG8gTkVXIHNlcnZpY2VzCgoJc2VsZiAgICAgICAgYWRkcmVzcyAvLyB0aGlzIHJlYWxtJ3MgYWRkcmVzcywgY2FwdHVyZWQgYXQgZGVwbG95CgluZXh0U2VydmljZSBpbnQ2NAoJbmV4dE9yZGVyICAgaW50NjQKCWVzY3Jvd1RvdGFsIGludDY0IC8vID09IM6jIGFtb3VudCBvdmVyIFB1cmNoYXNlZCBhbmQgRGVsaXZlcmVkIG9yZGVycwoKCXNlcnZpY2VzICAgID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgICAtPiAqc2VydmljZQoJb3JkZXJzICAgICAgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAgIC0+ICpvcmRlcgoJcHJvdmlkZXJOdW0gPSBhdmwuTmV3VHJlZSgpIC8vIGFkZHJlc3MgICAgIC0+ICppbnQ2NCwgc2VydmljZXMgcGVyIHByb3ZpZGVyCglsZWRnZXIgICAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gcHJvdmlkZXIgc2lkZSAtLS0KCi8vIFJlZ2lzdGVyU2VydmljZSBwdWJsaXNoZXMgYSBzdGFuZGluZyBvZmZlciBhbmQgcmV0dXJucyBpdHMgaWQuIE5vCi8vIGNvaW5zIGFyZSBhY2NlcHRlZDsgdGhlIHN0b3JhZ2UgZGVwb3NpdCB0aGUgY2FsbGVyIHBheXMgaXMgdGhlCi8vIGFudGktc3BhbS4gVGhlIGN1cnJlbnQgcHJvdG9jb2wgZmVlIGlzIHNuYXBzaG90dGVkIGludG8gdGhlIHNlcnZpY2UKLy8gYW5kIG11c3Qgbm90IGV4Y2VlZCBtYXhGZWVCcHMsIHRoZSBjZWlsaW5nIHRoZSBwcm92aWRlciBzaWduZWQgZm9yIOKAlAovLyBwYXNzIE1heEZlZUJwcyB0byBhY2NlcHQgYW55IGxlZ2FsIGZlZS4KLy8KLy8gUHJvdmlkZXJzIG1heSBiZSBFT0FzIG9yIHJlYWxtcywgYnV0IGEgcmVhbG0gcHJvdmlkZXIgdGFrZXMgb24gdGhyZWUKLy8gb2JsaWdhdGlvbnMgdGhhdCB0aGlzIHJlYWxtIGNhbm5vdCBjaGVjayBmb3IgaXQuIFJlYWxtIGJ5dGVzIGFyZQovLyBpbW11dGFibGUgYWZ0ZXIgYWRkcGtnLCBzbyBhIHJlYWxtIGRlcGxveWVkIHdpdGhvdXQgdGhlbSBjYW5ub3QKLy8gYWNxdWlyZSB0aGVtIGxhdGVyOiBmYWlsaW5nICgxKSBtZWFucyBpdCBuZXZlciBlYXJucywgZmFpbGluZyAoMikgb3IKLy8gKDMpIG1lYW5zIHdoYXQgaXQgZWFybmVkIGlzIHBlcm1hbmVudGx5IHN0cmFuZGVkLgovLwovLyAgMS4gSXQgbXVzdCBhbHJlYWR5IGV4cG9zZSBhIGNyb3NzaW5nIGVudHJ5cG9pbnQgdGhhdCBjYWxscwovLyAgICAgTWFya0RlbGl2ZXJlZC4gVGhhdCBpcyB0aGUgb25seSB0cmFuc2l0aW9uIHRvIE9yZGVyRGVsaXZlcmVkLCBhbmQKLy8gICAgIGJvdGggcmVsZWFzZSBwYXRocyByZXF1aXJlIGl0LCBzbyBhIHByb3ZpZGVyIHJlYWxtIHRoYXQgY2Fubm90Ci8vICAgICBjYWxsIGl0IG5ldmVyIGVhcm5zIGEgY3JlZGl0IGF0IGFsbCDigJQgZXZlcnkgb3JkZXIgYWdhaW5zdCBpdCBydW5zCi8vICAgICB0byBDbGFpbVJlZnVuZCBpbnN0ZWFkLiBUaGlzIG9ibGlnYXRpb24gYmluZHMgYmVmb3JlIHRoZSBuZXh0IG9uZS4KLy8gIDIuIEl0IG11c3QgYWxyZWFkeSBleHBvc2UgYSBjcm9zc2luZyBlbnRyeXBvaW50IHRoYXQgY2FsbHMgQ2xhaW0gb3IKLy8gICAgIENsYWltQWxsIG9uIHRoaXMgcmVhbG0uIEEgY3JlZGl0ZWQgYmFsYW5jZSBpcyBhIHB1bGwsIG5ldmVyIGEKLy8gICAgIHB1c2g7IG5vdGhpbmcgaGVyZSBjYW4gcmVhY2ggaW50byBhIHByb3ZpZGVyIHJlYWxtIHRvIGRlbGl2ZXIgaXQuCi8vICAzLiBJdCBtdXN0IG1ha2UgYm90aCBjYWxscyBpbiB0cmFuc2FjdGlvbnMgd2hvc2UgT1JJR0lOIGNhcnJpZWQgbm8KLy8gICAgIC1zZW5kLCBwZXIgdGhlIFJFQUxNLUNBTExFUiBDQVZFQVQgaW4gdGhlIHBhY2thZ2UgaGVhZGVyLgovLwovLyBUaGUgY3VzdG9tZXIgc2lkZSBpcyBub3Qgc3ltbWV0cmljOiBQdXJjaGFzZVNlcnZpY2UgaXMgcGF5YWJsZSBhbmQKLy8gcm91dGVzIHRocm91Z2ggY29pbmlvLlJlY2VpdmUsIHdoaWNoIHJlcXVpcmVzIGFuIEVPQSBjYWxsaW5nIGRpcmVjdGx5Ci8vIHZpYSBNc2dDYWxsLiBBIHJlYWxtIGNhbiB0aGVyZWZvcmUgc2VsbCBhIHNlcnZpY2UgaGVyZSBidXQgY2Fubm90IGJ1eQovLyBvbmUg4oCUIGFuZCAiY2FuIHNlbGwiIGlzIGV4YWN0bHkgYXMgc3Ryb25nIGFzIHRoZSB0aHJlZSBvYmxpZ2F0aW9ucwovLyBhYm92ZSwgbm8gc3Ryb25nZXIuIEEgY3VzdG9tZXIgaXMgc3RydWN0dXJhbGx5IGFsd2F5cyBhbiBFT0EsIHdoaWNoCi8vIGlzIHdoeSB0aGUgcGVybWlzc2lvbmxlc3MgdmFsdmVzIGFyZSBhbHdheXMgcHVsbGFibGUuCmZ1bmMgUmVnaXN0ZXJTZXJ2aWNlKGN1ciByZWFsbSwgdGl0bGUsIGRlc2NyaXB0aW9uIHN0cmluZywgcHJpY2UsIGRlbGl2ZXJ5QmxvY2tzLCBtYXhGZWVCcHMgaW50NjQpIGludDY0IHsKCWFzc2VydE5vU2VuZCgpCglwcm92aWRlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCglhc3NlcnRWYWxpZFRpdGxlKHRpdGxlKQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NMZW4gewoJCXBhbmljKCJkZXNjcmlwdGlvbiBtdXN0IGJlIGF0IG1vc3QgIiArIHN0cmNvbnYuSXRvYShNYXhEZXNjTGVuKSArICIgY2hhcmFjdGVycyIpCgl9CglpZiBwcmljZSA8IE1pblByaWNlIHsKCQlwYW5pYygicHJpY2UgbXVzdCBiZSBhdCBsZWFzdCAiICsgaXRvYShNaW5QcmljZSkgKyBEZW5vbSkKCX0KCWlmIGRlbGl2ZXJ5QmxvY2tzIDwgTWluRGVsaXZlcnlCbG9ja3MgfHwgZGVsaXZlcnlCbG9ja3MgPiBNYXhEZWxpdmVyeUJsb2NrcyB7CgkJcGFuaWMoImRlbGl2ZXJ5QmxvY2tzIG11c3QgYmUgIiArIGl0b2EoTWluRGVsaXZlcnlCbG9ja3MpICsgIi0iICsgaXRvYShNYXhEZWxpdmVyeUJsb2NrcykpCgl9CglpZiBtYXhGZWVCcHMgPCAwIHx8IG1heEZlZUJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoIm1heEZlZUJwcyBtdXN0IGJlIDAtIiArIGl0b2EoTWF4RmVlQnBzKSkKCX0KCWlmIGZlZUJwcyA+IG1heEZlZUJwcyB7CgkJcGFuaWMoImN1cnJlbnQgZmVlICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyBleGNlZWRzIHlvdXIgY2VpbGluZyBvZiAiICsgaXRvYShtYXhGZWVCcHMpICsgIiBicHMiKQoJfQoJaWYgY291bnRGb3IocHJvdmlkZXIpID49IE1heFNlcnZpY2VzUGVyUHJvdmlkZXIgewoJCXBhbmljKCJhdCBtb3N0ICIgKyBzdHJjb252Lkl0b2EoTWF4U2VydmljZXNQZXJQcm92aWRlcikgKyAiIHNlcnZpY2VzIHBlciBwcm92aWRlciIpCgl9CgoJaWQgOj0gbmV4dFNlcnZpY2UKCW5leHRTZXJ2aWNlKysKCXNlcnZpY2VzLlNldChwYWRJRChpZCksICZzZXJ2aWNlewoJCWlkOiAgICAgICAgICAgICBpZCwKCQlwcm92aWRlcjogICAgICAgcHJvdmlkZXIsCgkJdGl0bGU6ICAgICAgICAgIHRpdGxlLAoJCWRlc2NyaXB0aW9uOiAgICBkZXNjcmlwdGlvbiwKCQlwcmljZTogICAgICAgICAgcHJpY2UsCgkJZGVsaXZlcnlCbG9ja3M6IGRlbGl2ZXJ5QmxvY2tzLAoJCWZlZUJwczogICAgICAgICBmZWVCcHMsCgkJc3RhdHVzOiAgICAgICAgIFNlcnZpY2VBY3RpdmUsCgl9KQoJYnVtcEZvcihwcm92aWRlciwgMSkKCgljaGFpbi5FbWl0KCJTZXJ2aWNlUmVnaXN0ZXJlZCIsCgkJImlkIiwgaXRvYShpZCksCgkJInByb3ZpZGVyIiwgcHJvdmlkZXIuU3RyaW5nKCksCgkJInByaWNlIiwgaXRvYShwcmljZSksCgkJImZlZUJwcyIsIGl0b2EoZmVlQnBzKSwKCSkKCXJldHVybiBpZAp9CgovLyBSZXRpcmVTZXJ2aWNlIHN0b3BzIGEgc2VydmljZSBhY2NlcHRpbmcgTkVXIG9yZGVycy4gT3JkZXJzIGFscmVhZHkgaW4KLy8gZmxpZ2h0IGtlZXAgdGhlaXIgb3duIGNvcGllcyBvZiBwcm92aWRlciwgYW1vdW50IGFuZCBmZWUsIGFuZCBydW4gdG8KLy8gdGhlaXIgb3duIHRlcm1pbmFsIHN0YXRlcyB1bmFmZmVjdGVkLiBQcm92aWRlciBvbmx5LCBhbmQgdGVybWluYWwg4oCUCi8vIHRoZXJlIGlzIG5vIHVuLXJldGlyZSwgc28gYSBjdXN0b21lciByZWFkaW5nICJhY3RpdmUiIGNhbm5vdCBoYXZlIGl0Ci8vIGZsaWNrZXIgdW5kZXJuZWF0aCB0aGVtLgpmdW5jIFJldGlyZVNlcnZpY2UoY3VyIHJlYWxtLCBpZCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCXMgOj0gbXVzdEdldFNlcnZpY2UoaWQpCglpZiBjYWxsZXIgIT0gcy5wcm92aWRlciB7CgkJcGFuaWMoIm9ubHkgdGhlIHByb3ZpZGVyIG1heSByZXRpcmUgdGhpcyBzZXJ2aWNlIikKCX0KCWlmIHMuc3RhdHVzICE9IFNlcnZpY2VBY3RpdmUgewoJCXBhbmljKCJzZXJ2aWNlIGlzIG5vdCBhY3RpdmUiKQoJfQoJcy5zdGF0dXMgPSBTZXJ2aWNlUmV0aXJlZAoJYnVtcEZvcihzLnByb3ZpZGVyLCAtMSkKCgljaGFpbi5FbWl0KCJTZXJ2aWNlUmV0aXJlZCIsICJpZCIsIGl0b2EoaWQpLCAicHJvdmlkZXIiLCBzLnByb3ZpZGVyLlN0cmluZygpKQp9CgovLyAtLS0gY3VzdG9tZXIgc2lkZSAtLS0KCi8vIFB1cmNoYXNlU2VydmljZSBlc2Nyb3dzIEVYQUNUTFkgdGhlIGxpc3RlZCBwcmljZSBhbmQgb3BlbnMgYW4gb3JkZXIuCi8vIFRoZSBjYWxsZXIgbXVzdCBiZSBhbiBFT0EgKGNvaW5pby5SZWNlaXZlIGlzIHRoZSByZWNlaXB0LWd1YXJhbnRlZWQKLy8gc2hhcGUpIGFuZCBtdXN0IGF0dGFjaCBleGFjdGx5IHRoZSBwcmljZSBpbiB1Z25vdDsgYW55IG1pc21hdGNoIGFib3J0cwovLyBhbmQgdGhlIGNvaW5zIHJldmVydCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU2VsZi1wdXJjaGFzZSBpcyByZWplY3RlZC4KZnVuYyBQdXJjaGFzZVNlcnZpY2UoY3VyIHJlYWxtLCBzZXJ2aWNlSUQgaW50NjQpIGludDY0IHsKCWN1c3RvbWVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCXMgOj0gbXVzdEdldFNlcnZpY2Uoc2VydmljZUlEKQoJaWYgcy5zdGF0dXMgIT0gU2VydmljZUFjdGl2ZSB7CgkJcGFuaWMoInNlcnZpY2UgaXMgbm90IGFjdGl2ZSIpCgl9CglpZiBjdXN0b21lciA9PSBzLnByb3ZpZGVyIHsKCQlwYW5pYygidGhlIHByb3ZpZGVyIGNhbm5vdCBwdXJjaGFzZSB0aGVpciBvd24gc2VydmljZSIpCgl9CglpZiBhbW91bnQgIT0gcy5wcmljZSB7CgkJcGFuaWMoInNlbmQgZXhhY3RseSB0aGUgbGlzdGVkIHByaWNlOiAiICsgaXRvYShzLnByaWNlKSArIERlbm9tKQoJfQoKCW5ld0VzY3Jvdywgb2sgOj0gY2hlY2tlZEFkZChlc2Nyb3dUb3RhbCwgYW1vdW50KQoJaWYgIW9rIHsKCQlwYW5pYygiZXNjcm93IHRvdGFsIHdvdWxkIG92ZXJmbG93IikKCX0KCglpZCA6PSBuZXh0T3JkZXIKCW5leHRPcmRlcisrCglvcmRlcnMuU2V0KHBhZElEKGlkKSwgJm9yZGVyewoJCWlkOiAgICAgICAgICAgICAgIGlkLAoJCXNlcnZpY2VJRDogICAgICAgIHNlcnZpY2VJRCwKCQljdXN0b21lcjogICAgICAgICBjdXN0b21lciwKCQlwcm92aWRlcjogICAgICAgICBzLnByb3ZpZGVyLAoJCWFtb3VudDogICAgICAgICAgIGFtb3VudCwKCQlmZWVCcHM6ICAgICAgICAgICBzLmZlZUJwcywKCQlzdGF0dXM6ICAgICAgICAgICBPcmRlclB1cmNoYXNlZCwKCQlkZWxpdmVyeURlYWRsaW5lOiBydW50aW1lLkNoYWluSGVpZ2h0KCkgKyBzLmRlbGl2ZXJ5QmxvY2tzLAoJfSkKCWVzY3Jvd1RvdGFsID0gbmV3RXNjcm93CglzLm9yZGVycysrCgoJY2hhaW4uRW1pdCgiU2VydmljZVB1cmNoYXNlZCIsCgkJIm9yZGVySWQiLCBpdG9hKGlkKSwKCQkic2VydmljZUlkIiwgaXRvYShzZXJ2aWNlSUQpLAoJCSJjdXN0b21lciIsIGN1c3RvbWVyLlN0cmluZygpLAoJCSJwcm92aWRlciIsIHMucHJvdmlkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCSkKCXJldHVybiBpZAp9CgovLyBNYXJrRGVsaXZlcmVkIHJlY29yZHMgdGhhdCB0aGUgd29yayBpcyBkb25lIGFuZCBzdGFydHMgdGhlIGFjY2VwdGFuY2UKLy8gd2luZG93LiBQcm92aWRlciBvbmx5LiBUaGUgdXJpIGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gdGhlCi8vIGRlbGl2ZXJhYmxlOyB0aGlzIHJlYWxtIG5laXRoZXIgZmV0Y2hlcyBub3IgaW50ZXJwcmV0cyBpdCwgYW5kIGl0IGlzCi8vIHNhbml0aXplZCBvbiB0aGUgd2F5IG91dCB0byBSZW5kZXIuCi8vCi8vIERlbGl2ZXJpbmcgQUZURVIgdGhlIGRlbGl2ZXJ5IGRlYWRsaW5lIGlzIGFsbG93ZWQgYXMgbG9uZyBhcyBub2JvZHkKLy8gaGFzIHlldCBjYWxsZWQgQ2xhaW1SZWZ1bmQg4oCUIGxhdGUgd29yayB0aGUgY3VzdG9tZXIgc3RpbGwgd2FudHMgc2hvdWxkCi8vIG5vdCBiZSBkZXN0cm95ZWQgYnkgYSBkZWFkbGluZSB0aGF0IGV4aXN0cyB0byBwcm90ZWN0IHRoZSBjdXN0b21lci4KLy8gVGhlIGN1c3RvbWVyJ3MgcmVtZWR5IGlzIHVuY2hhbmdlZDogdGhleSBzaW1wbHkgZG8gbm90IGFjY2VwdCwgYW5kIHRoZQovLyByZWZ1bmQgdmFsdmUgc3RheXMgb3BlbiByaWdodCB1cCB1bnRpbCB0aGlzIHRyYW5zaXRpb24gbGFuZHMuCmZ1bmMgTWFya0RlbGl2ZXJlZChjdXIgcmVhbG0sIG9yZGVySUQgaW50NjQsIHVyaSBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglvIDo9IG11c3RHZXRPcmRlcihvcmRlcklEKQoJaWYgY2FsbGVyICE9IG8ucHJvdmlkZXIgewoJCXBhbmljKCJvbmx5IHRoZSBwcm92aWRlciBtYXkgbWFyayB0aGlzIG9yZGVyIGRlbGl2ZXJlZCIpCgl9CglpZiBvLnN0YXR1cyAhPSBPcmRlclB1cmNoYXNlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIpCgl9CglpZiBsZW4odXJpKSA+IE1heFVSSUxlbiB7CgkJcGFuaWMoInVyaSBtdXN0IGJlIGF0IG1vc3QgIiArIHN0cmNvbnYuSXRvYShNYXhVUklMZW4pICsgIiBjaGFyYWN0ZXJzIikKCX0KCglvLnN0YXR1cyA9IE9yZGVyRGVsaXZlcmVkCglvLmRlbGl2ZXJ5VVJJID0gdXJpCglvLmFjY2VwdGFuY2VEZWFkbGluZSA9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSArIEFjY2VwdGFuY2VCbG9ja3MKCgljaGFpbi5FbWl0KCJPcmRlckRlbGl2ZXJlZCIsCgkJIm9yZGVySWQiLCBpdG9hKG9yZGVySUQpLAoJCSJwcm92aWRlciIsIG8ucHJvdmlkZXIuU3RyaW5nKCksCgkJImFjY2VwdGFuY2VEZWFkbGluZSIsIGl0b2Eoby5hY2NlcHRhbmNlRGVhZGxpbmUpLAoJKQp9CgovLyBBY2NlcHREZWxpdmVyeSBpcyBUSEUgUkVTT0xVVElPTjogdGhlIGN1c3RvbWVyIGFjY2VwdHMgdGhlIGRlbGl2ZXJlZAovLyB3b3JrIGFuZCB0aGUgZXNjcm93IGJlY29tZXMgdGhlIHByb3ZpZGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UsIG1pbnVzCi8vIHRoZSBmZWUgc25hcHNob3R0ZWQgaW50byB0aGUgb3JkZXIgYXQgcHVyY2hhc2UuIEN1c3RvbWVyIG9ubHkuCmZ1bmMgQWNjZXB0RGVsaXZlcnkoY3VyIHJlYWxtLCBvcmRlcklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJbyA6PSBtdXN0R2V0T3JkZXIob3JkZXJJRCkKCWlmIGNhbGxlciAhPSBvLmN1c3RvbWVyIHsKCQlwYW5pYygib25seSB0aGUgY3VzdG9tZXIgbWF5IGFjY2VwdCB0aGlzIGRlbGl2ZXJ5IikKCX0KCWlmIG8uc3RhdHVzICE9IE9yZGVyRGVsaXZlcmVkIHsKCQlwYW5pYygib3JkZXIgaXMgbm90IGF3YWl0aW5nIGFjY2VwdGFuY2UiKQoJfQoJcmVsZWFzZShvLCAiYWNjZXB0ZWQiKQp9CgovLyBSZWxlYXNlVGltZW91dCByZWxlYXNlcyBhIGRlbGl2ZXJlZCBvcmRlciB0byB0aGUgcHJvdmlkZXIgb25jZSB0aGUKLy8gYWNjZXB0YW5jZSB3aW5kb3cgaGFzIGxhcHNlZC4gUGVybWlzc2lvbmxlc3M6IGEgY3VzdG9tZXIgd2hvIHN0b3BzCi8vIHJlc3BvbmRpbmcgbXVzdCBub3QgYmUgYWJsZSB0byBzdHJhbmQgYSBwcm92aWRlcidzIGNvbXBsZXRlZCB3b3JrLgovLyBUaGlzIGlzIGRlZW1lZCBhY2NlcHRhbmNlLCBhbmQgaXQgaXMgdGhlIG9ubHkgcGF0aCBieSB3aGljaCBlc2Nyb3cKLy8gcmVhY2hlcyBhIHByb3ZpZGVyIHdpdGhvdXQgdGhlIGN1c3RvbWVyJ3MgZXhwbGljaXQgYWN0LgpmdW5jIFJlbGVhc2VUaW1lb3V0KGN1ciByZWFsbSwgb3JkZXJJRCBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCW8gOj0gbXVzdEdldE9yZGVyKG9yZGVySUQpCglpZiBvLnN0YXR1cyAhPSBPcmRlckRlbGl2ZXJlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBhY2NlcHRhbmNlIikKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IG8uYWNjZXB0YW5jZURlYWRsaW5lIHsKCQlwYW5pYygiYWNjZXB0YW5jZSB3aW5kb3cgaGFzIG5vdCBsYXBzZWQ6ICIgKwoJCQlpdG9hKG8uYWNjZXB0YW5jZURlYWRsaW5lLXJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkgKyAiIGJsb2NrcyByZW1haW4iKQoJfQoJcmVsZWFzZShvLCAidGltZW91dCIpCn0KCi8vIERlY2xpbmVPcmRlciByZXR1cm5zIHRoZSBlc2Nyb3cgdG8gdGhlIGN1c3RvbWVyIGJlZm9yZSBkZWxpdmVyeS4KLy8gUHJvdmlkZXIgb25seSwgZmVlLWZyZWUg4oCUIGEgcHJvdmlkZXIgd2hvIGNhbm5vdCBmdWxmaWwgc2hvdWxkIGJlIGFibGUKLy8gdG8gaGFuZCB0aGUgbW9uZXkgc3RyYWlnaHQgYmFjayByYXRoZXIgdGhhbiB3YWl0IG91dCBhIGRlYWRsaW5lLiBTYWZlCi8vIHRvIGFsbG93IHVuaWxhdGVyYWxseSBiZWNhdXNlIGl0IG9ubHkgZXZlciBtb3ZlcyB2YWx1ZSBBV0FZIGZyb20gdGhlCi8vIGNhbGxlci4KZnVuYyBEZWNsaW5lT3JkZXIoY3VyIHJlYWxtLCBvcmRlcklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJbyA6PSBtdXN0R2V0T3JkZXIob3JkZXJJRCkKCWlmIGNhbGxlciAhPSBvLnByb3ZpZGVyIHsKCQlwYW5pYygib25seSB0aGUgcHJvdmlkZXIgbWF5IGRlY2xpbmUgdGhpcyBvcmRlciIpCgl9CglpZiBvLnN0YXR1cyAhPSBPcmRlclB1cmNoYXNlZCB7CgkJcGFuaWMoIm9yZGVyIGlzIG5vdCBhd2FpdGluZyBkZWxpdmVyeSIpCgl9CglyZWZ1bmQobywgImRlY2xpbmVkIikKfQoKLy8gQ2xhaW1SZWZ1bmQgcmV0dXJucyB0aGUgZXNjcm93IHRvIHRoZSBjdXN0b21lciBvbmNlIHRoZSBwcm92aWRlciBoYXMKLy8gbWlzc2VkIHRoZSBkZWxpdmVyeSBkZWFkbGluZS4gUGVybWlzc2lvbmxlc3M6IGEgcHJvdmlkZXIgd2hvIGFiYW5kb25zCi8vIGFuIG9yZGVyIG11c3Qgbm90IGJlIGFibGUgdG8gc3RyYW5kIHRoZSBjdXN0b21lcidzIG1vbmV5LgovLwovLyBJdCBpcyBmZWUtZnJlZS4gQ2hhcmdpbmcgYSBwcm90b2NvbCBmZWUgb24gYSByZWZ1bmQgd291bGQgbWVhbiB0aGUKLy8gbWFya2V0cGxhY2UgcHJvZml0cyBmcm9tIHByb3ZpZGVyIG5vbi1wZXJmb3JtYW5jZS4KZnVuYyBDbGFpbVJlZnVuZChjdXIgcmVhbG0sIG9yZGVySUQgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglvIDo9IG11c3RHZXRPcmRlcihvcmRlcklEKQoJaWYgby5zdGF0dXMgIT0gT3JkZXJQdXJjaGFzZWQgewoJCXBhbmljKCJvcmRlciBpcyBub3QgYXdhaXRpbmcgZGVsaXZlcnkiKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgby5kZWxpdmVyeURlYWRsaW5lIHsKCQlwYW5pYygiZGVsaXZlcnkgd2luZG93IGhhcyBub3QgbGFwc2VkOiAiICsKCQkJaXRvYShvLmRlbGl2ZXJ5RGVhZGxpbmUtcnVudGltZS5DaGFpbkhlaWdodCgpKSArICIgYmxvY2tzIHJlbWFpbiIpCgl9CglyZWZ1bmQobywgImV4cGlyZWQiKQp9CgovLyAtLS0gcGF5b3V0cyAtLS0KCi8vIENsYWltIHNlbmRzIGFtb3VudCB1Z25vdCBvZiB0aGUgY2FsbGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UgYmFjayB0byB0aGUKLy8gY2FsbGVyLgpmdW5jIENsYWltKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgZXJyIDo9IGxlZGdlci5XaXRoZHJhdyhjYWxsZXIuU3RyaW5nKCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gQ2xhaW1BbGwgc2VuZHMgdGhlIGNhbGxlcidzIGVudGlyZSBjbGFpbWFibGUgYmFsYW5jZSBiYWNrIHRvIHRoZQovLyBjYWxsZXIuIEZhaWxzIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xhaW0uCmZ1bmMgQ2xhaW1BbGwoY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYW1vdW50LCBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3QWxsKGNhbGxlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm90aGluZyB0byBjbGFpbSIpCgl9Cgljb2luaW8uUGF5b3V0KDAsIGN1ciwgY2FsbGVyLCBEZW5vbSwgYW1vdW50KQoJY2hhaW4uRW1pdCgiQ2xhaW0iLCAidG8iLCBjYWxsZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFdpdGhkcmF3RmVlcyBzZW5kcyB0aGUgYWNjcnVlZCBmZWUgcG90IHRvIHRoZSBmZWUgcmVjaXBpZW50LiBPbmx5IHRoZQovLyBmZWUgcmVjaXBpZW50IG1heSBjYWxsIGl0LgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygib25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgd2l0aGRyYXcgZmVlcyIpCgl9CglpZiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWFtb3VudCA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBmZWVSZWNpcGllbnQsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBTd2VlcERlbm9tIHNlbmRzIHRoZSBzdXJwbHVzIG9mIGEgc2luZ2xlIGRlbm9taW5hdGlvbiB0byB0aGUgZmVlCi8vIHJlY2lwaWVudC4gRm9yIHVnbm90IG9ubHkgdGhlIGV4Y2VzcyBvdmVyIExpYWJpbGl0aWVzKCkgbW92ZXMg4oCUIHdoaWNoCi8vIHJlc2VydmVzIGxpdmUgZXNjcm93IGFzIHdlbGwgYXMgY2xhaW1hYmxlIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdCDigJQKLy8gYW5kIG90aGVyIGRlbm9tcyBtb3ZlIHdob2xseS4gT25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgY2FsbCBpdC4KZnVuYyBTd2VlcERlbm9tKGN1ciByZWFsbSwgZGVub20gc3RyaW5nKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgY2FsbGVyICE9IGZlZVJlY2lwaWVudCB7CgkJcGFuaWMoIm9ubHkgdGhlIGZlZSByZWNpcGllbnQgbWF5IHN3ZWVwIHN1cnBsdXMiKQoJfQoJcmVzZXJ2ZSA6PSBpbnQ2NCgwKQoJaWYgZGVub20gPT0gRGVub20gewoJCXJlc2VydmUgPSBMaWFiaWxpdGllcygpCgl9Cglzd2VwdCA6PSBjb2luaW8uU3dlZXAoMCwgY3VyLCBmZWVSZWNpcGllbnQsIGRlbm9tLCByZXNlcnZlKQoJY2hhaW4uRW1pdCgiU3VycGx1c1N3ZXB0IiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiY29pbnMiLCBpdG9hKHN3ZXB0KStkZW5vbSkKfQoKLy8gLS0tIGFkbWluaXN0cmF0aW9uIC0tLQoKLy8gU2V0RmVlQnBzIHNldHMgdGhlIHByb3RvY29sIGZlZSBzbmFwc2hvdHRlZCBpbnRvIEZVVFVSRSBzZXJ2aWNlcy4KLy8gRXhpc3Rpbmcgc2VydmljZXMsIGFuZCBldmVyeSBvcmRlciBhbHJlYWR5IHBsYWNlZCBhZ2FpbnN0IHRoZW0sIGtlZXAKLy8gdGhlIGZlZSB0aGV5IHdlcmUgY3JlYXRlZCB1bmRlci4gQWRtaW4gb25seTsgYm91bmRlZCBieSBbMCwgTWF4RmVlQnBzXS4KZnVuYyBTZXRGZWVCcHMoY3VyIHJlYWxtLCBicHMgaW50NjQpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBicHMgPCAwIHx8IGJwcyA+IE1heEZlZUJwcyB7CgkJcGFuaWMoImZlZSBtdXN0IGJlIDAtIiArIGl0b2EoTWF4RmVlQnBzKSArICIgYnBzIikKCX0KCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlQ2hhbmdlZCIsICJicHMiLCBpdG9hKGJwcykpCn0KCi8vIFNldEZlZVJlY2lwaWVudCBzZXRzIHRoZSBhZGRyZXNzIHRoYXQgbWF5IHdpdGhkcmF3IGZlZXMgYW5kIHN3ZWVwCi8vIHN1cnBsdXMuIEFkbWluIG9ubHkuCmZ1bmMgU2V0RmVlUmVjaXBpZW50KGN1ciByZWFsbSwgbmV4dCBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgIW5leHQuSXNWYWxpZCgpIHsKCQlwYW5pYygiaW52YWxpZCBmZWUgcmVjaXBpZW50IGFkZHJlc3MiKQoJfQoJZmVlUmVjaXBpZW50ID0gbmV4dAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50Q2hhbmdlZCIsICJ0byIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gc3RhZ2VzIGEgc3VjY2Vzc29yLiBUd28tc3RlcDogdGhlIHN1Y2Nlc3NvciBtdXN0IGNhbGwKLy8gQWNjZXB0QWRtaW4sIHNvIGEgdHlwbyBjYW5ub3Qgb3JwaGFuIHRoZSByZWFsbS4gQWRtaW4gb25seS4gUGFzc2luZwovLyB0aGUgemVybyBhZGRyZXNzIGNhbmNlbHMgYSBwZW5kaW5nIG5vbWluYXRpb247IGFueSBvdGhlciB2YWx1ZSBtdXN0IGJlCi8vIGEgd2VsbC1mb3JtZWQgYWRkcmVzcywgZm9yIHBhcml0eSB3aXRoIFNldEZlZVJlY2lwaWVudC4gVGhlIHR3by1zdGVwCi8vIGhhbmRvdmVyIGFscmVhZHkgbWFkZSBhIG1hbGZvcm1lZCBub21pbmVlIGhhcm1sZXNzIOKAlCBpdCBjb3VsZCBuZXZlcgovLyBjYWxsIEFjY2VwdEFkbWluIOKAlCBzbyB0aGlzIGNoZWNrIHJlamVjdHMgdGhlIHR5cG8gYXQgdGhlIHBvaW50IGl0IGlzCi8vIG1hZGUgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdGFnZWQgYW5kIHJlYWRhYmxlIGFzIGEgcmVhbCBub21pbmF0aW9uLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBuZXh0IGFkZHJlc3MpIHsKCWFzc2VydE5vU2VuZCgpCglhc3NlcnRBZG1pbihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBuZXh0ICE9ICIiICYmICFuZXh0LklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgYWRtaW4gYWRkcmVzcyIpCgl9CglwZW5kaW5nQWRtaW4gPSBuZXh0CgljaGFpbi5FbWl0KCJBZG1pbk5vbWluYXRlZCIsICJ0byIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIHN0YWdlZCBoYW5kb3Zlci4gT25seSB0aGUgbm9taW5lZSBtYXkgY2FsbCBpdC4KZnVuYyBBY2NlcHRBZG1pbihjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBwZW5kaW5nQWRtaW4gPT0gIiIgfHwgY2FsbGVyICE9IHBlbmRpbmdBZG1pbiB7CgkJcGFuaWMoIm9ubHkgdGhlIG5vbWluYXRlZCBhZG1pbiBtYXkgYWNjZXB0IikKCX0KCWFkbWluID0gY2FsbGVyCglwZW5kaW5nQWRtaW4gPSAiIgoJY2hhaW4uRW1pdCgiQWRtaW5UcmFuc2ZlcnJlZCIsICJ0byIsIGFkbWluLlN0cmluZygpKQp9CgovLyAtLS0gdmlld3MgLS0tCgpmdW5jIFNlcnZpY2VJbmZvKGlkIGludDY0KSAocHJvdmlkZXIgYWRkcmVzcywgdGl0bGUgc3RyaW5nLCBwcmljZSwgZGVsaXZlcnlCbG9ja3MsIGZlZUJwcyBpbnQ2NCwgc3RhdHVzIHN0cmluZywgb3JkZXJDb3VudCBpbnQ2NCkgewoJcyA6PSBtdXN0R2V0U2VydmljZShpZCkKCXJldHVybiBzLnByb3ZpZGVyLCBzLnRpdGxlLCBzLnByaWNlLCBzLmRlbGl2ZXJ5QmxvY2tzLCBzLmZlZUJwcywgcy5zdGF0dXMsIHMub3JkZXJzCn0KCmZ1bmMgU2VydmljZURlc2NyaXB0aW9uKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdEdldFNlcnZpY2UoaWQpLmRlc2NyaXB0aW9uIH0KCmZ1bmMgT3JkZXJJbmZvKGlkIGludDY0KSAoc2VydmljZUlEIGludDY0LCBjdXN0b21lciwgcHJvdmlkZXIgYWRkcmVzcywgYW1vdW50LCBmZWVCcHMgaW50NjQsIHN0YXR1cyBzdHJpbmcpIHsKCW8gOj0gbXVzdEdldE9yZGVyKGlkKQoJcmV0dXJuIG8uc2VydmljZUlELCBvLmN1c3RvbWVyLCBvLnByb3ZpZGVyLCBvLmFtb3VudCwgby5mZWVCcHMsIG8uc3RhdHVzCn0KCi8vIE9yZGVyRGVhZGxpbmVzIHJldHVybnMgdGhlIHR3byBhYnNvbHV0ZSBoZWlnaHRzIHRoYXQgZ292ZXJuIGFuIG9yZGVyLgovLyBhY2NlcHRhbmNlRGVhZGxpbmUgaXMgMCB1bnRpbCB0aGUgb3JkZXIgaXMgZGVsaXZlcmVkLgpmdW5jIE9yZGVyRGVhZGxpbmVzKGlkIGludDY0KSAoZGVsaXZlcnlEZWFkbGluZSwgYWNjZXB0YW5jZURlYWRsaW5lIGludDY0KSB7CglvIDo9IG11c3RHZXRPcmRlcihpZCkKCXJldHVybiBvLmRlbGl2ZXJ5RGVhZGxpbmUsIG8uYWNjZXB0YW5jZURlYWRsaW5lCn0KCmZ1bmMgT3JkZXJVUkkoaWQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0R2V0T3JkZXIoaWQpLmRlbGl2ZXJ5VVJJIH0KCi8vIFF1b3RlIHJlcG9ydHMgd2hhdCBhIHB1cmNoYXNlIG9mIHRoaXMgc2VydmljZSB3b3VsZCBjb3N0IGFuZCB3aGF0IHRoZQovLyBwcm92aWRlciB3b3VsZCByZWNlaXZlIG9uIHJlc29sdXRpb24sIGF0IHRoZSBzZXJ2aWNlJ3Mgc25hcHNob3R0ZWQgZmVlLgpmdW5jIFF1b3RlKGlkIGludDY0KSAocHJpY2UsIGZlZSwgdG9Qcm92aWRlciBpbnQ2NCkgewoJcyA6PSBtdXN0R2V0U2VydmljZShpZCkKCWYsIGVyciA6PSBmZWVsZWRnZXIuRmVlRm9yKHMucHJpY2UsIHMuZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIHMucHJpY2UsIGYsIHMucHJpY2UgLSBmCn0KCmZ1bmMgQWRtaW4oKSBhZGRyZXNzICAgICAgICAgICAgIHsgcmV0dXJuIGFkbWluIH0KZnVuYyBQZW5kaW5nQWRtaW4oKSBhZGRyZXNzICAgICAgeyByZXR1cm4gcGVuZGluZ0FkbWluIH0KZnVuYyBGZWVSZWNpcGllbnQoKSBhZGRyZXNzICAgICAgeyByZXR1cm4gZmVlUmVjaXBpZW50IH0KZnVuYyBGZWVCcHMoKSBpbnQ2NCAgICAgICAgICAgICAgeyByZXR1cm4gZmVlQnBzIH0KZnVuYyBOdW1TZXJ2aWNlcygpIGludDY0ICAgICAgICAgeyByZXR1cm4gbmV4dFNlcnZpY2UgfQpmdW5jIE51bU9yZGVycygpIGludDY0ICAgICAgICAgICB7IHJldHVybiBuZXh0T3JkZXIgfQpmdW5jIFNlcnZpY2VzT2YoYSBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBjb3VudEZvcihhKSB9CgpmdW5jIEJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYWRkci5TdHJpbmcoKSkgfQpmdW5jIFVzZXJzVG90YWwoKSBpbnQ2NCAgICAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQpmdW5jIEZlZXNBY2NydWVkKCkgaW50NjQgICAgICAgICAgIHsgcmV0dXJuIGxlZGdlci5GZWVzQWNjcnVlZCgpIH0KCi8vIEVzY3Jvd1RvdGFsIGlzIHRoZSBsaXZlIGVzY3JvdyBwb29sIEU6IHRoZSBzdW0gb2YgZXZlcnkgb3JkZXIgc3RpbGwgaW4KLy8gUHVyY2hhc2VkIG9yIERlbGl2ZXJlZC4KZnVuYyBFc2Nyb3dUb3RhbCgpIGludDY0IHsgcmV0dXJuIGVzY3Jvd1RvdGFsIH0KCi8vIExpYWJpbGl0aWVzIGlzIGV2ZXJ5dGhpbmcgdGhpcyByZWFsbSBvd2VzOiBsaXZlIGVzY3JvdywgY2xhaW1hYmxlCi8vIGJhbGFuY2VzIGFuZCB0aGUgZmVlIHBvdC4gU3dlZXBEZW5vbSByZXNlcnZlcyBleGFjdGx5IHRoaXMuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiBlc2Nyb3dUb3RhbCArIGxlZGdlci5MaWFiaWxpdGllcygpIH0KCmZ1bmMgSGVsZCgpIGludDY0ICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQpmdW5jIFN1cnBsdXMoKSBpbnQ2NCAgIHsgcmV0dXJuIEhlbGQoKSAtIExpYWJpbGl0aWVzKCkgfQpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHNlbGYgfQpmdW5jIEhlaWdodCgpIGludDY0ICAgIHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9CgovLyAtLS0gcmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBsZW4ocGF0aCkgPiAyICYmIHBhdGhbOjJdID09ICJzLyIgewoJCXJldHVybiByZW5kZXJTZXJ2aWNlKHBhdGhbMjpdKQoJfQoJaWYgbGVuKHBhdGgpID4gMiAmJiBwYXRoWzoyXSA9PSAiby8iIHsKCQlyZXR1cm4gcmVuZGVyT3JkZXIocGF0aFsyOl0pCgl9CgloZWxkIDo9IEhlbGQoKQoJbGlhYiA6PSBMaWFiaWxpdGllcygpCglzdGF0dXMgOj0gIk9LIgoJaWYgaGVsZCA8IGxpYWIgewoJCXN0YXR1cyA9ICJWSU9MQVRFRCIKCX0KCW91dCA6PSAiIyBTZXJ2aWNlIG1hcmtldHBsYWNlXG5cbiIKCW91dCArPSAiUHJvdmlkZXJzIHB1Ymxpc2ggc2VydmljZXM7IGN1c3RvbWVycyBwdXJjaGFzZSBpbnRvIGVzY3JvdzsgcGF5bWVudCBpc1xuIgoJb3V0ICs9ICJyZWxlYXNlZCBvbmx5IG9uIGFjY2VwdGFuY2UsIG9yIHdoZW4gdGhlIGFjY2VwdGFuY2Ugd2luZG93IGxhcHNlcy5cblxuIgoJb3V0ICs9ICIjIyBDb25maWd1cmF0aW9uXG5cbiIKCW91dCArPSAiLSBmZWUgZm9yIG5ldyBzZXJ2aWNlczogIiArIGl0b2EoZmVlQnBzKSArICIgYnBzIChjYXAgIiArIGl0b2EoTWF4RmVlQnBzKSArCgkJIiBicHM7IGVhY2ggc2VydmljZSBrZWVwcyB0aGUgZmVlIHNuYXBzaG90dGVkIGF0IHJlZ2lzdHJhdGlvbilcbiIKCW91dCArPSAiLSBhY2NlcHRhbmNlIHdpbmRvdzogIiArIGl0b2EoQWNjZXB0YW5jZUJsb2NrcykgKyAiIGJsb2Nrc1xuIgoJb3V0ICs9ICItIGZlZSByZWNpcGllbnQ6ICIgKyBmZWVSZWNpcGllbnQuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYWRtaW46ICIgKyBhZG1pbi5TdHJpbmcoKSArICJcblxuIgoJb3V0ICs9ICIjIyBBY2NvdW50aW5nIChIID09IEUgKyBVICsgRiArIFMpXG5cbiIKCW91dCArPSAiLSBlc2Nyb3cgaGVsZCBmb3Igb3BlbiBvcmRlcnMgKEUpOiAiICsgaXRvYShlc2Nyb3dUb3RhbCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjbGFpbWFibGUgYmFsYW5jZXMgKFUpOiAiICsgaXRvYShsZWRnZXIuVXNlcnNUb3RhbCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGZlZXMgYWNjcnVlZCAoRik6ICIgKyBpdG9hKGxlZGdlci5GZWVzQWNjcnVlZCgpKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGhlbGQgKEgpOiAiICsgaXRvYShoZWxkKSArIERlbm9tICsgIlxuIgoJb3V0ICs9ICItIGNvbnNlcnZhdGlvbjogIiArIHN0YXR1cyArICJcblxuIgoJb3V0ICs9ICIjIyBMYXRlc3Qgc2VydmljZXNcblxuIgoJaWYgbmV4dFNlcnZpY2UgPT0gMCB7CgkJb3V0ICs9ICJObyBzZXJ2aWNlcyB5ZXQuXG4iCgkJcmV0dXJuIG91dAoJfQoJc2hvd24gOj0gMAoJc2VydmljZXMuUmV2ZXJzZUl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJcyA6PSB2Ligqc2VydmljZSkKCQlvdXQgKz0gIi0gWyMiICsgaXRvYShzLmlkKSArICJdKCIgKyByZWFsbVBhdGggKyAiOnMvIiArIGl0b2Eocy5pZCkgKyAiKSBbIiArCgkJCXMuc3RhdHVzICsgIl0gIiArIHMudGl0bGUgKyAiIOKAlCAiICsgaXRvYShzLnByaWNlKSArIERlbm9tICsgIlxuIgoJCXNob3duKysKCQlyZXR1cm4gc2hvd24gPj0gUmVuZGVyTGltaXQKCX0pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyU2VydmljZShhcmcgc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KGFyZywgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gaW52YWxpZCBzZXJ2aWNlIGlkXG4iCgl9Cgl2IDo9IHNlcnZpY2VzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gdW5rbm93biBzZXJ2aWNlIGlkXG4iCgl9CglzIDo9IHYuKCpzZXJ2aWNlKQoJb3V0IDo9ICIjIFNlcnZpY2UgIyIgKyBpdG9hKHMuaWQpICsgIjogIiArIHMudGl0bGUgKyAiXG5cbiIKCW91dCArPSAiLSBzdGF0dXM6ICIgKyBzLnN0YXR1cyArICJcbiIKCW91dCArPSAiLSBwcm92aWRlcjogIiArIHMucHJvdmlkZXIuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gcHJpY2U6ICIgKyBpdG9hKHMucHJpY2UpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gZGVsaXZlcnkgd2luZG93OiAiICsgaXRvYShzLmRlbGl2ZXJ5QmxvY2tzKSArICIgYmxvY2tzXG4iCglvdXQgKz0gIi0gZmVlIChzbmFwc2hvdCk6ICIgKyBpdG9hKHMuZmVlQnBzKSArICIgYnBzXG4iCglvdXQgKz0gIi0gb3JkZXJzIHBsYWNlZDogIiArIGl0b2Eocy5vcmRlcnMpICsgIlxuIgoJb3V0ICs9ICJcbiMjIERlc2NyaXB0aW9uXG5cbiIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHMuZGVzY3JpcHRpb24pICsgIlxuIgoJcmV0dXJuIG91dAp9CgpmdW5jIHJlbmRlck9yZGVyKGFyZyBzdHJpbmcpIHN0cmluZyB7CglpZCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoYXJnLCAxMCwgNjQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiBpbnZhbGlkIG9yZGVyIGlkXG4iCgl9Cgl2IDo9IG9yZGVycy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IHVua25vd24gb3JkZXIgaWRcbiIKCX0KCW8gOj0gdi4oKm9yZGVyKQoJb3V0IDo9ICIjIE9yZGVyICMiICsgaXRvYShvLmlkKSArICJcblxuIgoJb3V0ICs9ICItIHN0YXR1czogIiArIG8uc3RhdHVzICsgIlxuIgoJb3V0ICs9ICItIHNlcnZpY2U6IFsjIiArIGl0b2Eoby5zZXJ2aWNlSUQpICsgIl0oIiArIHJlYWxtUGF0aCArICI6cy8iICsgaXRvYShvLnNlcnZpY2VJRCkgKyAiKVxuIgoJb3V0ICs9ICItIGN1c3RvbWVyOiAiICsgby5jdXN0b21lci5TdHJpbmcoKSArICJcbiIKCW91dCArPSAiLSBwcm92aWRlcjogIiArIG8ucHJvdmlkZXIuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYW1vdW50OiAiICsgaXRvYShvLmFtb3VudCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWUgKHNuYXBzaG90KTogIiArIGl0b2Eoby5mZWVCcHMpICsgIiBicHNcbiIKCW91dCArPSAiLSBkZWxpdmVyeSBkZWFkbGluZTogaGVpZ2h0ICIgKyBpdG9hKG8uZGVsaXZlcnlEZWFkbGluZSkgKyAiXG4iCglpZiBvLmFjY2VwdGFuY2VEZWFkbGluZSAhPSAwIHsKCQlvdXQgKz0gIi0gYWNjZXB0YW5jZSBkZWFkbGluZTogaGVpZ2h0ICIgKyBpdG9hKG8uYWNjZXB0YW5jZURlYWRsaW5lKSArICJcbiIKCX0KCWlmIG8uZGVsaXZlcnlVUkkgIT0gIiIgewoJCW91dCArPSAiXG4jIyBEZWxpdmVyeVxuXG4iICsgc2FuaXRpemUuSW5saW5lVGV4dChvLmRlbGl2ZXJ5VVJJKSArICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmNvbnN0IHJlYWxtUGF0aCA9ICIvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NlcnZpY2VfbWFya2V0IgoKLy8gcmVsZWFzZSBtb3ZlcyBhbiBvcmRlcidzIGVzY3JvdyBpbnRvIHRoZSBwcm92aWRlcidzIGNsYWltYWJsZSBiYWxhbmNlCi8vIGF0IHRoZSBvcmRlcidzIHNuYXBzaG90dGVkIGZlZSwgYW5kIGRyaXZlcyB0aGUgb3JkZXIgdGVybWluYWwuIFRoZQovLyBzdGF0dXMgd3JpdGUgYW5kIHRoZSBlc2Nyb3cgZGVjcmVtZW50IGhhcHBlbiB0b2dldGhlciB3aXRoIHRoZSBjcmVkaXQsCi8vIHNvIG5vIG9yZGVyIGNhbiBiZSByZWxlYXNlZCB0d2ljZSBhbmQgRSBzdGF5cyBleGFjdGx5IM6jIG9wZW4gYW1vdW50cy4KZnVuYyByZWxlYXNlKG8gKm9yZGVyLCByZWFzb24gc3RyaW5nKSB7CgljcmVkaXRlZCwgZmVlLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoby5wcm92aWRlci5TdHJpbmcoKSwgby5hbW91bnQsIG8uZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJby5zdGF0dXMgPSBPcmRlclJlbGVhc2VkCgllc2Nyb3dUb3RhbCAtPSBvLmFtb3VudCAvLyA+PSAwOiBlc2Nyb3dUb3RhbCA9PSDOoyBvcGVuIGFtb3VudHMgPj0gby5hbW91bnQKCgljaGFpbi5FbWl0KCJPcmRlclJlbGVhc2VkIiwKCQkib3JkZXJJZCIsIGl0b2Eoby5pZCksCgkJInByb3ZpZGVyIiwgby5wcm92aWRlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShvLmFtb3VudCksCgkJImNyZWRpdGVkIiwgaXRvYShjcmVkaXRlZCksCgkJImZlZSIsIGl0b2EoZmVlKSwKCQkicmVhc29uIiwgcmVhc29uLAoJKQp9CgovLyByZWZ1bmQgbW92ZXMgYW4gb3JkZXIncyBlc2Nyb3cgaW50byB0aGUgY3VzdG9tZXIncyBjbGFpbWFibGUgYmFsYW5jZQovLyBhdCBaRVJPIGZlZSBhbmQgZHJpdmVzIHRoZSBvcmRlciB0ZXJtaW5hbC4KZnVuYyByZWZ1bmQobyAqb3JkZXIsIHJlYXNvbiBzdHJpbmcpIHsKCWNyZWRpdGVkLCBfLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoby5jdXN0b21lci5TdHJpbmcoKSwgby5hbW91bnQsIDApCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglvLnN0YXR1cyA9IE9yZGVyUmVmdW5kZWQKCWVzY3Jvd1RvdGFsIC09IG8uYW1vdW50CgoJY2hhaW4uRW1pdCgiT3JkZXJSZWZ1bmRlZCIsCgkJIm9yZGVySWQiLCBpdG9hKG8uaWQpLAoJCSJjdXN0b21lciIsIG8uY3VzdG9tZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJyZWFzb24iLCByZWFzb24sCgkpCn0KCi8vIGFzc2VydE5vU2VuZCByZWZ1c2VzIGNvaW5zIG9uIG5vbi1wYXlhYmxlIGVudHJ5cG9pbnRzOiBhbiBhY2NpZGVudGFsCi8vIC1zZW5kIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgYXQgdGhlIHJlYWxtIGFzIHN3ZWVwLW9ubHkgc3VycGx1cy4KLy8gUHVyY2hhc2VTZXJ2aWNlIGlzIHRoZSBvbmx5IHBheWFibGUgZnVuY3Rpb24uIE5PVEU6IHRoaXMgcmVhZHMgdGhlCi8vIE9SSUdJTiBlbnZlbG9wZSDigJQgc2VlIHRoZSByZWFsbS1wcm92aWRlciBjYXZlYXQgaW4gdGhlIGhlYWRlci4KZnVuYyBhc3NlcnROb1NlbmQoKSB7CglpZiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgIT0gMCB7CgkJcGFuaWMoInRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKZnVuYyBhc3NlcnRBZG1pbihjYWxsZXIgYWRkcmVzcykgewoJaWYgY2FsbGVyICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9Cn0KCmZ1bmMgbXVzdEdldFNlcnZpY2UoaWQgaW50NjQpICpzZXJ2aWNlIHsKCXYgOj0gc2VydmljZXMuR2V0KHBhZElEKGlkKSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biBzZXJ2aWNlIGlkIikKCX0KCXJldHVybiB2Ligqc2VydmljZSkKfQoKZnVuYyBtdXN0R2V0T3JkZXIoaWQgaW50NjQpICpvcmRlciB7Cgl2IDo9IG9yZGVycy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIG9yZGVyIGlkIikKCX0KCXJldHVybiB2Ligqb3JkZXIpCn0KCi8vIGNvdW50Rm9yIHJlcG9ydHMgaG93IG1hbnkgQUNUSVZFIHNlcnZpY2VzIGFuIGFkZHJlc3MgaG9sZHMuCmZ1bmMgY291bnRGb3IoYSBhZGRyZXNzKSBpbnQ2NCB7Cgl2IDo9IHByb3ZpZGVyTnVtLkdldChhLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gKih2LigqaW50NjQpKQp9CgovLyBidW1wRm9yIGFkanVzdHMgdGhlIGFjdGl2ZS1zZXJ2aWNlIGNvdW50ZXIsIHJlbW92aW5nIHRoZSBlbnRyeSBhdCB6ZXJvCi8vIHNvIGEgcHJvdmlkZXIgd2hvIHJldGlyZXMgZXZlcnl0aGluZyBzdG9wcyBwYXlpbmcgZm9yIHRoZSBzbG90LgpmdW5jIGJ1bXBGb3IoYSBhZGRyZXNzLCBkZWx0YSBpbnQ2NCkgewoJa2V5IDo9IGEuU3RyaW5nKCkKCXYgOj0gcHJvdmlkZXJOdW0uR2V0KGtleSkKCWlmIHYgPT0gbmlsIHsKCQlpZiBkZWx0YSA8PSAwIHsKCQkJcmV0dXJuCgkJfQoJCW4gOj0gZGVsdGEKCQlwcm92aWRlck51bS5TZXQoa2V5LCAmbikKCQlyZXR1cm4KCX0KCXAgOj0gdi4oKmludDY0KQoJKnAgKz0gZGVsdGEKCWlmICpwIDw9IDAgewoJCXByb3ZpZGVyTnVtLlJlbW92ZShrZXkpCgl9Cn0KCi8vIGFzc2VydFZhbGlkVGl0bGUgYm91bmRzIGxlbmd0aCBhbmQgcmVzdHJpY3RzIHRoZSBjaGFyc2V0IHNvIHRpdGxlcyBhcmUKLy8gbGlzdC1zYWZlIGluIFJlbmRlciB3aXRob3V0IGVzY2FwaW5nLgpmdW5jIGFzc2VydFZhbGlkVGl0bGUodGl0bGUgc3RyaW5nKSB7CglpZiBsZW4odGl0bGUpID09IDAgfHwgbGVuKHRpdGxlKSA+IE1heFRpdGxlTGVuIHsKCQlwYW5pYygidGl0bGUgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4VGl0bGVMZW4pICsgIiBjaGFyYWN0ZXJzIikKCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4odGl0bGUpOyBpKysgewoJCWMgOj0gdGl0bGVbaV0KCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnYScgJiYgYyA8PSAneic6CgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdaJzoKCQljYXNlIGMgPj0gJzAnICYmIGMgPD0gJzknOgoJCWNhc2UgYyA9PSAnICcgfHwgYyA9PSAnXycgfHwgYyA9PSAnLSc6CgkJZGVmYXVsdDoKCQkJcGFuaWMoInRpdGxlIG1heSBvbmx5IGNvbnRhaW4gbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgXyBhbmQgLSIpCgkJfQoJfQp9CgovLyBwYWRJRCByZW5kZXJzIGFuIGlkIGFzIGEgZml4ZWQtd2lkdGgga2V5IHNvIGF2bCBpdGVyYXRpb24gb3JkZXIgaXMKLy8gbnVtZXJpYyBvcmRlci4KZnVuYyBwYWRJRChpZCBpbnQ2NCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDEyIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJYyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIGMgPCBhKSB8fCAoYiA8IDAgJiYgYyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBjLCB0cnVlCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKQp9CiINMTAwMDAwMDB1Z25vdBISCJLRqE8SCzE2NjM0MnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkBJaixC1Qodhg6H9eebcRGbPhpYbkcgPy70bqcglZFgnX12UrcV39TlXWpuetVq3vLYSXFaemUqGMKu9O480iqKGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}