{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "YPxEpH+4w4yhF2CQdtE7LcHnXEB7HXCnCDD+zx+uMLo=",
    "height": "605546",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "28675",
            "fee_delta": "2867500ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/service_registry"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "50568121",
      "GasUsed": "33712081"
    },
    "tx": "CvecAQoML3ZtLm1fYWRkcGtnEuWcAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKonAEKEHNlcnZpY2VfcmVnaXN0cnkSRGduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zZXJ2aWNlX3JlZ2lzdHJ5GmsKC2dub21vZC50b21sElxtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NlcnZpY2VfcmVnaXN0cnkiCmdubyA9ICIwLjkiChrfmgEKFHNlcnZpY2VfcmVnaXN0cnkuZ25vEsWaAXBhY2thZ2Ugc2VydmljZV9yZWdpc3RyeQoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgkidGltZSIKCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gU2VydmljZSByZXByZXNlbnRzIGEgcmVnaXN0ZXJlZCBvbi1jaGFpbiBzZXJ2aWNlLgp0eXBlIFNlcnZpY2Ugc3RydWN0IHsKCU5hbWUgICAgICAgIHN0cmluZwoJT3duZXIgICAgICAgYWRkcmVzcwoJUmVnaXN0cmFudCAgYWRkcmVzcyAvLyBPUklHSU5BTCByZWdpc3RyYW50OyBpbW11dGFibGUgdGhyb3VnaCB0cmFuc2ZlcnMKCVBrZ1BhdGggICAgIHN0cmluZyAgLy8gdGhlIHJlYWxtIHRoZSBzZXJ2aWNlIGxpdmVzIGF0IOKAlCB3aGF0IGludGVncmF0b3JzIHJlc29sdmUKCURlc2NyaXB0aW9uIHN0cmluZwoJU2VydmljZVR5cGUgc3RyaW5nIC8vIGUuZy4gInRva2VuIiwgImRleCIsICJvcmFjbGUiLCAiZGFvIiwgIm5mdCIsICJicmlkZ2UiCglNZXRhZGF0YSAgICBzdHJpbmcgLy8gZnJlZWZvcm0ga2V5PXZhbHVlIHBhaXJzIG9yIEpTT04gYmxvYgp9CgovLyBSZXNlcnZhdGlvbiBob2xkcyBhIGRlcmVnaXN0ZXJlZCBuYW1lIGZvciBpdHMgZm9ybWVyIG93bmVyIEFORCBpdHMKLy8gb3JpZ2luYWwgcmVnaXN0cmFudCwgYW5kIEVYUElSRVMgKHJlLWF1ZGl0IDIwMjYtMDktMDIpOiBhbiBldGVybmFsCi8vIHJlc2VydmF0aW9uIGxldCBhbiBhdHRhY2tlciBjeWNsZSByZWdpc3Rlci9kZXJlZ2lzdGVyIHRvIGxvY2sgdGhlCi8vIHdob2xlIG5hbWVzcGFjZSBmb3JldmVyLCBhbmQgYSBob3N0aWxlIHRyYW5zZmVyZWUgY291bGQgc3RyYW5kIGEKLy8gbmFtZSBhZ2FpbnN0IGl0cyBvcmlnaW5hbCByZWdpc3RyYW50IHBlcm1hbmVudGx5Lgp0eXBlIFJlc2VydmF0aW9uIHN0cnVjdCB7CglPd25lciAgICAgIGFkZHJlc3MKCVJlZ2lzdHJhbnQgYWRkcmVzcwoJRXhwaXJlcyAgICB0aW1lLlRpbWUKfQoKY29uc3QgKAoJLy8gTWF4U2VydmljZXMgaXMgYSBwdXJlIHN0YXRlIGJvdW5kLCBub3QgYW4gYW50aS1zcXVhdCBkZWZlbnNlIOKAlAoJLy8gTWF4U2VydmljZXNQZXJPd25lciBpcyB3aGF0IG1ha2VzIG1vbm9wb2xpemF0aW9uIGV4cGVuc2l2ZQoJLy8gKHBlYXJsIGF1ZGl0IFIxKS4gS2VwdCBhdCAxMDAwIHJhdGhlciB0aGFuIHJhaXNlZCBmdXJ0aGVyIHNvIHRoZQoJLy8gbGluZWFyIHNjYW5zIG92ZXIgYG5hbWVzYCAoRGVyZWdpc3RlciwgTGlzdFNlcnZpY2VzLCBMaXN0QnlUeXBlKQoJLy8gc3RheSBib3VuZGVkIGF0IGEgc2l6ZSBvbmUgdHJhbnNhY3Rpb24gY2FuIGNvbWZvcnRhYmx5IHBheSBmb3IuCglNYXhTZXJ2aWNlcyA9IDEwMDAKCgkvLyBNYXhTZXJ2aWNlc1Blck93bmVyIGNhcHMgaG93IG1hbnkgbmFtZXMgb25lIGFkZHJlc3MgbWF5IGhvbGQgYXQKCS8vIG9uY2UuIEVuZm9yY2VkIGF0IHJlZ2lzdHJhdGlvbiBhbmQsIGZvciBhIGhhbmRvZmYsIGF0IHRoZSBtb21lbnQKCS8vIHRoZSByZWNpcGllbnQgQ09OU0VOVFMgKHNlZSBBY2NlcHRPd25lcnNoaXApLgoJTWF4U2VydmljZXNQZXJPd25lciA9IDIwCgoJTWF4TmFtZUxlbiAgICAgICAgPSA2NAoJTWF4VHlwZUxlbiAgICAgICAgPSAzMgoJTWF4UGtnUGF0aExlbiAgICAgPSAxMjgKCU1heERlc2NyaXB0aW9uTGVuID0gNTAwCglNYXhNZXRhZGF0YUxlbiAgICA9IDIwMDAKCglwa2dQYXRoUHJlZml4ID0gImduby5sYW5kLyIKCgkvLyBSZXNlcnZhdGlvblBlcmlvZCBpcyBob3cgbG9uZyBhIGRlcmVnaXN0ZXJlZCBuYW1lIHN0YXlzIHJlc2VydmVkLgoJLy8gTG9uZyBlbm91Z2ggZm9yIGludGVncmF0b3JzIHRvIG5vdGljZSB0aGUgZGVyZWdpc3RyYXRpb247IGZpbml0ZQoJLy8gc28gdG9tYnN0b25lcyBjYW5ub3QgbG9jayB0aGUgbmFtZXNwYWNlIGZvcmV2ZXIuCglSZXNlcnZhdGlvblBlcmlvZCA9IGludDY0KDkwICogMjQgKiAzNjAwKSAvLyA5MCBkYXlzCgoJLy8gTWF4UmVuZGVyU2VydmljZXMgYm91bmRzIHRoZSBnbm93ZWIgdGFibGUuIFJlbmRlciBpcyByZWFjaGFibGUgYnkKCS8vIGFueSB2aWV3ZXIsIHNvIGl0cyBjb3N0IGxhbmRzIG9uIHRoaXJkIHBhcnRpZXMgcmF0aGVyIHRoYW4gb24KCS8vIHdob2V2ZXIgZ3JldyB0aGUgc3RhdGUgKHBlYXJsIGF1ZGl0IFkzKS4gQ29tcGxldGUgZGF0YSBjb21lcyBmcm9tCgkvLyB0aGUgYm91bmRlZCBxdWVyaWVzIG5hbWVkIGluIHRoZSB0cnVuY2F0aW9uIG5vdGljZS4KCU1heFJlbmRlclNlcnZpY2VzID0gMjUKCgkvLyByZW5kZXJEZXNjTGVuIGlzIHRoZSBwZXItcm93IGRlc2NyaXB0aW9uIGJ1ZGdldCwgYXBwbGllZCB0byB0aGUKCS8vIFJBVyB0ZXh0IGJlZm9yZSBlc2NhcGluZyBzbyBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbmV2ZXIgc3BsaXQuCglyZW5kZXJEZXNjTGVuID0gNjAKKQoKdmFyICgKCXNlcnZpY2VzIG1hcFtzdHJpbmddKlNlcnZpY2UKCW5hbWVzICAgIFtdc3RyaW5nIC8vIGluc2VydGlvbi1vcmRlcmVkIGxpc3QgZm9yIGRldGVybWluaXN0aWMgaXRlcmF0aW9uCgkvLyByZXRpcmVkIG1hcHMgYSBkZXJlZ2lzdGVyZWQgbmFtZSB0byBpdHMgdGltZS1ib3VuZGVkIHJlc2VydmF0aW9uLgoJcmV0aXJlZCBtYXBbc3RyaW5nXSpSZXNlcnZhdGlvbgoJLy8gb3duZXJTZXJ2aWNlcyBpcyB0aGUgTygxKSBpbmRleCBiYWNraW5nIE1heFNlcnZpY2VzUGVyT3duZXIuIEl0IGlzCgkvLyBrZXB0IHplcm8tZnJlZTogYW4gb3duZXIgdGhhdCBkcm9wcyB0byB6ZXJvIGlzIGRlbGV0ZWQgb3V0cmlnaHQgc28KCS8vIHRoZSBtYXAgY2Fubm90IGFjY3VtdWxhdGUgZGVhZCBrZXlzLgoJb3duZXJTZXJ2aWNlcyBtYXBbYWRkcmVzc11pbnQKCS8vIHBlbmRpbmdPd25lcnMgaG9sZHMgbm9taW5hdGVkLWJ1dC1ub3QteWV0LWFjY2VwdGVkIG93bmVycwoJLy8gKHBlYXJsIGF1ZGl0IFk0KS4gQSBuYW1lIGFwcGVhcnMgaGVyZSBvbmx5IHdoaWxlIGEgaGFuZG9mZiBpcyBvcGVuLgoJcGVuZGluZ093bmVycyBtYXBbc3RyaW5nXWFkZHJlc3MKKQoKZnVuYyBpbml0KCkgewoJc2VydmljZXMgPSBtYWtlKG1hcFtzdHJpbmddKlNlcnZpY2UpCgluYW1lcyA9IFtdc3RyaW5ne30KCXJldGlyZWQgPSBtYWtlKG1hcFtzdHJpbmddKlJlc2VydmF0aW9uKQoJb3duZXJTZXJ2aWNlcyA9IG1ha2UobWFwW2FkZHJlc3NdaW50KQoJcGVuZGluZ093bmVycyA9IG1ha2UobWFwW3N0cmluZ11hZGRyZXNzKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCAocGVhcmwgYXVkaXQKLy8gWTIpOiB0aGlzIHJlYWxtIGhhbmRsZXMgbm8gZnVuZHMsIGhvbGRzIG5vIGJhbmtlciBhbmQgZXhwb3NlcyBubwovLyB3aXRoZHJhd2FsLCBzbyBhbiBhdHRhY2hlZCBzZW5kIHdvdWxkIHN0cmFuZCBvbiB0aGUgcmVhbG0gYWRkcmVzcwovLyBmb3JldmVyLiBBYm9ydGluZyByZXZlcnRzIHRoZSB0cmFuc2ZlciBiYWNrIHRvIHRoZSBzZW5kZXIuIEZhaWxzIG9wZW4KLy8gZm9yIHJlYWxtLXJvdXRlZCBjYWxscywgd2hvc2UgYXR0YWNoZWQgc2VuZCBsYW5kcyBvbiB0aGUgaW50ZXJtZWRpYXJ5Ci8vIHJlYWxtLCBuZXZlciBoZXJlLgpmdW5jIHJlamVjdFN0cmF5U2VuZChjdXIgcmVhbG0pIHsKCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygidGhpcyByZWFsbSBkb2VzIG5vdCBhY2NlcHQgY29pbnMiKQoJfQp9CgovLyAtLS0tLS0tLS0tIHF1b3RhIGluZGV4IC0tLS0tLS0tLS0KCmZ1bmMgcXVvdGFBZGQob3duZXIgYWRkcmVzcykgewoJb3duZXJTZXJ2aWNlc1tvd25lcl0gPSBvd25lclNlcnZpY2VzW293bmVyXSArIDEKfQoKZnVuYyBxdW90YURyb3Aob3duZXIgYWRkcmVzcykgewoJbiA6PSBvd25lclNlcnZpY2VzW293bmVyXSAtIDEKCWlmIG4gPD0gMCB7CgkJZGVsZXRlKG93bmVyU2VydmljZXMsIG93bmVyKQoJCXJldHVybgoJfQoJb3duZXJTZXJ2aWNlc1tvd25lcl0gPSBuCn0KCmZ1bmMgYXNzZXJ0UXVvdGEob3duZXIgYWRkcmVzcykgewoJaWYgb3duZXJTZXJ2aWNlc1tvd25lcl0gPj0gTWF4U2VydmljZXNQZXJPd25lciB7CgkJcGFuaWMoImFkZHJlc3MgYWxyZWFkeSBob2xkcyB0aGUgbWF4aW11bSBvZiAiICsKCQkJc3RyY29udi5JdG9hKE1heFNlcnZpY2VzUGVyT3duZXIpICsgIiBzZXJ2aWNlcyIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0gdmFsaWRhdGlvbiBoZWxwZXJzIC0tLS0tLS0tLS0KCmZ1bmMgaXNWYWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBNYXhOYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgdmFsaWRhdGVQa2dQYXRoKHBrZ1BhdGggc3RyaW5nKSB7CglpZiBwa2dQYXRoID09ICIiIHsKCQlwYW5pYygicGtncGF0aCBtdXN0IG5vdCBiZSBlbXB0eSIpCgl9CglpZiBsZW4ocGtnUGF0aCkgPiBNYXhQa2dQYXRoTGVuIHsKCQlwYW5pYygicGtncGF0aCBleGNlZWRzICIgKyBzdHJjb252Lkl0b2EoTWF4UGtnUGF0aExlbikgKyAiIGNoYXJzIikKCX0KCWlmICFzdHJpbmdzLkhhc1ByZWZpeChwa2dQYXRoLCBwa2dQYXRoUHJlZml4KSB7CgkJcGFuaWMoInBrZ3BhdGggbXVzdCBzdGFydCB3aXRoICIgKyBwa2dQYXRoUHJlZml4ICsgIiBhbmQgbmFtZSBhIHBhY2thZ2UiKQoJfQoJLy8gc3RydWN0dXJhbCwgcGVyLWVsZW1lbnQgdmFsaWRhdGlvbiAocmUtYXVkaXQ6IHRoZSBvbGQgY2hhcnNldCBjaGVjawoJLy8gYWNjZXB0ZWQgIi4uIiwgIi8vIiwgdHJhaWxpbmcgc2xhc2hlcywgaHlwaGVucywgYW5kIG5vbi1yL3Agcm9vdHMg4oCUCgkvLyBhbGwgbG9va2FsaWtlLXNxdWF0IG9yIGFsbG93bGlzdC1ieXBhc3MgbWF0ZXJpYWwpCgllbGVtcyA6PSBzdHJpbmdzLlNwbGl0KHBrZ1BhdGhbbGVuKHBrZ1BhdGhQcmVmaXgpOl0sICIvIikKCWlmIGxlbihlbGVtcykgPCAyIHx8IChlbGVtc1swXSAhPSAiciIgJiYgZWxlbXNbMF0gIT0gInAiKSB7CgkJcGFuaWMoInBrZ3BhdGggbXVzdCBiZSBnbm8ubGFuZC9yLy4uLiBvciBnbm8ubGFuZC9wLy4uLiIpCgl9Cglmb3IgXywgZSA6PSByYW5nZSBlbGVtc1sxOl0gewoJCWlmIGUgPT0gIiIgewoJCQlwYW5pYygicGtncGF0aCBjb250YWlucyBhbiBlbXB0eSBlbGVtZW50IikKCQl9CgkJaWYgIShlWzBdID49ICdhJyAmJiBlWzBdIDw9ICd6JykgewoJCQlwYW5pYygiaW52YWxpZCBwa2dwYXRoIGVsZW1lbnQ6ICIgKyBlKQoJCX0KCQlmb3IgXywgYyA6PSByYW5nZSBlIHsKCQkJaWYgISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnXycpIHsKCQkJCXBhbmljKCJpbnZhbGlkIHBrZ3BhdGggZWxlbWVudDogIiArIGUpCgkJCX0KCQl9Cgl9Cn0KCmZ1bmMgdmFsaWRhdGVGaWVsZHMoZGVzY3JpcHRpb24sIHNlcnZpY2VUeXBlLCBtZXRhZGF0YSBzdHJpbmcpIHsKCWlmIGRlc2NyaXB0aW9uID09ICIiIHsKCQlwYW5pYygiZGVzY3JpcHRpb24gbXVzdCBub3QgYmUgZW1wdHkiKQoJfQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA+IE1heERlc2NyaXB0aW9uTGVuIHsKCQlwYW5pYygiZGVzY3JpcHRpb24gZXhjZWVkcyAiICsgc3RyY29udi5JdG9hKE1heERlc2NyaXB0aW9uTGVuKSArICIgY2hhcnMiKQoJfQoJaWYgc2VydmljZVR5cGUgPT0gIiIgewoJCXBhbmljKCJzZXJ2aWNlIHR5cGUgbXVzdCBub3QgYmUgZW1wdHkiKQoJfQoJaWYgbGVuKHNlcnZpY2VUeXBlKSA+IE1heFR5cGVMZW4gfHwgIWlzVmFsaWROYW1lKHNlcnZpY2VUeXBlKSB7CgkJcGFuaWMoInNlcnZpY2UgdHlwZSBtdXN0IGJlIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcywgbWF4ICIgKwoJCQlzdHJjb252Lkl0b2EoTWF4VHlwZUxlbikgKyAiIGNoYXJzIikKCX0KCWlmIGxlbihtZXRhZGF0YSkgPiBNYXhNZXRhZGF0YUxlbiB7CgkJcGFuaWMoIm1ldGFkYXRhIGV4Y2VlZHMgIiArIHN0cmNvbnYuSXRvYShNYXhNZXRhZGF0YUxlbikgKyAiIGNoYXJzIikKCX0KfQoKLy8gdHJ1bmNhdGUgc2hvcnRlbnMgcyB0byBhdCBtb3N0IG4gcnVuZXMgd2l0aG91dCBzcGxpdHRpbmcgYSBtdWx0aWJ5dGUKLy8gY2hhcmFjdGVyLiBBcHBsaWVkIHRvIFJBVyB0ZXh0LCBuZXZlciB0byBlc2NhcGVkIG91dHB1dCDigJQgdHJ1bmNhdGluZwovLyBhZnRlciBlc2NhcGluZyBjb3VsZCBzZXZlciBhIGBceGAgcGFpciBhbmQgbGVhdmUgYSBkYW5nbGluZyBiYWNrc2xhc2guCmZ1bmMgdHJ1bmNhdGUocyBzdHJpbmcsIG4gaW50KSBzdHJpbmcgewoJaWYgbiA8IDQgewoJCXBhbmljKCJ0cnVuY2F0ZTogYnVkZ2V0IHRvbyBzbWFsbCIpCgl9CglydW5lcyA6PSBbXXJ1bmUocykKCWlmIGxlbihydW5lcykgPD0gbiB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiBzdHJpbmcocnVuZXNbOm4tM10pICsgIi4uLiIKfQoKZnVuYyBtdXN0R2V0KG5hbWUgc3RyaW5nKSAqU2VydmljZSB7CglzdmMsIG9rIDo9IHNlcnZpY2VzW25hbWVdCglpZiAhb2sgewoJCXBhbmljKCJzZXJ2aWNlIG5vdCBmb3VuZDogIiArIG5hbWUpCgl9CglyZXR1cm4gc3ZjCn0KCi8vIC0tLS0tLS0tLS0gd3JpdGUgb3BlcmF0aW9ucyAtLS0tLS0tLS0tCgovLyBSZWdpc3RlclNlcnZpY2UgYWRkcyBhIG5ldyBzZXJ2aWNlIHRvIHRoZSByZWdpc3RyeS4gVGhlIGNhbGxlciBiZWNvbWVzCi8vIHRoZSBvd25lci4gTmFtZSBtdXN0IGJlIHVuaXF1ZSwgbG93ZXJjYXNlIGFscGhhbnVtZXJpYy91bmRlcnNjb3Jlcy4KLy8gcGtnUGF0aCBpcyB0aGUgcmVhbG0gdGhlIHNlcnZpY2UgbGl2ZXMgYXQg4oCUIHRoZSBmaWVsZCBpbnRlZ3JhdG9ycwovLyByZXNvbHZlIOKAlCBhbmQgbXVzdCBsb29rIGxpa2UgYSBnbm8ubGFuZCBwYWNrYWdlIHBhdGguIEEgbmFtZSB0aGF0IHdhcwovLyBkZXJlZ2lzdGVyZWQgc3RheXMgcmVzZXJ2ZWQgZm9yIGl0cyBmb3JtZXIgb3duZXIgYW5kIGl0cyBvcmlnaW5hbAovLyByZWdpc3RyYW50IGZvciBSZXNlcnZhdGlvblBlcmlvZC4KLy8KLy8gTk9URTogdGhpcyByZWFsbSBkb2VzIE5PVCBhbmQgY2Fubm90IHZlcmlmeSB0aGF0IHBrZ1BhdGggZXhpc3RzIG9yCi8vIHRoYXQgdGhlIGNhbGxlciBjb250cm9scyBpdC4gU2VlIHRoZSBJTlRFR1JBVE9SIENPTlRSQUNUIG9uIFJlc29sdmUuCmZ1bmMgUmVnaXN0ZXJTZXJ2aWNlKGN1ciByZWFsbSwgbmFtZSwgcGtnUGF0aCwgZGVzY3JpcHRpb24sIHNlcnZpY2VUeXBlLCBtZXRhZGF0YSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCWlmICFpc1ZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoIm5hbWUgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4TmFtZUxlbikgKwoJCQkiIGNoYXJzLCBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMgb25seSIpCgl9Cgl2YWxpZGF0ZVBrZ1BhdGgocGtnUGF0aCkKCXZhbGlkYXRlRmllbGRzKGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEpCglpZiBfLCBleGlzdHMgOj0gc2VydmljZXNbbmFtZV07IGV4aXN0cyB7CgkJcGFuaWMoInNlcnZpY2UgYWxyZWFkeSByZWdpc3RlcmVkOiAiICsgbmFtZSkKCX0KCglyZWdpc3RyYW50IDo9IGMKCWlmIHJlcywgd2FzUmV0aXJlZCA6PSByZXRpcmVkW25hbWVdOyB3YXNSZXRpcmVkIHsKCQlpZiB0aW1lLk5vdygpLkFmdGVyKHJlcy5FeHBpcmVzKSB7CgkJCS8vIE8oMSkgbGF6eSByZWNsYWltOiBhIGxhcHNlZCB0b21ic3RvbmUgaXMgZHJvcHBlZCB0aGUgbW9tZW50CgkJCS8vIGl0IGlzIGNvbnN1bHRlZCwgc28gdGhlIG1hcCBkb2VzIG5vdCBwYXkgdG8ga2VlcCBlbnRyaWVzCgkJCS8vIG5vYm9keSB3aWxsIGV2ZXIgcmVhZCBhZ2Fpbi4KCQkJZGVsZXRlKHJldGlyZWQsIG5hbWUpCgkJfSBlbHNlIHsKCQkJaWYgYyAhPSByZXMuT3duZXIgJiYgYyAhPSByZXMuUmVnaXN0cmFudCB7CgkJCQlwYW5pYygibmFtZSBpcyByZXNlcnZlZCBmb3IgaXRzIGZvcm1lciBvd25lcjogIiArIG5hbWUpCgkJCX0KCQkJLy8gcm91bmQtMyBhdWRpdDogYW4gaW4td2luZG93IHJlLXJlZ2lzdGVyIG11c3QgUFJFU0VSVkUgdGhlCgkJCS8vIG9yaWdpbmFsIHJlZ2lzdHJhbnQg4oCUIG90aGVyd2lzZSBhIGhvc3RpbGUgdHJhbnNmZXJlZSBjb3VsZAoJCQkvLyBkZXJlZ2lzdGVyIGFuZCBpbnN0YW50bHkgcmUtcmVnaXN0ZXIsIHN0YW1waW5nIHRoZW1zZWx2ZXMgYXMKCQkJLy8gcmVnaXN0cmFudCBhbmQgZXJhc2luZyB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIHJlY2xhaW0gcmlnaHQKCQkJaWYgcmVzLlJlZ2lzdHJhbnQgIT0gIiIgewoJCQkJcmVnaXN0cmFudCA9IHJlcy5SZWdpc3RyYW50CgkJCX0KCQl9Cgl9CgoJaWYgbGVuKHNlcnZpY2VzKSA+PSBNYXhTZXJ2aWNlcyB7CgkJcGFuaWMoImdsb2JhbCBzZXJ2aWNlIGxpbWl0IHJlYWNoZWQiKQoJfQoJYXNzZXJ0UXVvdGEoYykKCglzZXJ2aWNlc1tuYW1lXSA9ICZTZXJ2aWNlewoJCU5hbWU6ICAgICAgICBuYW1lLAoJCU93bmVyOiAgICAgICBjLAoJCVJlZ2lzdHJhbnQ6ICByZWdpc3RyYW50LAoJCVBrZ1BhdGg6ICAgICBwa2dQYXRoLAoJCURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwKCQlTZXJ2aWNlVHlwZTogc2VydmljZVR5cGUsCgkJTWV0YWRhdGE6ICAgIG1ldGFkYXRhLAoJfQoJbmFtZXMgPSBhcHBlbmQobmFtZXMsIG5hbWUpCglxdW90YUFkZChjKQoJZGVsZXRlKHJldGlyZWQsIG5hbWUpCgoJY2hhaW4uRW1pdCgiU2VydmljZVJlZ2lzdGVyZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkicGtncGF0aCIsIHBrZ1BhdGgsCgkJInR5cGUiLCBzZXJ2aWNlVHlwZSwKCQkib3duZXIiLCBjLlN0cmluZygpLAoJCSJyZWdpc3RyYW50IiwgcmVnaXN0cmFudC5TdHJpbmcoKSwKCSkKfQoKLy8gVXBkYXRlU2VydmljZSBtb2RpZmllcyBhIHNlcnZpY2UncyBwa2dwYXRoLCBkZXNjcmlwdGlvbiwgdHlwZSwgYW5kCi8vIG1ldGFkYXRhLiBPbmx5IHRoZSByZWdpc3RlcmVkIG93bmVyIGNhbiB1cGRhdGUuIE5hbWUgY2Fubm90IGNoYW5nZS4KLy8KLy8gQW4gdXBkYXRlIE1BWSBSRVBPSU5UIHRoZSBuYW1lIGF0IGEgZGlmZmVyZW50IHBhY2thZ2UgcGF0aC4gVGhhdCBpcyBhCi8vIGRlbGliZXJhdGUgY2FwYWJpbGl0eSAoc2VydmljZXMgbW92ZSwgYW5kIHZlcnNpb25zIHN1cGVyc2VkZSksIGJ1dCBpdAovLyBhbHNvIG1lYW5zIGEgbmFtZSBhbiBpbnRlZ3JhdG9yIHRydXN0cyB0b2RheSBjYW4gcG9pbnQgZWxzZXdoZXJlCi8vIHRvbW9ycm93LiBUaGUgU2VydmljZVVwZGF0ZWQgZXZlbnQgY2FycmllcyBib3RoIHRoZSBvbGQgYW5kIHRoZSBuZXcKLy8gcGF0aCBzcGVjaWZpY2FsbHkgc28gYSByZXBvaW50IGlzIG9ic2VydmFibGUgaW4gdGhlIHRyYW5zYWN0aW9uIGxvZwovLyByYXRoZXIgdGhhbiBzb21ldGhpbmcgYSBjb25zdW1lciBoYXMgdG8gcG9sbCBmb3IuCmZ1bmMgVXBkYXRlU2VydmljZShjdXIgcmVhbG0sIG5hbWUsIHBrZ1BhdGgsIGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBzdmMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdXBkYXRlIHRoaXMgc2VydmljZSIpCgl9Cgl2YWxpZGF0ZVBrZ1BhdGgocGtnUGF0aCkKCXZhbGlkYXRlRmllbGRzKGRlc2NyaXB0aW9uLCBzZXJ2aWNlVHlwZSwgbWV0YWRhdGEpCgoJb2xkUGF0aCA6PSBzdmMuUGtnUGF0aAoJc3ZjLlBrZ1BhdGggPSBwa2dQYXRoCglzdmMuRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgoJc3ZjLlNlcnZpY2VUeXBlID0gc2VydmljZVR5cGUKCXN2Yy5NZXRhZGF0YSA9IG1ldGFkYXRhCgoJY2hhaW4uRW1pdCgiU2VydmljZVVwZGF0ZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkib2xkcGtncGF0aCIsIG9sZFBhdGgsCgkJInBrZ3BhdGgiLCBwa2dQYXRoLAoJCSJ0eXBlIiwgc2VydmljZVR5cGUsCgkJIm93bmVyIiwgc3ZjLk93bmVyLlN0cmluZygpLAoJKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBOT01JTkFURVMgYSBuZXcgb3duZXIgZm9yIGEgc2VydmljZSBlbnRyeTsgdGhlCi8vIG5vbWluZWUgbXVzdCBjYWxsIEFjY2VwdE93bmVyc2hpcCB0byB0YWtlIGNvbnRyb2wgKHBlYXJsIGF1ZGl0IFk0KS4KLy8KLy8gVGhlIG9uZS1zdGVwIGZvcm0gdGhpcyByZXBsYWNlcyB3YXMgYSBwZXJtYW5lbnQtYnJpY2sgaGF6YXJkOgovLyBhZGRyZXNzLklzVmFsaWQoKSBvbmx5IGNoZWNrcyBiZWNoMzIgZm9ybSwgc28gYSB3ZWxsLWZvcm1lZCBidXQKLy8gdW5vd25lZCBkZXN0aW5hdGlvbiBwYXNzZWQgdGhlIGNoZWNrIGFuZCBjb21taXR0ZWQgaW1tZWRpYXRlbHksIGFmdGVyCi8vIHdoaWNoIHRoZSBlbnRyeSBjb3VsZCBuZXZlciBhZ2FpbiBiZSB1cGRhdGVkLCB0cmFuc2ZlcnJlZCBvcgovLyBkZXJlZ2lzdGVyZWQg4oCUIGFuZCBiZWNhdXNlIGl0IGNvdWxkIG5ldmVyIGJlIGRlcmVnaXN0ZXJlZCBpdCBjb3VsZAovLyBuZXZlciBlbnRlciB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGVpdGhlciwgc28gdGhlIE5BTUUgYmVjYW1lIGEKLy8gcGVybWFuZW50IGhvbGUgaW4gYSBzaGFyZWQgZ2xvYmFsIG5hbWVzcGFjZS4KLy8KLy8gTm9taW5hdGlvbiBjaGFuZ2VzIG5vdGhpbmc6IHRoZSBzaXR0aW5nIG93bmVyIGtlZXBzIGZ1bGwgY29udHJvbAovLyB1bnRpbCB0aGUgbm9taW5lZSBjb25zZW50cy4gUGFzc2luZyAiIiBjbGVhcnMgYSBwZW5kaW5nIG5vbWluYXRpb24uCmZ1bmMgVHJhbnNmZXJPd25lcnNoaXAoY3VyIHJlYWxtLCBuYW1lIHN0cmluZywgbmV3T3duZXIgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCXN2YyA6PSBtdXN0R2V0KG5hbWUpCgljIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgYyAhPSBzdmMuT3duZXIgewoJCXBhbmljKCJvbmx5IHRoZSBvd25lciBjYW4gdHJhbnNmZXIgb3duZXJzaGlwIikKCX0KCWlmIG5ld093bmVyID09ICIiIHsKCQlkZWxldGUocGVuZGluZ093bmVycywgbmFtZSkKCQljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlckNhbmNlbGxlZCIsICJuYW1lIiwgbmFtZSwgIm93bmVyIiwgYy5TdHJpbmcoKSkKCQlyZXR1cm4KCX0KCWlmICFuZXdPd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiAiICsgc3RyaW5nKG5ld093bmVyKSkKCX0KCWlmIG5ld093bmVyID09IHN2Yy5Pd25lciB7CgkJcGFuaWMoIm5ldyBvd25lciBpcyBhbHJlYWR5IHRoZSBvd25lciIpCgl9CglwZW5kaW5nT3duZXJzW25hbWVdID0gbmV3T3duZXIKCgljaGFpbi5FbWl0KCJPd25lcnNoaXBUcmFuc2ZlclByb3Bvc2VkIiwKCQkibmFtZSIsIG5hbWUsCgkJIm93bmVyIiwgYy5TdHJpbmcoKSwKCQkicGVuZGluZyIsIG5ld093bmVyLlN0cmluZygpLAoJKQp9CgovLyBBY2NlcHRPd25lcnNoaXAgY29tcGxldGVzIGEgbm9taW5hdGVkIGhhbmRvZmYuIE9ubHkgdGhlIG5vbWluZWUgY2FuCi8vIGFjY2VwdCwgYW5kIHRoZSBub21pbmVlJ3Mgb3duIHF1b3RhIGlzIGNoZWNrZWQgSEVSRSDigJQgYXQgY29uc2VudCDigJQKLy8gc28gYSBub21pbmF0aW9uIGNhbiBuZXZlciBwdXNoIGFuIGFjY291bnQgcGFzdCBNYXhTZXJ2aWNlc1Blck93bmVyCi8vIHdpdGhvdXQgdGhhdCBhY2NvdW50IGFncmVlaW5nIHRvIGl0LgpmdW5jIEFjY2VwdE93bmVyc2hpcChjdXIgcmVhbG0sIG5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWMgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJcGVuZGluZywgb2sgOj0gcGVuZGluZ093bmVyc1tuYW1lXQoJaWYgIW9rIHsKCQlwYW5pYygibm8gcGVuZGluZyBvd25lcnNoaXAgdHJhbnNmZXIgZm9yOiAiICsgbmFtZSkKCX0KCWlmIGMgIT0gcGVuZGluZyB7CgkJcGFuaWMoIm9ubHkgdGhlIG5vbWluYXRlZCBvd25lciBjYW4gYWNjZXB0IikKCX0KCWFzc2VydFF1b3RhKGMpCgoJcHJldiA6PSBzdmMuT3duZXIKCXN2Yy5Pd25lciA9IGMKCXF1b3RhRHJvcChwcmV2KQoJcXVvdGFBZGQoYykKCWRlbGV0ZShwZW5kaW5nT3duZXJzLCBuYW1lKQoKCWNoYWluLkVtaXQoIk93bmVyc2hpcFRyYW5zZmVycmVkIiwKCQkibmFtZSIsIG5hbWUsCgkJImZyb20iLCBwcmV2LlN0cmluZygpLAoJCSJ0byIsIGMuU3RyaW5nKCksCgkpCn0KCi8vIENhbmNlbE93bmVyc2hpcFRyYW5zZmVyIHdpdGhkcmF3cyBhIHBlbmRpbmcgbm9taW5hdGlvbi4gT3duZXItb25seS4KZnVuYyBDYW5jZWxPd25lcnNoaXBUcmFuc2ZlcihjdXIgcmVhbG0sIG5hbWUgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3ZjIDo9IG11c3RHZXQobmFtZSkKCWMgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjICE9IHN2Yy5Pd25lciB7CgkJcGFuaWMoIm9ubHkgdGhlIG93bmVyIGNhbiBjYW5jZWwgYSB0cmFuc2ZlciIpCgl9CglpZiBfLCBvayA6PSBwZW5kaW5nT3duZXJzW25hbWVdOyAhb2sgewoJCXBhbmljKCJubyBwZW5kaW5nIG93bmVyc2hpcCB0cmFuc2ZlciBmb3I6ICIgKyBuYW1lKQoJfQoJZGVsZXRlKHBlbmRpbmdPd25lcnMsIG5hbWUpCgoJY2hhaW4uRW1pdCgiT3duZXJzaGlwVHJhbnNmZXJDYW5jZWxsZWQiLCAibmFtZSIsIG5hbWUsICJvd25lciIsIGMuU3RyaW5nKCkpCn0KCi8vIERlcmVnaXN0ZXIgcmVtb3ZlcyBhIHNlcnZpY2UgZnJvbSB0aGUgcmVnaXN0cnkuIE9ubHkgdGhlIG93bmVyIGNhbgovLyBkZXJlZ2lzdGVyLiBUaGUgbmFtZSBzdGF5cyByZXNlcnZlZCBmb3IgdGhlIGZvcm1lciBvd25lciBhbmQgdGhlCi8vIG9yaWdpbmFsIHJlZ2lzdHJhbnQgZm9yIFJlc2VydmF0aW9uUGVyaW9kIOKAlCBpdCBjYW5ub3QgYmUKLy8gcmUtcmVnaXN0ZXJlZCBieSBhbnlvbmUgZWxzZSBpbiB0aGF0IHdpbmRvdywgc28gaW50ZWdyYXRvcnMgd2hvIHN0aWxsCi8vIHJlc29sdmUgaXQgY2FuIG5ldmVyIGJlIHNpbGVudGx5IHJlZGlyZWN0ZWQgYnkgYSBzcXVhdHRlci4KZnVuYyBEZXJlZ2lzdGVyKGN1ciByZWFsbSwgbmFtZSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCglzdmMgOj0gbXVzdEdldChuYW1lKQoJYyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGMgIT0gc3ZjLk93bmVyIHsKCQlwYW5pYygib25seSB0aGUgb3duZXIgY2FuIGRlcmVnaXN0ZXIiKQoJfQoJcmV0aXJlZFtuYW1lXSA9ICZSZXNlcnZhdGlvbnsKCQlPd25lcjogICAgICBzdmMuT3duZXIsCgkJUmVnaXN0cmFudDogc3ZjLlJlZ2lzdHJhbnQsCgkJRXhwaXJlczogICAgdGltZS5Ob3coKS5BZGQodGltZS5EdXJhdGlvbihSZXNlcnZhdGlvblBlcmlvZCkgKiB0aW1lLlNlY29uZCksCgl9CglkZWxldGUoc2VydmljZXMsIG5hbWUpCglxdW90YURyb3Aoc3ZjLk93bmVyKQoJLy8gYSBub21pbmF0aW9uIG11c3Qgbm90IG91dGxpdmUgdGhlIGVudHJ5IGl0IHdhcyBtYWRlIGFnYWluc3QKCWRlbGV0ZShwZW5kaW5nT3duZXJzLCBuYW1lKQoKCS8vIFJlbW92ZSBmcm9tIG9yZGVyZWQgbGlzdAoJZm9yIGksIG4gOj0gcmFuZ2UgbmFtZXMgewoJCWlmIG4gPT0gbmFtZSB7CgkJCW5hbWVzID0gYXBwZW5kKG5hbWVzWzppXSwgbmFtZXNbaSsxOl0uLi4pCgkJCWJyZWFrCgkJfQoJfQoKCWNoYWluLkVtaXQoIlNlcnZpY2VEZXJlZ2lzdGVyZWQiLAoJCSJuYW1lIiwgbmFtZSwKCQkib3duZXIiLCBzdmMuT3duZXIuU3RyaW5nKCksCgkJInJlZ2lzdHJhbnQiLCBzdmMuUmVnaXN0cmFudC5TdHJpbmcoKSwKCSkKfQoKLy8gLS0tLS0tLS0tLSByZWFkLW9ubHkgcXVlcmllcyAtLS0tLS0tLS0tCgovLyBSZXNvbHZlIHJldHVybnMgdGhlIHBrZ3BhdGggYSBzZXJ2aWNlIG5hbWUgcG9pbnRzIHRvIOKAlCB0aGUgcHJpbWFyeQovLyBpbnRlZ3JhdGlvbiBxdWVyeS4gUGFuaWNzIG9uIHVua25vd24gbmFtZXMgc28gYSBjb25zdW1lciBjYW4gbmV2ZXIKLy8gc2lsZW50bHkgaW50ZWdyYXRlIGFnYWluc3QgYSBtaXNzaW5nIGVudHJ5LgovLwovLyBJTlRFR1JBVE9SIENPTlRSQUNUIOKAlCByZWFkIHRoaXMgYmVmb3JlIHRydXN0aW5nIGEgcmVzb2x1dGlvbjoKLy8KLy8gIDEuIEEgcmVzb2x1dGlvbiBpcyBhbiBBVFRFU1RBVElPTiwgTk9UIEEgUFJPT0YuIFRoaXMgcmVhbG0gcmVjb3JkcwovLyAgICAgdGhhdCBzb21lIGFkZHJlc3MgY2xhaW1lZCBhIG5hbWUgZm9yIHNvbWUgcGFja2FnZSBwYXRoLiBJdCBkb2VzCi8vICAgICBOT1QgdmVyaWZ5IHRoYXQgdGhlIHBhdGggZXhpc3RzLCB0aGF0IGl0IGlzIGRlcGxveWVkLCBvciB0aGF0IHRoZQovLyAgICAgcmVnaXN0cmFudCBjb250cm9scyBpdC4gQ29udHJhc3Qgci9kZW1vL2RlZmkvZ3JjMjByZWcsIHdoaWNoCi8vICAgICBwcm92ZXMgY29udHJvbCBieSByZXF1aXJpbmcgdGhlIHJlZ2lzdGVyZWQgdG9rZW4gb2JqZWN0IHRvCi8vICAgICBvcmlnaW5hdGUgZnJvbSB0aGUgY2FsbGluZyByZWFsbTsgbm8gZXF1aXZhbGVudCBwcm9vZiBleGlzdHMgZm9yCi8vICAgICBhIGJhcmUgcGF0aCBzdHJpbmcsIGFuZCByZXF1aXJpbmcgb25lIHdvdWxkIG1lYW4gb25seSByZWFsbXMg4oCUCi8vICAgICBuZXZlciB0aGVpciBvcGVyYXRvcnMg4oCUIGNvdWxkIGV2ZXIgcmVnaXN0ZXIgYSBuYW1lLCB3aGljaCBpcyBub3QKLy8gICAgIHRoaXMgcmVnaXN0cnkncyBtb2RlbC4KLy8KLy8gIDIuIEEgTkFNRSBJUyBOT1QgQU4gQVVUSE9SSVpBVElPTi4gTmV2ZXIgZ3JhbnQgYSBwcml2aWxlZ2UsIHJvdXRlIGEKLy8gICAgIHBheW1lbnQsIG9yIGFkbWl0IGEgY2FsbGVyIGJlY2F1c2UgUmVzb2x2ZSByZXR1cm5lZCBpdHMgcGF0aC4KLy8gICAgIFJlc29sdXRpb24gYW5zd2VycyAid2hlcmUgZG9lcyB0aGlzIG5hbWUgcG9pbnQiLCBuZXZlciAibWF5IHRoaXMKLy8gICAgIGNhbGxlciBhY3QiLiBEZXJpdmUgYXV0aG9yaXR5IGZyb20geW91ciBvd24gY3Jvc3NpbmcgZW50cnlwb2ludCdzCi8vICAgICBjdXIuUHJldmlvdXMoKSwgb3IgZnJvbSBhbiBleHBsaWNpdCBhY2Nlc3MtY29udHJvbCByZWFsbS4KLy8KLy8gIDMuIFRIRSBUQVJHRVQgQ0FOIENIQU5HRS4gVGhlIG93bmVyIG1heSByZXBvaW50IGEgbmFtZSBhdCBhbnkgdGltZQovLyAgICAgdmlhIFVwZGF0ZVNlcnZpY2UsIGFuZCBvd25lcnNoaXAgaXRzZWxmIGlzIHRyYW5zZmVyYWJsZS4gVHJlYXQgYQovLyAgICAgcmVzb2x1dGlvbiBhcyB2YWxpZCBvbmx5IGZvciB0aGUgdHJhbnNhY3Rpb24gdGhhdCByZWFkIGl0OyBjYWNoZQovLyAgICAgaXQgYW5kIHlvdSBpbmhlcml0IHdoYXRldmVyIHRoZSBuYW1lIHBvaW50cyBhdCBsYXRlci4gVGhlCi8vICAgICBTZXJ2aWNlVXBkYXRlZCBhbmQgT3duZXJzaGlwVHJhbnNmZXJyZWQgZXZlbnRzIGV4aXN0IHNvIG1vdmVtZW50Ci8vICAgICBpcyBkZXRlY3RhYmxlLgpmdW5jIFJlc29sdmUobmFtZSBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gbXVzdEdldChuYW1lKS5Qa2dQYXRoCn0KCi8vIFRyeVJlc29sdmUgaXMgdGhlIG5vbi1wYW5pY2tpbmcgdmFyaWFudCBmb3IgY29uc3VtZXJzIHRoYXQgbmVlZCB0bwovLyBkZWdyYWRlIGdyYWNlZnVsbHkgd2hlbiBhIG5hbWUgZGlzYXBwZWFycyAocmUtYXVkaXQ6IGEgcGFuaWNraW5nLW9ubHkKLy8gcmVhZCBwYXRoIGJyaWNrcyBhbnkgY29uc3VtZXIgcmVhbG0gdGhhdCBjYWxscyBpdCBpbmxpbmUpLiBUaGUKLy8gSU5URUdSQVRPUiBDT05UUkFDVCBkb2N1bWVudGVkIG9uIFJlc29sdmUgYXBwbGllcyBoZXJlIGlkZW50aWNhbGx5LgpmdW5jIFRyeVJlc29sdmUobmFtZSBzdHJpbmcpIChzdHJpbmcsIGJvb2wpIHsKCXN2Yywgb2sgOj0gc2VydmljZXNbbmFtZV0KCWlmICFvayB7CgkJcmV0dXJuICIiLCBmYWxzZQoJfQoJcmV0dXJuIHN2Yy5Qa2dQYXRoLCB0cnVlCn0KCi8vIEdldE93bmVyIHJldHVybnMgdGhlIG93bmVyIGFkZHJlc3Mgb2YgYSBzZXJ2aWNlLgpmdW5jIEdldE93bmVyKG5hbWUgc3RyaW5nKSBhZGRyZXNzIHsKCXJldHVybiBtdXN0R2V0KG5hbWUpLk93bmVyCn0KCi8vIEdldFBlbmRpbmdPd25lciByZXR1cm5zIHRoZSBub21pbmF0ZWQtYnV0LW5vdC15ZXQtYWNjZXB0ZWQgb3duZXIgb2YgYQovLyBzZXJ2aWNlLCBvciAibm9uZSIgd2hlbiBubyBoYW5kb2ZmIGlzIG9wZW4uCmZ1bmMgR2V0UGVuZGluZ093bmVyKG5hbWUgc3RyaW5nKSBzdHJpbmcgewoJbXVzdEdldChuYW1lKQoJaWYgcCwgb2sgOj0gcGVuZGluZ093bmVyc1tuYW1lXTsgb2sgewoJCXJldHVybiBwLlN0cmluZygpCgl9CglyZXR1cm4gIm5vbmUiCn0KCi8vIFNlcnZpY2VDb3VudCByZXR1cm5zIGhvdyBtYW55IHNlcnZpY2VzIGFyZSByZWdpc3RlcmVkIGFuZCB0aGUgZ2xvYmFsCi8vIGNhcCwgc28gYSBjYWxsZXIgY2FuIGNoZWNrIGhlYWRyb29tIHdpdGhvdXQgcHVsbGluZyB0aGUgd2hvbGUgbGlzdC4KZnVuYyBTZXJ2aWNlQ291bnQoKSAoY291bnQsIGxpbWl0IGludCkgewoJcmV0dXJuIGxlbihzZXJ2aWNlcyksIE1heFNlcnZpY2VzCn0KCi8vIE93bmVyU2VydmljZUNvdW50IHJldHVybnMgaG93IG1hbnkgc2VydmljZXMgYW4gYWRkcmVzcyBjdXJyZW50bHkgaG9sZHMKLy8gYW5kIHRoZSBwZXItb3duZXIgY2FwLgpmdW5jIE93bmVyU2VydmljZUNvdW50KG93bmVyIGFkZHJlc3MpIChjb3VudCwgbGltaXQgaW50KSB7CglyZXR1cm4gb3duZXJTZXJ2aWNlc1tvd25lcl0sIE1heFNlcnZpY2VzUGVyT3duZXIKfQoKLy8gR2V0U2VydmljZSByZXR1cm5zIGEgZm9ybWF0dGVkIHN1bW1hcnkgb2YgYSByZWdpc3RlcmVkIHNlcnZpY2UuIEZyZWUKLy8gdGV4dCBpcyBlc2NhcGVkIGZvciBhIHNpbmdsZS1saW5lIG1hcmtkb3duIHNsb3QuCmZ1bmMgR2V0U2VydmljZShuYW1lIHN0cmluZykgc3RyaW5nIHsKCXN2YyA6PSBtdXN0R2V0KG5hbWUpCgoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJOYW1lOiAiICsgc3ZjLk5hbWUgKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiT3duZXI6ICIgKyBzdHJpbmcoc3ZjLk93bmVyKSArICJcbiIpCgliLldyaXRlU3RyaW5nKCJQa2dQYXRoOiAiICsgc3ZjLlBrZ1BhdGggKyAiXG4iKQoJYi5Xcml0ZVN0cmluZygiVHlwZTogIiArIHN2Yy5TZXJ2aWNlVHlwZSArICJcbiIpCgliLldyaXRlU3RyaW5nKCJEZXNjcmlwdGlvbjogIiArIHNhbml0aXplLklubGluZVRleHQoc3ZjLkRlc2NyaXB0aW9uKSArICJcbiIpCglpZiBzdmMuTWV0YWRhdGEgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoIk1ldGFkYXRhOiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChzdmMuTWV0YWRhdGEpICsgIlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIExpc3RTZXJ2aWNlcyByZXR1cm5zIGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQKLy8gc3RyaW5nIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4KLy8KLy8gQ09TVCBOT1RFOiB0aGlzIGlzIE8oTWF4U2VydmljZXMpIGFuZCBpcyBkZWxpYmVyYXRlbHkgTk9UIHRydW5jYXRlZCDigJQKLy8gYW4gaW50ZWdyYXRvciBlbnVtZXJhdGluZyB0aGUgcmVnaXN0cnkgbmVlZHMgdGhlIGNvbXBsZXRlIHNldCwgYW5kIHRoZQovLyBjYWxsZXIgcGF5cyBmb3IgaXRzIG93biByZWFkLiBSZW5kZXIsIHdob3NlIGNvc3QgbGFuZHMgb24gdGhpcmQtcGFydHkKLy8gdmlld2VycyBpbnN0ZWFkLCBJUyBib3VuZGVkLgpmdW5jIExpc3RTZXJ2aWNlcygpIHN0cmluZyB7CglpZiBsZW4obmFtZXMpID09IDAgewoJCXJldHVybiAibm9uZSIKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4obmFtZXMsICIsICIpCn0KCi8vIExpc3RCeVR5cGUgcmV0dXJucyBhbGwgc2VydmljZSBuYW1lcyBtYXRjaGluZyBhIGdpdmVuIHR5cGUuIFNhbWUgY29zdAovLyBub3RlIGFzIExpc3RTZXJ2aWNlcy4KZnVuYyBMaXN0QnlUeXBlKHNlcnZpY2VUeXBlIHN0cmluZykgc3RyaW5nIHsKCXZhciByZXN1bHQgW11zdHJpbmcKCWZvciBfLCBuYW1lIDo9IHJhbmdlIG5hbWVzIHsKCQlzdmMgOj0gc2VydmljZXNbbmFtZV0KCQlpZiBzdmMgIT0gbmlsICYmIHN2Yy5TZXJ2aWNlVHlwZSA9PSBzZXJ2aWNlVHlwZSB7CgkJCXJlc3VsdCA9IGFwcGVuZChyZXN1bHQsIG5hbWUpCgkJfQoJfQoJaWYgbGVuKHJlc3VsdCkgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihyZXN1bHQsICIsICIpCn0KCi8vIC0tLS0tLS0tLS0gcmVuZGVyIC0tLS0tLS0tLS0KCi8vIFJlbmRlciByZXR1cm5zIGEgbWFya2Rvd24gb3ZlcnZpZXcsIGJvdW5kZWQgdG8gTWF4UmVuZGVyU2VydmljZXMgcm93cwovLyAocGVhcmwgYXVkaXQgWTMpLiBOZXZlciBwYW5pY3MuIEFsbCBmcmVlIHRleHQgZ29lcyB0aHJvdWdoIHRoZQovLyBlY29zeXN0ZW0gc2FuaXRpemVyIHJhdGhlciB0aGFuIGEgYmVzcG9rZSBlc2NhcGVyOiB0aGUgaGFuZC1yb2xsZWQKLy8gcmVwbGFjZW1lbnQgb2YgYmFja3RpY2tzIGFuZCBwaXBlcyBpdCByZXBsYWNlcyBsZWZ0IGBbYCwgYF1gLCBgKGAsCi8vIGApYCBhbmQgYCFgIGxpdmUsIHNvIGFueSByZWdpc3RyYW50IGNvdWxkIGluamVjdCBhIHdvcmtpbmcgbWFya2Rvd24KLy8gbGluayBvciBpbWFnZSBpbnRvIGEgdGFibGUgY2VsbCBhbmQgcGhpc2ggZXZlcnkgdmlld2VyIG9mIHRoaXMgcGFnZS4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cgl0b3RhbCA6PSBsZW4oc2VydmljZXMpCglpZiB0b3RhbCA9PSAwIHsKCQlyZXR1cm4gIiMgU2VydmljZSBSZWdpc3RyeVxuXG5ObyBzZXJ2aWNlcyByZWdpc3RlcmVkLlxuIgoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBTZXJ2aWNlIFJlZ2lzdHJ5XG5cbiIpCgliLldyaXRlU3RyaW5nKCIqKlRvdGFsIHNlcnZpY2VzOioqICIgKyBzdHJjb252Lkl0b2EodG90YWwpICsgIlxuXG4iKQoKCWIuV3JpdGVTdHJpbmcoInwgTmFtZSB8IFR5cGUgfCBQa2dQYXRoIHwgT3duZXIgfCBEZXNjcmlwdGlvbiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiIpCgoJc2hvd24gOj0gMAoJZm9yIF8sIG5hbWUgOj0gcmFuZ2UgbmFtZXMgewoJCWlmIHNob3duID49IE1heFJlbmRlclNlcnZpY2VzIHsKCQkJYnJlYWsKCQl9CgkJc3ZjIDo9IHNlcnZpY2VzW25hbWVdCgkJaWYgc3ZjID09IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWRlc2MgOj0gc2FuaXRpemUuVGFibGVDZWxsKHRydW5jYXRlKHN2Yy5EZXNjcmlwdGlvbiwgcmVuZGVyRGVzY0xlbikpCgkJYi5Xcml0ZVN0cmluZygifCAiICsgc3ZjLk5hbWUgKyAiIHwgIiArIHN2Yy5TZXJ2aWNlVHlwZSArICIgfCBgIiArCgkJCXN2Yy5Qa2dQYXRoICsgImAgfCBgIiArIHN0cmluZyhzdmMuT3duZXIpICsgImAgfCAiICsgZGVzYyArICIgfFxuIikKCQlzaG93bisrCgl9CgoJaWYgc2hvd24gPCB0b3RhbCB7CgkJYi5Xcml0ZVN0cmluZygiXG5fU2hvd2luZyAiICsgc3RyY29udi5JdG9hKHNob3duKSArICIgb2YgIiArCgkJCXN0cmNvbnYuSXRvYSh0b3RhbCkgKyAiIHNlcnZpY2VzLiBVc2UgTGlzdFNlcnZpY2VzLCBMaXN0QnlUeXBlICIgKwoJCQkib3IgR2V0U2VydmljZSBmb3IgY29tcGxldGUgZGF0YS5fXG4iKQoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIikKCXJldHVybiBiLlN0cmluZygpCn0KIg0xMDAwMDAwMHVnbm90EhII8u6cMBILMTAxMTM4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQPbx5rN2dNBKSZ3ar4lSeJgcWjThkpgcFqOS5rM2xe95erTAdTimvMyJvKdndPwflrviwbPuqAbko555Mx7gbNcaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}