{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "ZZ2RL6s+oLv30eeARNd4qRH498hn1wACSzgNgZJeIHI=",
    "height": "467309",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "99456699",
      "GasUsed": "66304466"
    },
    "tx": "CqKIAwoML3ZtLm1fYWRkcGtnEpCIAwooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLThwMKCHBheXNsaXBzEjxnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGF5c2xpcHMaYwoLZ25vbW9kLnRvbWwSVG1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGF5c2xpcHMiCmdubyA9ICIwLjkiChqihgMKDHBheXNsaXBzLmdubxKQhgMvLyBQYWNrYWdlIHBheXNsaXBzIHB1Ymxpc2hlcyBncmFkdWF0ZWQgd2l0aGhvbGRpbmcgc3RhdGVtZW50cyBvdmVyIHRoZSB3YWdlCi8vIGZhY3RzIG9mIGEgbGl2ZSByL3BheXJvbGwuCi8vCi8vIEFuIGVtcGxveWVyIHNldHMgYSB3aXRoaG9sZGluZyBzY2hlZHVsZSDigJQgYSBbcC90aWVyc10gYnJhY2tldCB0YWJsZSDigJQgYW5kCi8vIHB1Ymxpc2hlcyBhIHBheXNsaXAgbmFtaW5nIHRoZSBlbXBsb3llZXMgaXQgY292ZXJzLiBGb3IgZWFjaCBvbmUgdGhpcyByZWFsbQovLyByZWFkcyBwYXlyb2xsJ3Mgb3duIHZpZXdzLCByZWNvbnN0cnVjdHMgdGhlIHNldHRsZWQgZ3Jvc3MsIHByaWNlcyBpdCB0aHJvdWdoCi8vIHRoZSBzY2hlZHVsZSwgYW5kIHJlY29yZHMgdGhlIHJlc3VsdC4gTm90aGluZyBpcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyCi8vIGV4Y2VwdCB0aGUgc2NoZWR1bGUgYW5kIHRoZSBzZWxlY3Rpb246IGV2ZXJ5IGFtb3VudCBjb21lcyBmcm9tIHBheXJvbGwuCi8vCi8vICMgV0hBVCBUSElTIFJFQUxNIElTLCBBTkQgV0hBVCBJVCBDQU5OT1QgQkUKLy8KLy8gSXQgaXMgYSBSRVBPUlRFUi4gSXQgaG9sZHMgbm8gY29pbnMsIGhhcyBubyB3aXRoZHJhd2FsIHBhdGgsIGFuZCBtb3ZlcwovLyBub3RoaW5nLiBJdCBkb2VzIG5vdCBkZWR1Y3QgdGhlIHdpdGhob2xkaW5nIGl0IGNvbXB1dGVzIOKAlCBwYXlyb2xsIHNldHRsZXMKLy8gd2FnZXMgYW5kIHRoaXMgcmVhbG0gc3RhdGVzIHdoYXQgYSBncmFkdWF0ZWQgc2NoZWR1bGUgd291bGQgaGF2ZSB3aXRoaGVsZAovLyBmcm9tIHRoZW0uIFRoZSBzZXBhcmF0aW9uIGlzIGRlbGliZXJhdGUgYW5kIGl0IGlzIGFsc28gZm9yY2VkOiByL3BheXJvbGwgaXMKLy8gbGl2ZSBhbmQgaW1tdXRhYmxlLCBzbyBhIGdyYWR1YXRlZCByYXRlIGNhbm5vdCBiZSBjaGFyZ2VkIGluc2lkZSBpdCwgYW5kIGEKLy8gcmVhbG0gdGhhdCBjaGFyZ2VkIG9uZSBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGN1c3RvZHkgc3VyZmFjZSBvdmVyIGNvaW5zCi8vIHBheXJvbGwgYWxyZWFkeSBob2xkcy4KLy8KLy8gVGhlIGNvbnNlcXVlbmNlIGlzIHRoZSByZWFsbSdzIG9ubHkgcmVhbCBzYWZldHkgYXJndW1lbnQgYW5kIGl0IGlzIGEgc3Ryb25nCi8vIG9uZTogVEhJUyBSRUFMTSBDQU5OT1QgV1JJVEUgQSBXUk9ORyBQQVlNRU5ULCBCRUNBVVNFIElUIENBTk5PVCBXUklURSBBCi8vIFBBWU1FTlQuIFRoZSBmYWlsdXJlIG1vZGUgaXQgZG9lcyBoYXZlIGlzIGEgd3Jvbmcgb3IgaW5jb21wbGV0ZSBSRVBPUlQsIGFuZAovLyBldmVyeSBtaXRpZ2F0aW9uIGJlbG93IGlzIGFpbWVkIHRoZXJlLgovLwovLyAjIFNFVFRMRUQgSVMgTk9UIEVBUk5FRAovLwovLyBUaGUgZ3Jvc3Mgb24gYSBwYXlzbGlwIGlzIHRoZSBncm9zcyBwYXlyb2xsIGhhcyBTRVRUTEVEIGZvciB0aGUgcG9zaXRpb24KLy8gdGhhdCBpcyBvcGVuIHJpZ2h0IG5vdzoKLy8KLy8JZ3Jvc3MgPSBQYWlkUGVyaW9kc09mKGVtcGxveWVyLCBlbXBsb3llZSkgKiBQZXJQZXJpb2RPZihlbXBsb3llciwgZW1wbG95ZWUpCi8vCi8vIFRoYXQgaWRlbnRpdHkgaXMgZXhhY3QgcmF0aGVyIHRoYW4gYXBwcm94aW1hdGUsIGFuZCB0aGUgcmVhc29uIGlzIHN0cnVjdHVyYWw6Ci8vIHBheXJvbGwgZXhwb3J0cyBubyBzZXR0ZXIgZm9yIHBlclBlcmlvZCwgc28gYSBwb3NpdGlvbidzIHJhdGUgaXMgZml4ZWQgZm9yCi8vIGl0cyB3aG9sZSBsaWZlIGJ5IHRoZSBIaXJlIHRoYXQgY3JlYXRlZCBpdCwgYW5kIHBhaWRQZXJpb2RzIG9ubHkgZXZlcgovLyBpbmNyZWFzZXMuIFRoZSBwcm9kdWN0IGlzIHRoZXJlZm9yZSB0aGUgcG9zaXRpb24ncyBsaWZldGltZSBzZXR0bGVkIGdyb3NzIGFuZAovLyBub3QgYW4gZXN0aW1hdGUgb2YgaXQuCi8vCi8vIEl0IGlzIHN0aWxsIG5vdCB0aGUgZW1wbG95ZWUncyBsaWZldGltZSBlYXJuaW5ncyB1bmRlciB0aGlzIGVtcGxveWVyLCBhbmQgdGhlCi8vIGdhcCBpcyBub3Qgc21hbGwuIHBheXJvbGwncyBSZWxlYXNlIHJlbW92ZXMgYSBzZXR0bGVkIHBvc2l0aW9uIGFuZCBmcmVlcyBpdHMKLy8gc3RvcmFnZSwgYW5kIEhpcmUgcmVmdXNlcyBvbmx5IHdoaWxlIGEgcG9zaXRpb24gaXMgT1BFTiDigJQgc28KLy8gVGVybWluYXRlIOKGkiBSZWxlYXNlIOKGkiBIaXJlIGlzIGEgbGVnYWwgc2VxdWVuY2UgdGhhdCByZXNldHMgcGFpZFBlcmlvZHMgdG8KLy8gemVybyBhbmQgbWFrZXMgZXZlcnkgcGVyaW9kIGJlZm9yZSBpdCB1bnJlYWRhYmxlIGZyb20gYW55IHZpZXcuIFRoZSBSZWxlYXNlZAovLyBldmVudCBjYXJyaWVzIHBhaWRQZXJpb2RzLCBidXQgYW4gZXZlbnQgaXMgbm90IHJlYWxtLXJlYWRhYmxlLiBTbzoKLy8KLy8JQSBQQVlTTElQIElTIFNDT1BFRCBUTyBUSEUgUE9TSVRJT04gT1BFTiBBVCBJVFMgT1dOIEhFSUdIVCwgQU5EIE1VU1QgTkVWRVIKLy8JQkUgUkVBRCBBUyBMSUZFVElNRSBHUk9TUy4KLy8KLy8gVGhlIGZhaWx1cmUgbW9kZSBpcyBzaWxlbnQgdW5kZXItcmVwb3J0aW5nLCB3aGljaCBpcyB0aGUgb25lIGVycm9yIGEgcmVhZGVyCi8vIGNhbm5vdCBkZXRlY3QgZnJvbSB0aGUgbnVtYmVyIGl0c2VsZi4gVGhlIG1pdGlnYXRpb25zIGFyZSB0aGF0IGV2ZXJ5IHBheXNsaXAKLy8gcmVjb3JkcyBpdHMgaGVpZ2h0LCBpdHMgb3duIHNjb3BlLCBhbmQgYSBjb3ZlcmFnZSBsaW5lOyB0aGF0IFtDb3ZlcmFnZV0gYW5kCi8vIFtPbWl0dGVkUm9zdGVyXSBzYXkgaG93IG11Y2ggb2YgdGhlIGVtcGxveWVyJ3Mgcm9zdGVyIHRoZSBwYXlzbGlwIGxlZnQgb3V0OwovLyBhbmQgdGhhdCBhbiBlbXBsb3llZSBuYW1lZCB3aXRoIG5vIG9wZW4gcG9zaXRpb24gUEFOSUNTIHJhdGhlciB0aGFuIGJlaW5nCi8vIGRyb3BwZWQg4oCUIGEgc2lsZW50bHktZHJvcHBlZCBsaW5lIGlzIGV4YWN0bHkgdGhlIHVuZGVyLXJlcG9ydCB0aGlzIHJlYWxtCi8vIGNhbm5vdCBkZXRlY3QgYWZ0ZXIgdGhlIGZhY3QuCi8vCi8vICMgUEVSSU9EUyBUSEFUIEFSRSBEVUUgQlVUIE5PVCBBQ0NSVUVEIEFSRSBFWENMVURFRCwgQU5EIERJU0NMT1NFRAovLwovLyBwYXlyb2xsIGFjY3J1ZXMgb24gZGVtYW5kOiBhbnlvbmUgbWF5IGNhbGwgQWNjcnVlLCBhbmQgdW50aWwgc29tZW9uZSBkb2VzLAovLyBjb21wbGV0ZWQgcGVyaW9kcyBhcmUgZHVlIGFuZCB1bnNldHRsZWQuIEEgcGF5c2xpcCBwdWJsaXNoZWQgYmVmb3JlIGFuCi8vIEFjY3J1ZSB0aGVyZWZvcmUgcmVwb3J0cyBhIHNtYWxsZXIgZ3Jvc3MgdGhhbiB0aGUgZW1wbG95ZWUgaXMgb3dlZC4gUmF0aGVyCi8vIHRoYW4gZ3Vlc3MsIGVhY2ggbGluZSByZWNvcmRzIGR1ZUdyb3NzIOKAlCBEdWVQZXJpb2RzIHRpbWVzIHBlclBlcmlvZCBhdCB0aGUKLy8gcGF5c2xpcCdzIGhlaWdodCDigJQgYW5kIFtVbnNldHRsZWRHcm9zc09mXSB0b3RhbHMgaXQuIEEgcGF5c2xpcCB3aG9zZQovLyBVbnNldHRsZWRHcm9zc09mIGlzIG5vbi16ZXJvIGlzIGNvbXBsZXRlIGFib3V0IHdoYXQgd2FzIHNldHRsZWQgYW5kIGV4cGxpY2l0Ci8vIGFib3V0IHdoYXQgd2FzIG5vdC4KLy8KLy8gIyBUSEUgUExBVEZPUk0gRkVFIElTIEFOIElOVEVSVkFMLCBBTkQgVEhBVCBJUyBBIE1FQVNVUkVNRU5UCi8vCi8vIHBheXJvbGwgdGFrZXMgYW4gYWNjcnVhbCBmZWUgb2YgQWNjcnVlRmVlQnBzIGZyb20gZWFjaCBzZXR0bGVtZW50LCBhbmQgdGhlCi8vIG9idmlvdXMgcmVjb25zdHJ1Y3Rpb24g4oCUIGEgZmxhdCByYXRlIG9uIHRoZSBjdW11bGF0aXZlIGdyb3NzIOKAlCBpcyB3cm9uZy4gSXRzCi8vIEFjY3J1ZSBzZXR0bGVzIGV2ZXJ5IGR1ZSBwZXJpb2QgaW4gT05FIGRlcG9zaXQgYW5kIGZsb29ycyB0aGUgZmVlIG9uIHRoYXQKLy8gYWdncmVnYXRlLCBzbyB0aGUgZmVlIGFjdHVhbGx5IHRha2VuIGRlcGVuZHMgb24gaG93IHRoZSBhY2NydWFscyB3ZXJlCi8vIEJBVENIRUQsIGFuZCBwYXlyb2xsIGV4cG9ydHMgbm8gdmlldyBvZiB0aGUgYmF0Y2hpbmcuIFdoYXQgaXQgZG9lcyBleHBvcnQgaXMKLy8gcGFpZFBlcmlvZHMgYW5kIHBlclBlcmlvZCwgYW5kIHRob3NlIGJvdW5kIHRoZSBmZWUgZXhhY3RseToKLy8KLy8JZmVlTG8gPSBwYWlkUGVyaW9kcyAqIGZsb29yKHBlclBlcmlvZCAqIGJwcyAvIFJhdGVTY2FsZSkgICBvbmUgcGVyaW9kIHBlciBjYWxsCi8vCWZlZUhpID0gZmxvb3IoZ3Jvc3MgKiBicHMgLyBSYXRlU2NhbGUpICAgICAgICAgICAgICAgICAgICAgb25lIGNhbGwgZm9yIGFsbAovLwovLyBCb3RoIGVuZHBvaW50cyBhcmUgYWNoaWV2YWJsZSwgc28gdGhlIGludGVydmFsIGlzIHRpZ2h0IGFuZCBub3QgYSBoZWRnZToKLy8gZmxvb3IoeCkgKyBmbG9vcih5KSA8PSBmbG9vcih4K3kpIGdpdmVzIHRoZSB1cHBlciBib3VuZCwgYW5kCi8vIGZsb29yKG4qeCkgPj0gbipmbG9vcih4KSBnaXZlcyB0aGUgbG93ZXIuIFRoZXkgY29pbmNpZGUgd2hlbmV2ZXIKLy8gcGVyUGVyaW9kICogYnBzIGRpdmlkZXMgUmF0ZVNjYWxlIGV2ZW5seSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLgovLwovLyBTbyBbUGxhdGZvcm1GZWVSYW5nZV0gYW5kIFtOZXRSYW5nZV0gcmV0dXJuIHBhaXJzLiBBIHNpbmdsZSBwbGF0Zm9ybS1mZWUKLy8gbnVtYmVyIGhlcmUgd291bGQgaGF2ZSBiZWVuIHBsYXVzaWJsZSwgZGVyaXZhYmxlLCBhbmQgd3JvbmcgZm9yIGFueSBlbXBsb3llZQovLyB3aG9zZSBhY2NydWFscyB3ZXJlIGJhdGNoZWQg4oCUIGFuZCBub3RoaW5nIG9uIHRoZSBjaGFpbiB3b3VsZCBoYXZlCi8vIGNvbnRyYWRpY3RlZCBpdC4KLy8KLy8gIyBUSEUgU0NIRURVTEUgUFJJQ0VTIEdST1NTLCBBTkQgVEhFIFRXTyBERURVQ1RJT05TIEFSRSBORVZFUiBDT01CSU5FRAovLwovLyBUaGUgd2l0aGhvbGRpbmcgc2NoZWR1bGUgaXMgYXBwbGllZCB0byBncm9zcy4gcGF5cm9sbCdzIHBsYXRmb3JtIGZlZSBpcyBhCi8vIHNlcGFyYXRlIGRlZHVjdGlvbiB0aGF0IHBheXJvbGwgaGFzIGFscmVhZHkgdGFrZW4uIFRoZXkgYXJlIHJlcG9ydGVkIHNpZGUgYnkKLy8gc2lkZSBhbmQgbmV2ZXIgZm9sZGVkIGludG8gb25lIGVmZmVjdGl2ZSByYXRlLCBiZWNhdXNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQKLy8gcGF5ZWVzLCBkaWZmZXJlbnQgYXJpdGhtZXRpYyAoZ3JhZHVhdGVkIHZlcnN1cyBmbGF0KSBhbmQgZGlmZmVyZW50Ci8vIGNlcnRhaW50eSAoZXhhY3QgdmVyc3VzIGFuIGludGVydmFsKS4KLy8KLy8gQSBzY2hlZHVsZSBpbiBbcC90aWVyc10gY2FycmllcyBubyBpZGVudGl0eSBhbmQgbm8gZWZmZWN0aXZlIGRhdGUsIGFuZCBhCi8vIGZhbGxpbmcgcmF0ZSBhcnJheSBpcyBsZWdhbCB0aGVyZSDigJQgaXQgaXMgYSB2b2x1bWUgZGlzY291bnQg4oCUIHNvIGEKLy8gdHJhbnNwb3NlZCB0YWJsZSBpcyBhIHNpbGVudCBhdXRob3JpbmcgZXJyb3IgdGhhdCB0aWVycy5OZXcgY2Fubm90IGRldGVjdC4KLy8gVHdvIGNvbnNlcXVlbmNlcyB0aGlzIHJlYWxtIGFjdHMgb246IGV2ZXJ5IHBheXNsaXAgU05BUFNIT1RTIHRoZSBzY2hlZHVsZQovLyB0aGF0IHByaWNlZCBpdCwgc28gYSBsYXRlciBTZXRTY2hlZHVsZSBjYW5ub3QgcmV0cm9hY3RpdmVseSByZS1wcmljZSBhCi8vIHB1Ymxpc2hlZCBwYXlzbGlwOyBhbmQgW092ZXJXaXRoaGVsZF0gbmFtZXMgdGhlIG9uZSBhcml0aG1ldGljIG91dGNvbWUgdGhhdAovLyBpcyBhbG1vc3QgY2VydGFpbmx5IGFuIGF1dGhvcmluZyBlcnJvciDigJQgYSBzY2hlZHVsZSB3aXRoaG9sZGluZyBtb3JlIHRoYW4KLy8gdGhlIGVtcGxveWVlIGFjdHVhbGx5IHJlY2VpdmVkIOKAlCByYXRoZXIgdGhhbiBoaWRpbmcgaXQgb3IgcmVmdXNpbmcgdG8KLy8gcHVibGlzaCBpdC4KLy8KLy8gIyBBVVRIT1JJVFkKLy8KLy8gQW4gZW1wbG95ZXIgcHVibGlzaGVzIGFib3V0IHRoZWlyIE9XTiByb3N0ZXI6IHRoZSBlbXBsb3llciBvZiBldmVyeSBwYXlzbGlwCi8vIGlzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSwgbmV2ZXIgYW4gYXJndW1lbnQuIFRoaXMgcmVhbG0gdGhlcmVmb3JlIGNhbm5vdAovLyBwdWJsaXNoIGEgcGF5c2xpcCBhYm91dCBhIHJvc3RlciB0aGUgY2FsbGVyIGRvZXMgbm90IGhvbGQsIGFuZCBhIHBheXNsaXAncwovLyBrZXkgaXMgdGhlIGVtcGxveWVyIHRoYXQgcHVibGlzaGVkIGl0LgpwYWNrYWdlIHBheXNsaXBzCgppbXBvcnQgKAoJImNoYWluIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvdGllcnMiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKCSJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGF5cm9sbCIKKQoKLy8gUmVhbG1QYXRoIGlzIHRoaXMgcmVhbG0ncyBvd24gcGF0aCwgdXNlZCB0byBidWlsZCBSZW5kZXIgbGlua3MuCmNvbnN0IFJlYWxtUGF0aCA9ICIvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3BheXNsaXBzIgoKLy8gUGF5cm9sbFBhdGggaXMgdGhlIHdhZ2Ugc291cmNlIGV2ZXJ5IGZpZ3VyZSBoZXJlIGlzIHJlYWQgZnJvbS4KLy8KLy8gSXQgaXMgdGFrZW4gQlkgVkFMVUUgZnJvbSB0aGF0IHJlYWxtJ3Mgb3duIGV4cG9ydGVkIGNvbnN0YW50IHJhdGhlciB0aGFuCi8vIHR5cGVkIG91dCBhZ2Fpbiwgc28gdGhpcyBpcyB0aGUgY29tcGlsZS10aW1lIHBpbiBpdHNlbGYgYW5kIG5vdCBhIHNlY29uZAovLyBjb3B5IHRoYXQgY291bGQgZHJpZnQuIFRoZSBjb252ZW50aW9uIGlzIHIvcmVjZWl2YWJsZXMnIEludm9pY2VzUGF0aC4KY29uc3QgUGF5cm9sbFBhdGggPSBwYXlyb2xsLlJlYWxtUGF0aAoKLy8gUmF0ZVNjYWxlIGlzIHRoZSB1bml0IG9mIGEgd2l0aGhvbGRpbmcgcmF0ZSwgcmUtZXhwb3J0ZWQgYnkgdmFsdWUgZnJvbQovLyBbcC90aWVyc106IGEgcmF0ZSBvZiAyNTAwIGlzIDI1JS4gUmUtZXhwb3J0ZWQgYmVjYXVzZSBldmVyeSByYXRlIGluIHRoaXMKLy8gcmVhbG0ncyBBUEkgaXMgaW4gdGhlc2UgdW5pdHMgYW5kIGEgY2FsbGVyIHNob3VsZCBub3QgaGF2ZSB0byBmaW5kIHRoZSBvdGhlcgovLyBwYWNrYWdlIHRvIGxlYXJuIHRoZSBkZW5vbWluYXRvci4KY29uc3QgUmF0ZVNjYWxlID0gdGllcnMuUmF0ZVNjYWxlCgovLyBNYXhUaWVycyBpcyB0aGUgd2lkZXN0IHNjaGVkdWxlIFtwL3RpZXJzXSB3aWxsIGJ1aWxkLCBieSB2YWx1ZS4gQSBzY2hlZHVsZQovLyBoYXMgb25lIHJhdGUgcGVyIHRpZXIgYW5kIG9uZSBlZGdlIGJldHdlZW4gZWFjaCBhZGphY2VudCBwYWlyLCBzbyBhbgovLyBlbXBsb3llciBtYXkgbmFtZSBhdCBtb3N0IE1heFRpZXJzIHJhdGVzIGFuZCBNYXhUaWVycy0xIGVkZ2VzLgpjb25zdCBNYXhUaWVycyA9IHRpZXJzLk1heFRpZXJzCgovLyBQbGF0Zm9ybUZlZUJwcyBpcyB0aGUgYWNjcnVhbCBmZWUgci9wYXlyb2xsIGNoYXJnZXMsIHRha2VuIGJ5IHZhbHVlIGZyb20KLy8gdGhhdCByZWFsbSdzIG93biBjb25zdGFudC4KLy8KLy8gVGFraW5nIGl0IGJ5IHZhbHVlIGlzIHNvdW5kIGhlcmUgZm9yIGEgcmVhc29uIHdvcnRoIHN0YXRpbmcgcmF0aGVyIHRoYW4KLy8gYXNzdW1pbmc6IHBheXJvbGwgaXMgTElWRSBhbmQgYSByZWFsbSdzIGJ5dGVzIGFyZSBpbW11dGFibGUgYWZ0ZXIgYWRkcGtnLCBzbwovLyB0aGF0IGNvbnN0YW50IGNhbm5vdCBjaGFuZ2UgZm9yIHRoZSBwYXlyb2xsIHRoaXMgcmVhbG0gaW1wb3J0cy4gQSBmdXR1cmUKLy8gcGF5cm9sbCB2ZXJzaW9uIHdvdWxkIGJlIGEgZGlmZmVyZW50IHBhdGggYW5kIGEgZGlmZmVyZW50IGltcG9ydC4KY29uc3QgUGxhdGZvcm1GZWVCcHMgPSBwYXlyb2xsLkFjY3J1ZUZlZUJwcwoKLy8gTWF4RW1wbG95ZWVzUGVyQ2FsbCBjYXBzIGhvdyBtYW55IGVtcGxveWVlcyBvbmUgW1B1Ymxpc2hdIG1heSBuYW1lLCBhbmQgaXQKLy8gaXMgci9wYXlyb2xsJ3Mgb3duIHBlci1lbXBsb3llciByb3N0ZXIgY2FwIHRha2VuIGJ5IHZhbHVlLgovLwovLyBUaGF0IGlzIHRoZSByaWdodCBib3VuZCBhbmQgbm90IGFuIGFyYml0cmFyeSBvbmU6IHBheXJvbGwgcmVmdXNlcyBhIEhpcmUKLy8gcGFzdCBNYXhSb3N0ZXIgb3BlbiBwb3NpdGlvbnMsIHNvIGFuIGVtcGxveWVyIGNhbm5vdCBoYXZlIG1vcmUgdGhhbgovLyBNYXhSb3N0ZXIgZW1wbG95ZWVzIHRvIHJlcG9ydCBvbiwgYW5kIGEgY2FwIGFib3ZlIGl0IHdvdWxkIGFkbWl0IGEgY2FsbCB0aGF0Ci8vIG11c3QgY29udGFpbiBhIGR1cGxpY2F0ZSBvciBhbiBhYnNlbnQgcG9zaXRpb24uIEEgY2FwIGJlbG93IGl0IHdvdWxkIG1ha2UKLy8gc29tZSByb3N0ZXJzIHVucmVwb3J0YWJsZSBpbiBvbmUgY2FsbCwgd2hpY2ggaXMgdGhlIHVuZGVyLXJlcG9ydCB0aGlzIHJlYWxtCi8vIGV4aXN0cyB0byBhdm9pZC4KY29uc3QgTWF4RW1wbG95ZWVzUGVyQ2FsbCA9IHBheXJvbGwuTWF4Um9zdGVyCgovLyBQYXlzbGlwc0FyZVVuY2FwcGVkIHJlY29yZHMgYSBkZWNpc2lvbiBieSBpdHMgYWJzZW5jZTogdGhlcmUgaXMgbm8gbGltaXQgb24KLy8gaG93IG1hbnkgcGF5c2xpcHMgb25lIGVtcGxveWVyIG1heSBwdWJsaXNoLiBFYWNoIG9uZSBpcyBhIGZyZXNoIHJlY29yZCBhbmQKLy8gdGhlIHN0b3JhZ2UgZGVwb3NpdCBmb3IgaXQgaXMgcGFpZCBieSB0aGUgY2FsbGVyIGF0IHB1Ymxpc2ggdGltZSwgc28gdGhlCi8vIGNoYWluIGFscmVhZHkgcHJpY2VzIHRoZSBvbmx5IHJlc291cmNlIGF0IHN0YWtlLiBBIGNhcCBoZXJlIHdvdWxkIGNhdXNlIHRoZQovLyBvbmUgZmFpbHVyZSB0aGlzIHJlYWxtIGNhbm5vdCB0b2xlcmF0ZSDigJQgYW4gZW1wbG95ZXIgdW5hYmxlIHRvIHB1Ymxpc2ggdGhlCi8vIHN0YXRlbWVudCB0aGF0IHdvdWxkIGhhdmUgZGlzY2xvc2VkIGFuIG9taXNzaW9uLgpjb25zdCBQYXlzbGlwc0FyZVVuY2FwcGVkID0gdHJ1ZQoKLy8gUmVuZGVyUGF5c2xpcExpbWl0IGlzIGhvdyBtYW55IHBheXNsaXBzIGFuIGVtcGxveWVyJ3MgUmVuZGVyIHBhZ2UgbGlzdHMuCi8vIE5vdCBhIHN0b3JhZ2UgY2FwIOKAlCBzZWUgW1BheXNsaXBzQXJlVW5jYXBwZWRdLgpjb25zdCBSZW5kZXJQYXlzbGlwTGltaXQgPSAyMAoKLy8gbGluZSBpcyBvbmUgZW1wbG95ZWUncyBzdGF0ZW1lbnQgd2l0aGluIGEgcGF5c2xpcC4gRXZlcnkgZmllbGQgaXMgZGVyaXZlZAovLyBmcm9tIHIvcGF5cm9sbCdzIHZpZXdzIGF0IHRoZSBwYXlzbGlwJ3Mgb3duIGhlaWdodDsgbm9uZSBpcyBzdXBwbGllZCBieSB0aGUKLy8gY2FsbGVyLgp0eXBlIGxpbmUgc3RydWN0IHsKCWVtcGxveWVlIGFkZHJlc3MKCgkvLyBwYWlkUGVyaW9kcyBhbmQgcGVyUGVyaW9kIGFyZSB0aGUgdHdvIHBheXJvbGwgZmFjdHMgZ3Jvc3MgaXMgYnVpbHQKCS8vIGZyb20uIFRoZXkgYXJlIGtlcHQgc28gYSByZWFkZXIgY2FuIHJlLWRlcml2ZSB0aGUgZ3Jvc3MgcmF0aGVyIHRoYW4KCS8vIHRha2UgaXQgb24gdHJ1c3QsIGFuZCBzbyB0aGUgZmVlIGludGVydmFsIGNhbiBiZSByZS1jaGVja2VkLgoJcGFpZFBlcmlvZHMgaW50NjQKCXBlclBlcmlvZCAgIGludDY0CgoJLy8gZ3Jvc3MgaXMgcGFpZFBlcmlvZHMgKiBwZXJQZXJpb2Q6IHRoZSBzZXR0bGVkIGdyb3NzIG9mIHRoZSBwb3NpdGlvbgoJLy8gdGhhdCB3YXMgb3BlbiBhdCB0aGUgcGF5c2xpcCdzIGhlaWdodC4gTk9UIGxpZmV0aW1lIGdyb3NzIOKAlCBzZWUgdGhlCgkvLyBwYWNrYWdlIGRvYy4KCWdyb3NzIGludDY0CgoJLy8gd2l0aGhlbGQgaXMgdGhlIHNjaGVkdWxlJ3MgY2hhcmdlIG9uIGdyb3NzLCBmbG9vcmVkIHBlciBzbGljZSBieQoJLy8gW3AvdGllcnNdLgoJd2l0aGhlbGQgaW50NjQKCgkvLyBmZWVMbyBhbmQgZmVlSGkgYm91bmQgdGhlIGFjY3J1YWwgZmVlIHIvcGF5cm9sbCBhbHJlYWR5IHRvb2suIFRoZQoJLy8gaW50ZXJ2YWwgaXMgdGlnaHQgYW5kIGJvdGggZW5kcG9pbnRzIGFyZSByZWFjaGFibGUg4oCUIHNlZSB0aGUgcGFja2FnZQoJLy8gZG9jLgoJZmVlTG8gaW50NjQKCWZlZUhpIGludDY0CgoJLy8gZHVlR3Jvc3MgaXMgZ3Jvc3MgdGhhdCBoYXMgY29tcGxldGVkIGFuZCBOT1QgYmVlbiBhY2NydWVkIGF0IHRoZQoJLy8gcGF5c2xpcCdzIGhlaWdodC4gSXQgaXMgZXhjbHVkZWQgZnJvbSBncm9zcyBhbmQgZGlzY2xvc2VkIGhlcmUuCglkdWVHcm9zcyBpbnQ2NAoKCS8vIGVuZGVkIHJlY29yZHMgd2hldGhlciB0aGUgcG9zaXRpb24ncyBjbG9jayBoYWQgc3RvcHBlZCBhdCB0aGUKCS8vIHBheXNsaXAncyBoZWlnaHQuIEFuIGVuZGVkIHBvc2l0aW9uIGNhbiBzdGlsbCBoYXZlIGR1ZUdyb3NzOiBwYXlyb2xsCgkvLyBkZWxpYmVyYXRlbHkga2VlcHMgYW4gdW5zZXR0bGVkIG9ibGlnYXRpb24gYWxpdmUgcGFzdCBUZXJtaW5hdGUuCgllbmRlZCBib29sCn0KCi8vIHBheXNsaXAgaXMgb25lIHB1Ymxpc2hlZCBzdGF0ZW1lbnQuIEl0cyB0b3RhbHMgYXJlIHN0b3JlZCByYXRoZXIgdGhhbgovLyByZWNvbXB1dGVkIHNvIGEgcmVhZGVyIGdldHMgdGhlIG51bWJlcnMgYXMgcHVibGlzaGVkLCBub3QgYXMgcmUtZGVyaXZlZAovLyB1bmRlciBhIGxhdGVyIHNjaGVkdWxlLgp0eXBlIHBheXNsaXAgc3RydWN0IHsKCWF0IGludDY0CgoJLy8gc2NoZWQgaXMgdGhlIHNjaGVkdWxlIHRoYXQgcHJpY2VkIFRISVMgcGF5c2xpcCwgc25hcHNob3R0ZWQuIEEKCS8vIHNjaGVkdWxlIGhhcyBubyBpZGVudGl0eSBpbiBbcC90aWVyc10sIHNvIGEgbGF0ZXIgU2V0U2NoZWR1bGUgd291bGQKCS8vIG90aGVyd2lzZSBzaWxlbnRseSByZS1wcmljZSBldmVyeSBwdWJsaXNoZWQgcGF5c2xpcC4KCXNjaGVkIHRpZXJzLlNjaGVkdWxlCgoJLy8gZmVlQnBzIGlzIFBsYXRmb3JtRmVlQnBzIGFzIHRoaXMgcmVhbG0gdW5kZXJzdG9vZCBpdCBhdCBwdWJsaXNoCgkvLyB0aW1lLiBJdCBjYW5ub3QgdmFyeSB3aGlsZSBwYXlyb2xsIGlzIGltbXV0YWJsZTsgaXQgaXMgcmVjb3JkZWQgc28gYQoJLy8gcmVhZGVyIGNoZWNraW5nIHRoZSBmZWUgaW50ZXJ2YWwgZG9lcyBub3QgaGF2ZSB0byByZXNvbHZlIGEgY29uc3RhbnQKCS8vIGluIGFub3RoZXIgcGFja2FnZSB0byBkbyBpdC4KCWZlZUJwcyBpbnQ2NAoKCWxpbmVzIFtdKmxpbmUKCglncm9zcyAgICBpbnQ2NAoJd2l0aGhlbGQgaW50NjQKCWZlZUxvICAgIGludDY0CglmZWVIaSAgICBpbnQ2NAoJZHVlR3Jvc3MgaW50NjQKCgkvLyB0aGUgY292ZXJhZ2UgbGluZS4gbGlzdGVkIGlzIHdoYXQgdGhlIGNhbGxlciBuYW1lZDsgcHJpY2VkIGlzIHdoYXQKCS8vIHdhcyByZXBvcnRlZDsgdGhlIHJlc3QgZGVzY3JpYmUgdGhlIHNoYXBlIG9mIHdoYXQgd2FzIHByaWNlZCBhbmQgaG93CgkvLyBtdWNoIG9mIHRoZSByb3N0ZXIgd2FzIGxlZnQgb3V0LgoJbGlzdGVkICAgIGludAoJcHJpY2VkICAgIGludAoJemVyb0dyb3NzIGludAoJd2l0aER1ZSAgIGludAoJZW5kZWQgICAgIGludAoJZHVwZXMgICAgIGludAoJcm9zdGVyQXQgIGludAoJb3BlbkF0ICAgIGludAp9Cgp2YXIgKAoJLy8gcGF5c2xpcHMgaG9sZHMgb25lIHJlY29yZCBwZXIgcHVibGlzaGVkIHN0YXRlbWVudCwga2V5ZWQKCS8vIGVtcGxveWVyfHBhZGRlZC1zZXEgc28gYW4gZW1wbG95ZXIncyBwYXlzbGlwcyBhcmUgYSBjb250aWd1b3VzIHByZWZpeAoJLy8gcmFuZ2UgaW4gc2VxdWVuY2Ugb3JkZXIuCglwYXlzbGlwcyA9IGF2bC5OZXdUcmVlKCkgLy8gIjxlbXBsb3llcj58PHBhZGRlZCBzZXE+IiAtPiAqcGF5c2xpcAoKCS8vIHNjaGVkdWxlcyBob2xkcyBlYWNoIGVtcGxveWVyJ3MgQ1VSUkVOVCB3aXRoaG9sZGluZyBzY2hlZHVsZS4gQQoJLy8gcGF5c2xpcCBuZXZlciByZWFkcyB0aGlzIGFmdGVyIHB1YmxpY2F0aW9uOyBpdCBjYXJyaWVzIGl0cyBvd24KCS8vIHNuYXBzaG90LgoJc2NoZWR1bGVzID0gYXZsLk5ld1RyZWUoKSAvLyBlbXBsb3llciBzdHJpbmcgLT4gdGllcnMuU2NoZWR1bGUKCgkvLyBjb3VudHMgaXMgYm90aCB0aGUgcGVyLWVtcGxveWVyIHNlcXVlbmNlIGFsbG9jYXRvciBhbmQgdGhlCgkvLyBwZXItZW1wbG95ZXIgcGF5c2xpcCBjb3VudC4gT25lIHRyZWUsIGJlY2F1c2UgdGhleSBhcmUgdGhlIHNhbWUKCS8vIG51bWJlci4KCWNvdW50cyA9IGF2bC5OZXdUcmVlKCkgLy8gZW1wbG95ZXIgc3RyaW5nIC0+IGludAoKCS8vIHNsaXBDb3VudCBpcyB0aGUgZ2xvYmFsIGNvdW50LCBmb3IgdGhlIFJlbmRlciBpbmRleC4KCXNsaXBDb3VudCBpbnQKCgkvLyBwbGF0Zm9ybUZlZSBpcyBQbGF0Zm9ybUZlZUJwcyBleHByZXNzZWQgYXMgYSBvbmUtdGllciBbcC90aWVyc10KCS8vIHNjaGVkdWxlLCB3aGljaCBpcyBob3cgdGhpcyByZWFsbSBjb21wdXRlcyB0aGUgZmVlIGVuZHBvaW50cy4KCS8vCgkvLyBSZXVzaW5nIHRoZSBhdWRpdGVkIHByaW1pdGl2ZSBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIGFyaXRobWV0aWMgYWdhaW4KCS8vIGlzIHRoZSBwb2ludC4gQSBvbmUtdGllciBzY2hlZHVsZSBpcyBhIGZsYXQgcmF0ZSwgdGllcnMuQ2hhcmdlIGZsb29ycwoJLy8gaXQsIGFuZCB0aWVycyBkb2VzIHRoZSBtdWx0aXBseSB0aHJvdWdoIGJpdHMuTXVsNjQvRGl2NjQgc28gYSBwcm9kdWN0CgkvLyBuZWFyIHRoZSBpbnQ2NCBjZWlsaW5nIGNhbm5vdCB3cmFwLiBNRUFTVVJFRCBFUVVJVkFMRU5DRTogcC9mZWVsZWRnZXIncwoJLy8gZmVlRm9yIGNvbXB1dGVzICh4LzEwMDAwKSpicHMgKyAoeCUxMDAwMCkqYnBzLzEwMDAwLCB3aGljaCBpcyBleGFjdGx5CgkvLyBmbG9vcih4KmJwcy8xMDAwMCkgYW5kIHNvIGV4YWN0bHkgdGhpcyBzY2hlZHVsZSdzIGNoYXJnZS4KCS8vCgkvLyBUaGF0IGVxdWl2YWxlbmNlIGlzIHRoZSBoaW5nZSB0aGUgd2hvbGUgZmVlIGludGVydmFsIGhhbmdzIGZyb20sIHNvIGl0CgkvLyBpcyBCT1RIIGFyZ3VlZCBhbmQgYXNzZXJ0ZWQsIGFuZCB0aGUgYXNzZXJ0aW9uIGlzIE5BTUVEIHJhdGhlciB0aGFuCgkvLyBnZXN0dXJlZCBhdDogVGVzdFBsYXRmb3JtRmVlU2NoZWR1bGVBZ3JlZXNXaXRoRmVlbGVkZ2VyIGNvbXBhcmVzIHRoZQoJLy8gdHdvIGVuZ2luZXMgdHdvLXNpZGVkbHkgb3ZlciBhbiBhbW91bnQgc2FtcGxlIGFuZCB0aGUgd2hvbGUgbGVnYWwgYnBzCgkvLyByYW5nZS4gQW4gZWFybGllciBkcmFmdCBvZiB0aGlzIGNvbW1lbnQgc2FpZCB0aGUgZXF1aXZhbGVuY2UgImlzCgkvLyBhc3NlcnRlZCBpbiB0aGUgdGVzdCBzdWl0ZSByYXRoZXIgdGhhbiBhcmd1ZWQgaGVyZSIgd2hpbGUgdGhlIHN1aXRlIGRpZAoJLy8gbm90IGltcG9ydCBwL2ZlZWxlZGdlciBhdCBhbGwgLS0gaXQgcG9pbnRlZCBhIHJlYWRlciBhdCBldmlkZW5jZSB0aGF0CgkvLyB3YXMgbm90IHRoZXJlLCBvbiB0aGUgb25lIGZhY3QgaXQgbmFtZXMgbG9hZC1iZWFyaW5nLiBBIGNpdGF0aW9uIHdpdGggbm8KCS8vIHJlZmVyZW50IGlzIHdvcnNlIHRoYW4gbm8gY2l0YXRpb24sIGFuZCB0aGlzIHRleHQgaXMgZnJvemVuIGJ5IGFkZHBrZwoJLy8gd2hpbGUgYSB0ZXN0IGlzIG5vdCwgd2hpY2ggaXMgd2h5IHRoZSBuYW1lIGlzIHdyaXR0ZW4gaW4uCgkvLwoJLy8gQ0VJTElORzogdGhhdCB0ZXN0IGlzIGEgc2FtcGxlLCBub3QgYSBwcm9vZiBvdmVyIGludDY0LiBUaGUgZXhoYXVzdGl2ZQoJLy8gY2xhaW0gaXMgdGhlIGlkZW50aXR5IGFib3ZlOyB0aGUgdGVzdCBpcyB3aGF0IGZpcmVzIGlmIGVpdGhlciBwcmltaXRpdmUKCS8vIGlzIGV2ZXIgcmVkZXBsb3llZCB3aXRoIGRpZmZlcmVudCByb3VuZGluZy4KCXBsYXRmb3JtRmVlID0gbXVzdEZsYXQoUGxhdGZvcm1GZWVCcHMpCikKCmZ1bmMgbXVzdEZsYXQoYnBzIGludDY0KSB0aWVycy5TY2hlZHVsZSB7CglzLCBlcnIgOj0gdGllcnMuTmV3KG5pbCwgW11pbnQ2NHticHN9KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoInBheXNsaXBzOiB0aGUgcGxhdGZvcm0tZmVlIHNjaGVkdWxlIGlzIGludmFsaWQ6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBzCn0KCi8vIHJlZnVzZUNvaW5zIGFib3J0cyB3aGVuIGEgZGlyZWN0IEVPQSBNc2dDYWxsIGF0dGFjaGVzIGNvaW5zIHRvIGFuCi8vIGVudHJ5cG9pbnQgaGVyZS4gVGhpcyByZWFsbSBoYXMgbm8gY3VzdG9keSBhbmQgbm8gd2l0aGRyYXdhbCBwYXRoLCBzbyBhCi8vIHNlbmQgd291bGQgYmUgdW5yZWNvdmVyYWJsZSBieSBhbnlvbmUg4oCUIGluY2x1ZGluZyB0aGUgc2VuZGVyLgovLwovLyBUaGUgSXNDdXJyZW50KCkgY2hlY2sgaXMgbm90IGRlY29yYXRpb24uIEV2ZXJ5IGNhbGwgc2l0ZSBmb3J3YXJkcyBhIGNyb3NzaW5nCi8vIGVudHJ5cG9pbnQncyBvd24gbGl2ZSBjdXIsIHNvIGl0IGNhbm5vdCBmaXJlIHRvZGF5OyBpdCBleGlzdHMgc28gYSBmdXR1cmUKLy8gcmVmYWN0b3IgdGhhdCBoYW5kcyB0aGlzIGhlbHBlciBhIHN0YWxlIHJlYWxtIHZhbHVlIGZhaWxzIGNsb3NlZCBpbnN0ZWFkIG9mCi8vIHRydXN0aW5nIGl0LiBUaGF0IHNoYXBlIGlzIHNlY3VyaXR5Lm1kJ3MgQ2xhc3MgMiBhbmQgaXQgaGFzIGJlZW4gZm91bmQgaW4KLy8gdGhpcyBwb3J0Zm9saW8ncyBvd24gcmVhbG1zIG1vcmUgdGhhbiBvbmNlLgpmdW5jIHJlZnVzZUNvaW5zKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoInBheXNsaXBzOiByZWFsbSBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50IikKCX0KCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygicGF5c2xpcHM6IHRoaXMgcmVhbG0gaG9sZHMgbm8gY29pbnMgYW5kIGhhcyBubyB3aXRoZHJhd2FsIHBhdGg7IHNlbmQgbm9uZSIpCgl9Cn0KCi8vIC0tLSB0aGUgc2NoZWR1bGUgLS0tCgovLyBTZXRTY2hlZHVsZSBpbnN0YWxscyB0aGUgY2FsbGVyJ3Mgb3duIHdpdGhob2xkaW5nIHNjaGVkdWxlIGFuZCByZXR1cm5zIGl0cwovLyB0aWVyIGNvdW50LgovLwovLyBlZGdlcyBhbmQgcmF0ZXMgYXJlIGNvbW1hLXNlcGFyYXRlZCBpbnQ2NCBsaXN0cyBpbiBbcC90aWVyc10ncyB1bml0czogcmF0ZXMKLy8gYXJlIG9mIFtSYXRlU2NhbGVdLCBlZGdlcyBhcmUgZ3Jvc3MgYW1vdW50cyBpbiB1Z25vdC4gVGhlcmUgaXMgb25lIG1vcmUgcmF0ZQovLyB0aGFuIHRoZXJlIGFyZSBlZGdlcywgYmVjYXVzZSB0aGUgbGFzdCB0aWVyIGlzIHVuYm91bmRlZC4gQW4gRU1QVFkgZWRnZXMKLy8gc3RyaW5nIGlzIGxlZ2FsIGFuZCBtZWFucyBhIG9uZS10aWVyIHNjaGVkdWxlIOKAlCBhIGZsYXQgcmF0ZSDigJQgd2hpY2ggaXMgdGhlCi8vIHNoYXBlIHRvIHVzZSBmb3IgYSBmbGF0IHdpdGhob2xkaW5nIGFuZCB0aGUgc2hhcGUgdGhpcyByZWFsbSB1c2VzIGludGVybmFsbHkKLy8gZm9yIHRoZSBwbGF0Zm9ybSBmZWUuCi8vCi8vCVNldFNjaGVkdWxlKGNyb3NzKGN1ciksICIxMDAwMDAwLDUwMDAwMDAiLCAiNTAwLDE1MDAsMjUwMCIpCi8vCi8vIGlzIDUlIG9uIHRoZSBmaXJzdCAxLDAwMCwwMDAgdWdub3Qgb2YgZ3Jvc3MsIDE1JSBvbiB0aGUgbmV4dCA0LDAwMCwwMDAsIGFuZAovLyAyNSUgYWJvdmUgNSwwMDAsMDAwLgovLwovLyBSRVBMQUNJTkcgQSBTQ0hFRFVMRSBET0VTIE5PVCBSRS1QUklDRSBBTllUSElORy4gRXZlcnkgcHVibGlzaGVkIHBheXNsaXAKLy8gY2FycmllcyB0aGUgc2NoZWR1bGUgdGhhdCBwcmljZWQgaXQsIHNvIHRoaXMgb25seSBhZmZlY3RzIHBheXNsaXBzIHB1Ymxpc2hlZAovLyBhZnRlciBpdC4gVGhhdCBpcyBhIGRlc2lnbiByZXF1aXJlbWVudCByYXRoZXIgdGhhbiBhIGNvbnZlbmllbmNlOiBhCi8vIHB1Ymxpc2hlZCBzdGF0ZW1lbnQgd2hvc2UgbnVtYmVycyBjaGFuZ2UgdW5kZXIgaXQgaXMgbm90IGEgcmVjb3JkLgovLwovLyBBIEZBTExJTkcgUkFURSBBUlJBWSBJUyBBQ0NFUFRFRCwgYmVjYXVzZSBbcC90aWVyc10gYWNjZXB0cyBvbmUg4oCUIGl0IGlzIGEKLy8gdm9sdW1lIGRpc2NvdW50LCB3aGljaCBpcyBhIHJlYWwgc2NoZWR1bGUuIFRoZSBjb25zZXF1ZW5jZSBpcyB0aGF0IGEKLy8gdHJhbnNwb3NlZCBhcnJheSBpcyBhIHNpbGVudCBhdXRob3JpbmcgZXJyb3IgaGVyZSwgYW5kIG5laXRoZXIgdGhpcyByZWFsbQovLyBub3IgdGllcnMgY2FuIGRldGVjdCBpdC4gUmVhZCBiYWNrIFtTY2hlZHVsZU9mXSBhZnRlciBzZXR0aW5nIG9uZS4KZnVuYyBTZXRTY2hlZHVsZShjdXIgcmVhbG0sIGVkZ2VzLCByYXRlcyBzdHJpbmcpIGludCB7CglyZWZ1c2VDb2lucyhjdXIpCgllbXBsb3llciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCgl2YXIgZSBbXWludDY0CglpZiBzdHJpbmdzLlRyaW1TcGFjZShlZGdlcykgIT0gIiIgewoJCWUgPSBwYXJzZUludDY0TGlzdChlZGdlcywgTWF4VGllcnMtMSwgImVkZ2UiKQoJfQoJciA6PSBwYXJzZUludDY0TGlzdChyYXRlcywgTWF4VGllcnMsICJyYXRlIikKCglzLCBlcnIgOj0gdGllcnMuTmV3KGUsIHIpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygicGF5c2xpcHM6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXNjaGVkdWxlcy5TZXQoZW1wbG95ZXIuU3RyaW5nKCksIHMpCgljaGFpbi5FbWl0KCJTY2hlZHVsZVNldCIsCgkJImVtcGxveWVyIiwgZW1wbG95ZXIuU3RyaW5nKCksCgkJInRpZXJzIiwgc3RyY29udi5JdG9hKHMuTnVtVGllcnMoKSksCgkJImVkZ2VzIiwgZm9ybWF0SW50NjRMaXN0KHMuRWRnZXMoKSksCgkJInJhdGVzIiwgZm9ybWF0SW50NjRMaXN0KHMuUmF0ZXMoKSkpCglyZXR1cm4gcy5OdW1UaWVycygpCn0KCi8vIC0tLSBwdWJsaXNoaW5nIC0tLQoKLy8gUHVibGlzaCBwcmljZXMgdGhlIG5hbWVkIGVtcGxveWVlcyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3duIHJvc3RlciBhbmQgcmVjb3JkcwovLyBhIHBheXNsaXAuIEl0IHJldHVybnMgdGhlIHBheXNsaXAncyBzZXF1ZW5jZSBudW1iZXIsIHdoaWNoIGlzIHBlci1lbXBsb3llcgovLyBhbmQgc3RhcnRzIGF0IDEuCi8vCi8vIGVtcGxveWVlcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFkZHJlc3NlcywgYXQgbW9zdAovLyBbTWF4RW1wbG95ZWVzUGVyQ2FsbF0gb2YgdGhlbS4gT3JkZXIgaXMgdGhlIGNhbGxlcidzIGFuZCBpcyBwcmVzZXJ2ZWQgaW4gdGhlCi8vIHJlY29yZCwgc28gYSBwYXlzbGlwIHJlYWRzIGluIHRoZSBvcmRlciBpdCB3YXMgcmVxdWVzdGVkLgovLwovLyBUSFJFRSBSRUZVU0FMIFJVTEVTLCBBTkQgVEhFIEFTWU1NRVRSWSBCRVRXRUVOIFRIRU0gSVMgVEhFIFBPSU5UOgovLwovLyAgIC0gQW4gZW1wbG95ZWUgd2l0aCBOTyBPUEVOIFBPU0lUSU9OIHVuZGVyIHRoZSBjYWxsZXIgUEFOSUNTIGFuZCBmYWlscyB0aGUKLy8gICAgIHdob2xlIGNhbGwuIEEgc2lsZW50bHktZHJvcHBlZCBsaW5lIGlzIGFuIHVuZGVyLXJlcG9ydCwgYW5kIHVuZGVyLQovLyAgICAgcmVwb3J0aW5nIGlzIHRoZSBvbmUgZXJyb3IgdGhpcyBwcm9kdWN0IGNhbm5vdCBkZXRlY3QgYWZ0ZXIgdGhlIGZhY3QuIEEKLy8gICAgIGNhbGxlciB0aGF0IHdhbnRzIHRvIHNraXAgYW4gYWJzZW50IHBvc2l0aW9uIG11c3QgbGVhdmUgaXQgb3V0LCB3aGljaCBpcwovLyAgICAgYSBkZWNpc2lvbiBpbiB0aGUgdHJhbnNhY3Rpb24gcmF0aGVyIHRoYW4gYSBzaWxlbmNlIGluIHRoZSByZWNvcmQuCi8vICAgLSBBIERVUExJQ0FURSBpcyBkcm9wcGVkLCBjb3VudGVkIGluIHRoZSBjb3ZlcmFnZSBsaW5lLCBhbmQgZG9lcyBub3QgZmFpbAovLyAgICAgdGhlIGNhbGwuIERyb3BwaW5nIGl0IGNhbm5vdCB1bmRlci1yZXBvcnQ6IHRoZSBlbXBsb3llZSBpcyBzdGlsbCBwcmljZWQKLy8gICAgIG9uY2UsIGFuZCBkb3VibGUtY291bnRpbmcgdGhlbSB3b3VsZCBiZSB3b3JzZS4KLy8gICAtIEFuIGVtcGxveWVlIHdpdGggWkVSTyBTRVRUTEVEIEdST1NTIGlzIFBSSUNFRCwgbm90IGZpbHRlcmVkLiBBIHBheXNsaXAKLy8gICAgIGZvciBhIHBvc2l0aW9uIHRoYXQgaGFzIHNldHRsZWQgbm90aGluZyB5ZXQgaXMgYSBjb3JyZWN0IHBheXNsaXAgd2l0aCBhCi8vICAgICBncm9zcyBvZiB6ZXJvLCBhbmQgZmlsdGVyaW5nIGl0IHdvdWxkIHR1cm4gYSB0cnVlIHN0YXRlbWVudCBpbnRvIGEKLy8gICAgIG1pc3NpbmcgbGluZS4KLy8KLy8gQW4gZW1wdHkgbGlzdCBpcyByZWZ1c2VkLiBOb3RoaW5nIGhlcmUgZmlsdGVycyBhIGxpc3QgZG93biB0byBub3RoaW5nLCBzbwovLyBhZnRlciBkZWR1cGxpY2F0aW9uIGEgY2FsbCBhbHdheXMgcHJpY2VzIGF0IGxlYXN0IG9uZSBlbXBsb3llZS4KZnVuYyBQdWJsaXNoKGN1ciByZWFsbSwgZW1wbG95ZWVzIHN0cmluZykgaW50NjQgewoJcmVmdXNlQ29pbnMoY3VyKQoJZW1wbG95ZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglzIDo9IG11c3RTY2hlZHVsZShlbXBsb3llcikKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCglsaXN0LCBkdXBlcyA6PSBwYXJzZUVtcGxveWVlcyhlbXBsb3llZXMpCgoJbGluZXMgOj0gbWFrZShbXSpsaW5lLCAwLCBsZW4obGlzdCkpCgl2YXIgZ3Jvc3MsIHdpdGhoZWxkLCBmZWVMbywgZmVlSGksIGR1ZUdyb3NzIGludDY0Cgl2YXIgemVyb0dyb3NzLCB3aXRoRHVlLCBlbmRlZCBpbnQKCglmb3IgXywgd2hvIDo9IHJhbmdlIGxpc3QgewoJCS8vIEV4aXN0ZW5jZSBmaXJzdCwgYW5kIHdpdGggdGhlIG9uZSBwYXlyb2xsIHZpZXcgdGhhdCBkb2VzIG5vdAoJCS8vIHBhbmljIG9uIGFic2VuY2U6IGV2ZXJ5IG90aGVyIHBvc2l0aW9uIGFjY2Vzc29yIHRoZXJlIHBhbmljcywKCQkvLyB3aGljaCBtYWtlcyB0aGVtIHVudXNhYmxlIGFzIGEgcHJvYmUuIFRoZSBwYW5pYyBiZWxvdyBpcyB0aGlzCgkJLy8gcmVhbG0ncyByZWZ1c2FsLCB3aXRoIHRoaXMgcmVhbG0ncyBtZXNzYWdlLgoJCWlmICFwYXlyb2xsLkhhc1Bvc2l0aW9uKGVtcGxveWVyLCB3aG8pIHsKCQkJcGFuaWMoInBheXNsaXBzOiAiICsgd2hvLlN0cmluZygpICsKCQkJCSIgaGFzIG5vIG9wZW4gcG9zaXRpb24gdW5kZXIgIiArIGVtcGxveWVyLlN0cmluZygpICsKCQkJCSI7IGEgZHJvcHBlZCBsaW5lIHdvdWxkIGJlIGEgc2lsZW50IHVuZGVyLXJlcG9ydCIpCgkJfQoKCQlsIDo9IHByaWNlT25lKGVtcGxveWVyLCB3aG8sIHMsIG5vdykKCQlsaW5lcyA9IGFwcGVuZChsaW5lcywgbCkKCgkJdmFyIG9rIGJvb2wKCQlpZiBncm9zcywgb2sgPSBjaGVja2VkQWRkKGdyb3NzLCBsLmdyb3NzKTsgIW9rIHsKCQkJcGFuaWMoInBheXNsaXBzOiB0b3RhbCBncm9zcyB3b3VsZCBvdmVyZmxvdyIpCgkJfQoJCWlmIHdpdGhoZWxkLCBvayA9IGNoZWNrZWRBZGQod2l0aGhlbGQsIGwud2l0aGhlbGQpOyAhb2sgewoJCQlwYW5pYygicGF5c2xpcHM6IHRvdGFsIHdpdGhob2xkaW5nIHdvdWxkIG92ZXJmbG93IikKCQl9CgkJaWYgZmVlTG8sIG9rID0gY2hlY2tlZEFkZChmZWVMbywgbC5mZWVMbyk7ICFvayB7CgkJCXBhbmljKCJwYXlzbGlwczogdG90YWwgcGxhdGZvcm0tZmVlIGZsb29yIHdvdWxkIG92ZXJmbG93IikKCQl9CgkJaWYgZmVlSGksIG9rID0gY2hlY2tlZEFkZChmZWVIaSwgbC5mZWVIaSk7ICFvayB7CgkJCXBhbmljKCJwYXlzbGlwczogdG90YWwgcGxhdGZvcm0tZmVlIGNlaWxpbmcgd291bGQgb3ZlcmZsb3ciKQoJCX0KCQlpZiBkdWVHcm9zcywgb2sgPSBjaGVja2VkQWRkKGR1ZUdyb3NzLCBsLmR1ZUdyb3NzKTsgIW9rIHsKCQkJcGFuaWMoInBheXNsaXBzOiB0b3RhbCB1bnNldHRsZWQgZ3Jvc3Mgd291bGQgb3ZlcmZsb3ciKQoJCX0KCgkJaWYgbC5ncm9zcyA9PSAwIHsKCQkJemVyb0dyb3NzKysKCQl9CgkJaWYgbC5kdWVHcm9zcyA+IDAgewoJCQl3aXRoRHVlKysKCQl9CgkJaWYgbC5lbmRlZCB7CgkJCWVuZGVkKysKCQl9Cgl9CgoJLy8gQ3Jvc3MtZm9vdCB0aGUgcGVyLWxpbmUgY29sdW1ucyBhZ2FpbnN0IHRoZSB0b3RhbHMuIFRoZSBsb29wIGFib3ZlCgkvLyBhbHJlYWR5IGJ1aWx0IHRoZW0sIHNvIHRoaXMgYXNzZXJ0cyBub3RoaW5nIGFib3V0IHRoZSBhcml0aG1ldGljIOKAlCBpdAoJLy8gYXNzZXJ0cyB0aGF0IHRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc3RvcmVkIGFncmVlcyB3aXRoIHRoZSBsaW5lcwoJLy8gc3RvcmVkIGJlc2lkZSBpdCwgd2hpY2ggaXMgdGhlIG9uZSBpbmNvbnNpc3RlbmN5IGEgcmVhZGVyIG9mIGEgdmlldwoJLy8gY291bGQgbm90IHNlZS4KCWNyb3NzRm9vdChsaW5lcywgZ3Jvc3MsIHdpdGhoZWxkLCBmZWVMbywgZmVlSGksIGR1ZUdyb3NzKQoKCS8vIGZlZUxvIDw9IGZlZUhpIGlzIGFuIGlkZW50aXR5IG9mIHRoZSB0d28gYm91bmRzLCBub3QgYW4gYXNzdW1wdGlvbi4KCS8vIElmIGl0IGV2ZXIgZmFpbHMsIHRoZSBmZWUgaW50ZXJ2YWwgaXMgbm90IGFuIGludGVydmFsIGFuZCBubyBudW1iZXIKCS8vIGRlcml2ZWQgZnJvbSBpdCBpcyBxdW90YWJsZSwgc28gdGhpcyByZWZ1c2VzIHJhdGhlciB0aGFuIHB1Ymxpc2hlcy4KCWlmIGZlZUxvID4gZmVlSGkgewoJCXBhbmljKCJwYXlzbGlwczogdGhlIHBsYXRmb3JtLWZlZSBpbnRlcnZhbCBpcyBpbnZlcnRlZCIpCgl9CgoJa2V5IDo9IGVtcGxveWVyLlN0cmluZygpCglzZXEgOj0gaW50NjQoZW1wbG95ZXJDb3VudChrZXkpKSArIDEKCXBheXNsaXBzLlNldChzbGlwS2V5KGtleSwgc2VxKSwgJnBheXNsaXB7CgkJYXQ6ICAgICAgICBub3csCgkJc2NoZWQ6ICAgICBzLAoJCWZlZUJwczogICAgUGxhdGZvcm1GZWVCcHMsCgkJbGluZXM6ICAgICBsaW5lcywKCQlncm9zczogICAgIGdyb3NzLAoJCXdpdGhoZWxkOiAgd2l0aGhlbGQsCgkJZmVlTG86ICAgICBmZWVMbywKCQlmZWVIaTogICAgIGZlZUhpLAoJCWR1ZUdyb3NzOiAgZHVlR3Jvc3MsCgkJbGlzdGVkOiAgICBsZW4obGlzdCkgKyBkdXBlcywKCQlwcmljZWQ6ICAgIGxlbihsaW5lcyksCgkJemVyb0dyb3NzOiB6ZXJvR3Jvc3MsCgkJd2l0aER1ZTogICB3aXRoRHVlLAoJCWVuZGVkOiAgICAgZW5kZWQsCgkJZHVwZXM6ICAgICBkdXBlcywKCgkJLy8gVGhlIGluY29tcGxldGVuZXNzIGRpc2Nsb3N1cmUuIHJvc3RlckF0IGlzIGhvdyBtYW55IG9wZW4KCQkvLyBwb3NpdGlvbnMgdGhlIGVtcGxveWVyIGhlbGQgYXQgdGhpcyBoZWlnaHQsIHNvCgkJLy8gcm9zdGVyQXQgLSBwcmljZWQgaXMgZXhhY3RseSBob3cgbWFueSB0aGlzIHBheXNsaXAgZGlkIG5vdAoJCS8vIGNvdmVyLiBvcGVuQXQgaXMgdGhlIGNoYWluLXdpZGUgZmlndXJlLCB3aGljaCBpcyB3aGF0IG1ha2VzCgkJLy8gYW4gZW1wbG95ZXIncyBzaGFyZSBvZiB0aGUgcmVhbG0gbGVnaWJsZS4KCQlyb3N0ZXJBdDogcGF5cm9sbC5Sb3N0ZXJPZihlbXBsb3llciksCgkJb3BlbkF0OiAgIHBheXJvbGwuT3BlblBvc2l0aW9ucygpLAoJfSkKCWNvdW50cy5TZXQoa2V5LCBpbnQoc2VxKSkKCXNsaXBDb3VudCsrCgoJLy8gRXZlcnkgYXR0cmlidXRlIGhlcmUgcmVhZHMgdGhlIHJlY29yZCB0aGF0IHdhcyBqdXN0IHN0b3JlZCwgYW5kCgkvLyBgb21pdHRlZGAgZ29lcyB0aHJvdWdoIFtPbWl0dGVkUm9zdGVyXSByYXRoZXIgdGhhbiByZWNvbXB1dGluZwoJLy8gcm9zdGVyQXQgLSBwcmljZWQuIFR3byByZWFzb25zLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgbG9hZC1iZWFyaW5nIG9uZToKCS8vCgkvLyAgIC0gYSBzZWNvbmQgcGF5cm9sbC5Sb3N0ZXJPZiBjYWxsIGlzIGEgc2Vjb25kIGNoYWluIHJlYWQsIGFuZCBub3RoaW5nCgkvLyAgICAgZ3VhcmFudGVlcyBpdCBhZ3JlZXMgd2l0aCB0aGUgcm9zdGVyQXQgbm93IGZyb3plbiBpbiB0aGUgcmVjb3JkOwoJLy8gICAtIEFOIEVNSVRURUQgQVRUUklCVVRFIElTIFVOQVNTRVJUQUJMRSBGUk9NIEEgR05PIFVOSVQgVEVTVC4gY2hhaW4uRW1pdAoJLy8gICAgIGhhcyBubyByZWFkZXIgYW5kIHRoZSB0ZXN0aW5nIHN0ZGxpYiBleHBvc2VzIG5vbmUsIHNvIGFuIGV2ZW50IGNvcHkKCS8vICAgICBvZiBhIGRlcml2ZWQgZmlndXJlIGhhcyBubyBjb250cm9sIG92ZXIgaXQgYXQgYWxsLiBSb3V0aW5nIGl0IHRocm91Z2gKCS8vICAgICB0aGUgZXhwb3J0ZWQgYWNjZXNzb3IgdGhlIHN1aXRlIGRvZXMgcGluIG1ha2VzIHRoZSBldmVudCB1bmFibGUgdG8KCS8vICAgICBkaXNhZ3JlZSB3aXRoIENvdmVyYWdlIGJ5IGNvbnN0cnVjdGlvbiwgd2hpY2ggaXMgdGhlIG9ubHkgbWl0aWdhdGlvbgoJLy8gICAgIGF2YWlsYWJsZSBhdCB0aGlzIGxheWVyLiBNZWFzdXJlZDogYSBzYWJvdGFnZSByZXBsYWNpbmcgdGhpcyBmaWd1cmUKCS8vICAgICB3aXRoIGxlbihsaW5lcykgd2FzIFVOQ0FVR0hUIGJ5IGEgMzMtdGVzdCBzdWl0ZS4KCWNoYWluLkVtaXQoIlBheXNsaXBQdWJsaXNoZWQiLAoJCSJlbXBsb3llciIsIGtleSwKCQkic2VxIiwgc3RyY29udi5Gb3JtYXRJbnQoc2VxLCAxMCksCgkJImF0Iiwgc3RyY29udi5Gb3JtYXRJbnQobm93LCAxMCksCgkJImxpbmVzIiwgc3RyY29udi5JdG9hKGxlbihsaW5lcykpLAoJCSJncm9zcyIsIHN0cmNvbnYuRm9ybWF0SW50KGdyb3NzLCAxMCksCgkJIndpdGhoZWxkIiwgc3RyY29udi5Gb3JtYXRJbnQod2l0aGhlbGQsIDEwKSwKCQkiZmVlTG8iLCBzdHJjb252LkZvcm1hdEludChmZWVMbywgMTApLAoJCSJmZWVIaSIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZUhpLCAxMCksCgkJImR1ZUdyb3NzIiwgc3RyY29udi5Gb3JtYXRJbnQoZHVlR3Jvc3MsIDEwKSwKCQkib21pdHRlZCIsIHN0cmNvbnYuSXRvYShPbWl0dGVkUm9zdGVyKGVtcGxveWVyLCBzZXEpKSkKCXJldHVybiBzZXEKfQoKLy8gcHJpY2VPbmUgYnVpbGRzIG9uZSBsaW5lIGZyb20gci9wYXlyb2xsJ3Mgdmlld3MuIEV2ZXJ5IGFyaXRobWV0aWMgcmVmdXNhbAovLyBoZXJlIGlzIGEgcGFuaWMgcmF0aGVyIHRoYW4gYSB6ZXJvLCBiZWNhdXNlIGEgdmlldyB0aGF0IHJlZnVzZXMgaXMKLy8gcmVjb3ZlcmFibGUgYW5kIGEgdmlldyB0aGF0IGxpZXMgaXMgbm90IOKAlCBwYXlyb2xsJ3Mgb3duIER1ZUFtb3VudCBzdGF0ZXMgdGhlCi8vIHNhbWUgcnVsZSBmb3IgdGhlIHNhbWUgcmVhc29uLgpmdW5jIHByaWNlT25lKGVtcGxveWVyLCB3aG8gYWRkcmVzcywgcyB0aWVycy5TY2hlZHVsZSwgbm93IGludDY0KSAqbGluZSB7CglwcCA6PSBwYXlyb2xsLlBhaWRQZXJpb2RzT2YoZW1wbG95ZXIsIHdobykKCXBlciA6PSBwYXlyb2xsLlBlclBlcmlvZE9mKGVtcGxveWVyLCB3aG8pCgoJZ3Jvc3MsIG9rIDo9IGNoZWNrZWRNdWwocHAsIHBlcikKCWlmICFvayB7CgkJcGFuaWMoInBheXNsaXBzOiBzZXR0bGVkIGdyb3NzIGZvciAiICsgd2hvLlN0cmluZygpICsKCQkJIiB3b3VsZCBvdmVyZmxvdzsgcmVhZCBQYWlkUGVyaW9kc09mIGFuZCBQZXJQZXJpb2RPZiBkaXJlY3RseSIpCgl9CgoJd2l0aGhlbGQsIGVyciA6PSBzLkNoYXJnZShncm9zcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJwYXlzbGlwczogIiArIGVyci5FcnJvcigpKQoJfQoJLy8gcC90aWVycyBndWFyYW50ZWVzIENoYXJnZShuKSA8PSBuLiBBc3NlcnRpbmcgaXQgY29zdHMgb25lIGNvbXBhcmlzb24KCS8vIGFuZCB0dXJucyBhIGJyb2tlbiBkZXBlbmRlbmN5IGludG8gYSByZWZ1c2FsIGluc3RlYWQgb2YgYSBwYXlzbGlwCgkvLyBjbGFpbWluZyBtb3JlIHdhcyB3aXRoaGVsZCB0aGFuIHdhcyBlYXJuZWQuCglpZiB3aXRoaGVsZCA+IGdyb3NzIHsKCQlwYW5pYygicGF5c2xpcHM6IHdpdGhob2xkaW5nIGV4Y2VlZHMgZ3Jvc3MsIHdoaWNoIHAvdGllcnMgZm9yYmlkcyIpCgl9CgoJLy8gVGhlIGZlZSBpbnRlcnZhbC4gQm90aCBlbmRwb2ludHMgZ28gdGhyb3VnaCB0aGUgc2FtZSBhdWRpdGVkCgkvLyBwcmltaXRpdmU7IHNlZSB0aGUgcGxhdGZvcm1GZWUgdmFyIGZvciB3aHkuCglmZWVIaSwgZXJyIDo9IHBsYXRmb3JtRmVlLkNoYXJnZShncm9zcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJwYXlzbGlwczogIiArIGVyci5FcnJvcigpKQoJfQoJdW5pdCwgZXJyIDo9IHBsYXRmb3JtRmVlLkNoYXJnZShwZXIpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygicGF5c2xpcHM6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCWZlZUxvLCBvayA6PSBjaGVja2VkTXVsKHBwLCB1bml0KQoJaWYgIW9rIHsKCQlwYW5pYygicGF5c2xpcHM6IHBsYXRmb3JtLWZlZSBmbG9vciBmb3IgIiArIHdoby5TdHJpbmcoKSArICIgd291bGQgb3ZlcmZsb3ciKQoJfQoKCWRwIDo9IHBheXJvbGwuRHVlUGVyaW9kcyhlbXBsb3llciwgd2hvKQoJZHVlR3Jvc3MsIG9rIDo9IGNoZWNrZWRNdWwoZHAsIHBlcikKCWlmICFvayB7CgkJcGFuaWMoInBheXNsaXBzOiB1bnNldHRsZWQgZ3Jvc3MgZm9yICIgKyB3aG8uU3RyaW5nKCkgKwoJCQkiIHdvdWxkIG92ZXJmbG93OyByZWFkIER1ZVBlcmlvZHMgYW5kIFBlclBlcmlvZE9mIGRpcmVjdGx5IikKCX0KCgllbmQgOj0gcGF5cm9sbC5FbmRIZWlnaHRPZihlbXBsb3llciwgd2hvKQoKCXJldHVybiAmbGluZXsKCQllbXBsb3llZTogICAgd2hvLAoJCXBhaWRQZXJpb2RzOiBwcCwKCQlwZXJQZXJpb2Q6ICAgcGVyLAoJCWdyb3NzOiAgICAgICBncm9zcywKCQl3aXRoaGVsZDogICAgd2l0aGhlbGQsCgkJZmVlTG86ICAgICAgIGZlZUxvLAoJCWZlZUhpOiAgICAgICBmZWVIaSwKCQlkdWVHcm9zczogICAgZHVlR3Jvc3MsCgkJZW5kZWQ6ICAgICAgIGVuZCAhPSBwYXlyb2xsLk9wZW5FbmRlZCAmJiBlbmQgPD0gbm93LAoJfQp9CgpmdW5jIGNyb3NzRm9vdChsaW5lcyBbXSpsaW5lLCBncm9zcywgd2l0aGhlbGQsIGZlZUxvLCBmZWVIaSwgZHVlR3Jvc3MgaW50NjQpIHsKCXZhciBnLCB3LCBsbywgaGksIGQgaW50NjQKCWZvciBfLCBsIDo9IHJhbmdlIGxpbmVzIHsKCQlnICs9IGwuZ3Jvc3MKCQl3ICs9IGwud2l0aGhlbGQKCQlsbyArPSBsLmZlZUxvCgkJaGkgKz0gbC5mZWVIaQoJCWQgKz0gbC5kdWVHcm9zcwoJfQoJaWYgZyAhPSBncm9zcyB8fCB3ICE9IHdpdGhoZWxkIHx8IGxvICE9IGZlZUxvIHx8IGhpICE9IGZlZUhpIHx8IGQgIT0gZHVlR3Jvc3MgewoJCXBhbmljKCJwYXlzbGlwczogdGhlIHN0b3JlZCB0b3RhbHMgZG8gbm90IGFncmVlIHdpdGggdGhlIHN0b3JlZCBsaW5lcyIpCgl9Cn0KCi8vIC0tLSByZWFkaW5nIGEgcGF5c2xpcCAtLS0KCi8vIFB1Ymxpc2hlZEF0IGlzIHRoZSBoZWlnaHQgYSBwYXlzbGlwIHdhcyBwdWJsaXNoZWQgYXQsIHdoaWNoIGlzIHRoZSBoZWlnaHQKLy8gZXZlcnkgZmlndXJlIGluIGl0IHdhcyByZWFkIGF0LgpmdW5jIFB1Ymxpc2hlZEF0KGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpLmF0Cn0KCi8vIEdyb3NzT2YgaXMgYSBwYXlzbGlwJ3MgdG90YWwgU0VUVExFRCBncm9zcy4gUmVhZCBpdCBiZXNpZGUKLy8gW1Vuc2V0dGxlZEdyb3NzT2ZdIGFuZCBbT21pdHRlZFJvc3Rlcl06IG5laXRoZXIgaXMgYW4gZXJyb3IsIGFuZCBib3RoIGNoYW5nZQovLyB3aGF0IHRoaXMgbnVtYmVyIG1lYW5zLgpmdW5jIEdyb3NzT2YoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gbXVzdFBheXNsaXAoZW1wbG95ZXIsIHNlcSkuZ3Jvc3MKfQoKLy8gV2l0aGhlbGRPZiBpcyB0aGUgc2NoZWR1bGUncyB0b3RhbCBjaGFyZ2Ugb24gdGhlIGdyb3NzLgpmdW5jIFdpdGhoZWxkT2YoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gbXVzdFBheXNsaXAoZW1wbG95ZXIsIHNlcSkud2l0aGhlbGQKfQoKLy8gUGxhdGZvcm1GZWVSYW5nZSBib3VuZHMgdGhlIGFjY3J1YWwgZmVlIHIvcGF5cm9sbCBhbHJlYWR5IHRvb2sgb24gdGhpcwovLyBncm9zcy4gSXQgaXMgYW4gaW50ZXJ2YWwgYmVjYXVzZSB0aGUgZmVlIGRlcGVuZHMgb24gYWNjcnVhbCBiYXRjaGluZywgd2hpY2gKLy8gcGF5cm9sbCBkb2VzIG5vdCBleHBvc2Ug4oCUIHNlZSB0aGUgcGFja2FnZSBkb2MuIGxvID09IGhpIGlzIGNvbW1vbiBhbmQgbWVhbnMKLy8gdGhlIGJhdGNoaW5nIGNvdWxkIG5vdCBoYXZlIG1hdHRlcmVkLgpmdW5jIFBsYXRmb3JtRmVlUmFuZ2UoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSAobG8sIGhpIGludDY0KSB7CglwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCglyZXR1cm4gcC5mZWVMbywgcC5mZWVIaQp9CgovLyBOZXRSYW5nZSBib3VuZHMgd2hhdCB0aGUgZW1wbG95ZWUga2VwdDogZ3Jvc3MsIGxlc3MgdGhlIHNjaGVkdWxlJ3MKLy8gd2l0aGhvbGRpbmcsIGxlc3MgcGF5cm9sbCdzIGZlZS4gVGhlIGludGVydmFsIGlzIGluaGVyaXRlZCB3aG9sZSBmcm9tCi8vIFtQbGF0Zm9ybUZlZVJhbmdlXSDigJQgdGhlIHdpdGhob2xkaW5nIGl0c2VsZiBpcyBleGFjdC4KLy8KLy8gSVQgQ0FOIEJFIE5FR0FUSVZFLCBhbmQgdGhhdCBpcyBhIGZpbmRpbmcgcmF0aGVyIHRoYW4gYSBidWcuIEEgc2NoZWR1bGUgbWF5Ci8vIGxlZ2FsbHkgY2hhcmdlIHVwIHRvIDEwMCUsIGFuZCBwYXlyb2xsJ3MgZmVlIGlzIHRha2VuIG9uIHRvcCBvZiB3aGF0ZXZlcgovLyB0aGlzIHJlYWxtIHdpdGhob2xkcywgc28gYSBzY2hlZHVsZSBhdCBvciBuZWFyIHRoZSBjZWlsaW5nIHdpdGhob2xkcyBtb3JlCi8vIHRoYW4gdGhlIGVtcGxveWVlIGFjdHVhbGx5IHJlY2VpdmVkLiBbT3ZlcldpdGhoZWxkXSBuYW1lcyB0aGF0IGNhc2UuCmZ1bmMgTmV0UmFuZ2UoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSAobG8sIGhpIGludDY0KSB7CglwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCglyZXR1cm4gcC5ncm9zcyAtIHAud2l0aGhlbGQgLSBwLmZlZUhpLCBwLmdyb3NzIC0gcC53aXRoaGVsZCAtIHAuZmVlTG8KfQoKLy8gVW5zZXR0bGVkR3Jvc3NPZiBpcyBncm9zcyB0aGF0IGhhZCBjb21wbGV0ZWQgYW5kIG5vdCBiZWVuIGFjY3J1ZWQgYXQgdGhlCi8vIHBheXNsaXAncyBoZWlnaHQsIGFuZCBpcyB0aGVyZWZvcmUgRVhDTFVERUQgZnJvbSBbR3Jvc3NPZl0uIE5vbi16ZXJvIGlzCi8vIG5vcm1hbDogcGF5cm9sbCBhY2NydWVzIG9uIGRlbWFuZC4KZnVuYyBVbnNldHRsZWRHcm9zc09mKGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpLmR1ZUdyb3NzCn0KCi8vIE92ZXJXaXRoaGVsZCByZXBvcnRzIHdoZXRoZXIgdGhpcyBwYXlzbGlwJ3Mgd2l0aGhvbGRpbmcgcGx1cyBwYXlyb2xsJ3MKLy8gbGFyZ2VzdCBwb3NzaWJsZSBmZWUgZXhjZWVkcyB0aGUgZ3Jvc3MuIFRydWUgaXMgYWxtb3N0IGFsd2F5cyBhIHRyYW5zcG9zZWQKLy8gb3IgbWlzLXNjYWxlZCByYXRlIGFycmF5LCB3aGljaCBbcC90aWVyc10gY2Fubm90IGRldGVjdCwgc28gdGhpcyByZWFsbQovLyBzdXJmYWNlcyBpdCBpbnN0ZWFkIG9mIHJlZnVzaW5nIHRvIHB1Ymxpc2ggaXQg4oCUIGEgcmVmdXNhbCB3b3VsZCBsb3NlIHRoZQovLyBldmlkZW5jZS4KZnVuYyBPdmVyV2l0aGhlbGQoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCWxvLCBfIDo9IE5ldFJhbmdlKGVtcGxveWVyLCBzZXEpCglyZXR1cm4gbG8gPCAwCn0KCi8vIEZlZUJwc0F0IGlzIHRoZSBwbGF0Zm9ybSBmZWUgcmF0ZSB0aGlzIHBheXNsaXAgd2FzIHByaWNlZCBhZ2FpbnN0LgpmdW5jIEZlZUJwc0F0KGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpLmZlZUJwcwp9CgovLyBTY2hlZHVsZUF0IGlzIHRoZSBzY2hlZHVsZSB0aGF0IHByaWNlZCB0aGlzIHBheXNsaXAsIGFzIGNvbW1hLXNlcGFyYXRlZAovLyBsaXN0cyB0aGF0IHJvdW5kLXRyaXAgZXhhY3RseSB0aHJvdWdoIFtTZXRTY2hlZHVsZV0uIFRoZSBzbmFwc2hvdCwgbm90IHRoZQovLyBlbXBsb3llcidzIGN1cnJlbnQgc2NoZWR1bGUg4oCUIHNlZSBbU2NoZWR1bGVPZl0gZm9yIHRoYXQuCmZ1bmMgU2NoZWR1bGVBdChlbXBsb3llciBhZGRyZXNzLCBzZXEgaW50NjQpIChlZGdlcywgcmF0ZXMgc3RyaW5nKSB7CglzIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpLnNjaGVkCglyZXR1cm4gZm9ybWF0SW50NjRMaXN0KHMuRWRnZXMoKSksIGZvcm1hdEludDY0TGlzdChzLlJhdGVzKCkpCn0KCi8vIENvdmVyYWdlIGlzIHRoZSBwYXlzbGlwJ3MgY292ZXJhZ2UgbGluZSwgYW5kIGl0IGlzIHRoZSBudW1iZXIgdG8gcmVhZCBiZWZvcmUKLy8gYW55IHRvdGFsLgovLwovLwlsaXN0ZWQgICAgIGVtcGxveWVlcyB0aGUgY2FsbGVyIG5hbWVkLCBkdXBsaWNhdGVzIGluY2x1ZGVkCi8vCXByaWNlZCAgICAgbGluZXMgaW4gdGhlIHJlY29yZAovLwl6ZXJvR3Jvc3MgIHByaWNlZCBsaW5lcyB3aG9zZSBzZXR0bGVkIGdyb3NzIGlzIHplcm8KLy8Jd2l0aER1ZSAgICBwcmljZWQgbGluZXMgd2l0aCBncm9zcyBkdWUgYW5kIG5vdCBhY2NydWVkCi8vCWVuZGVkICAgICAgcHJpY2VkIGxpbmVzIHdob3NlIHBvc2l0aW9uJ3MgY2xvY2sgaGFkIHN0b3BwZWQKLy8JZHVwZXMgICAgICBkdXBsaWNhdGUgbmFtZXMgZHJvcHBlZAovLwlyb3N0ZXJBdCAgIG9wZW4gcG9zaXRpb25zIHRoZSBlbXBsb3llciBoZWxkIGF0IHRoaXMgaGVpZ2h0Ci8vCW9wZW5BdCAgICAgb3BlbiBwb3NpdGlvbnMgYWNyb3NzIGV2ZXJ5IGVtcGxveWVyIGF0IHRoaXMgaGVpZ2h0Ci8vCi8vIGxpc3RlZCA9PSBwcmljZWQgKyBkdXBlcyBhbHdheXMsIGJ5IGNvbnN0cnVjdGlvbjogbm90aGluZyBlbHNlIGlzIGRyb3BwZWQuCi8vIHJvc3RlckF0IC0gcHJpY2VkIGlzIFtPbWl0dGVkUm9zdGVyXS4KZnVuYyBDb3ZlcmFnZShlbXBsb3llciBhZGRyZXNzLCBzZXEgaW50NjQpIChsaXN0ZWQsIHByaWNlZCwgemVyb0dyb3NzLCB3aXRoRHVlLCBlbmRlZCwgZHVwZXMsIHJvc3RlckF0LCBvcGVuQXQgaW50KSB7CglwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCglyZXR1cm4gcC5saXN0ZWQsIHAucHJpY2VkLCBwLnplcm9Hcm9zcywgcC53aXRoRHVlLCBwLmVuZGVkLCBwLmR1cGVzLCBwLnJvc3RlckF0LCBwLm9wZW5BdAp9CgovLyBPbWl0dGVkUm9zdGVyIGlzIGhvdyBtYW55IG9mIHRoZSBlbXBsb3llcidzIG9wZW4gcG9zaXRpb25zIHRoaXMgcGF5c2xpcCBkaWQKLy8gbm90IHByaWNlLiBJdCBpcyB0aGUgb25lIG51bWJlciB0aGF0IHNheXMgd2hldGhlciBhIHBheXNsaXAgaXMgY29tcGxldGUsIGFuZAovLyBhIHRvdGFsIHJlYWQgd2l0aG91dCBpdCBpcyBiZWluZyByZWFkIHdyb25nbHkuCi8vCi8vIEl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogZXZlcnkgcHJpY2VkIGxpbmUgaGFzIGFuIG9wZW4gcG9zaXRpb24gdW5kZXIgdGhpcwovLyBlbXBsb3llciBhdCB0aGUgcGF5c2xpcCdzIGhlaWdodCwgZHVwbGljYXRlcyBhcmUgZHJvcHBlZCBiZWZvcmUgcHJpY2luZywgc28KLy8gcHJpY2VkIGlzIGEgY291bnQgb2YgZGlzdGluY3Qgb3BlbiBwb3NpdGlvbnMgYW5kIHJvc3RlckF0IGlzIHRoZWlyIHRvdGFsLgpmdW5jIE9taXR0ZWRSb3N0ZXIoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQgewoJcCA6PSBtdXN0UGF5c2xpcChlbXBsb3llciwgc2VxKQoJcmV0dXJuIHAucm9zdGVyQXQgLSBwLnByaWNlZAp9CgovLyBMaW5lcyBpcyBob3cgbWFueSBlbXBsb3llZXMgYSBwYXlzbGlwIHByaWNlcy4KZnVuYyBMaW5lcyhlbXBsb3llciBhZGRyZXNzLCBzZXEgaW50NjQpIGludCB7CglyZXR1cm4gbGVuKG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpLmxpbmVzKQp9CgovLyBMaW5lQXQgaXMgb25lIGVtcGxveWVlJ3Mgc3RhdGVtZW50LCBieSBpbmRleCBpbiB0aGUgb3JkZXIgdGhlIGNhbGxlciBuYW1lZAovLyB0aGVtLiBncm9zcyBpcyBwYWlkUGVyaW9kcyAqIHBlclBlcmlvZCBhbmQgY2FuIGJlIHJlLWRlcml2ZWQgZnJvbSB0aGUgdHdvCi8vIGZhY3RzIHJldHVybmVkIGJlc2lkZSBpdC4KZnVuYyBMaW5lQXQoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0LCBpIGludCkgKGVtcGxveWVlIGFkZHJlc3MsIHBhaWRQZXJpb2RzLCBwZXJQZXJpb2QsIGdyb3NzLCB3aXRoaGVsZCwgZmVlTG8sIGZlZUhpLCBkdWVHcm9zcyBpbnQ2NCkgewoJbCA6PSBtdXN0TGluZShlbXBsb3llciwgc2VxLCBpKQoJcmV0dXJuIGwuZW1wbG95ZWUsIGwucGFpZFBlcmlvZHMsIGwucGVyUGVyaW9kLCBsLmdyb3NzLCBsLndpdGhoZWxkLCBsLmZlZUxvLCBsLmZlZUhpLCBsLmR1ZUdyb3NzCn0KCi8vIExpbmVFbmRlZCByZXBvcnRzIHdoZXRoZXIgdGhpcyBsaW5lJ3MgcG9zaXRpb24gaGFkIGJlZW4gdGVybWluYXRlZCBvciBoYWQKLy8gcGFzc2VkIGl0cyBlbmQgaGVpZ2h0IHdoZW4gdGhlIHBheXNsaXAgd2FzIHB1Ymxpc2hlZC4gQW4gZW5kZWQgcG9zaXRpb24gY2FuCi8vIHN0aWxsIGNhcnJ5IHVuc2V0dGxlZCBncm9zczogcGF5cm9sbCBrZWVwcyB0aGUgb2JsaWdhdGlvbiBhbGl2ZSBwYXN0Ci8vIFRlcm1pbmF0ZSBvbiBwdXJwb3NlLgpmdW5jIExpbmVFbmRlZChlbXBsb3llciBhZGRyZXNzLCBzZXEgaW50NjQsIGkgaW50KSBib29sIHsKCXJldHVybiBtdXN0TGluZShlbXBsb3llciwgc2VxLCBpKS5lbmRlZAp9CgovLyBMaW5lTmV0UmFuZ2UgYm91bmRzIHdoYXQgdGhpcyBlbXBsb3llZSBrZXB0LiBTYW1lIGludGVydmFsIGFzIFtOZXRSYW5nZV0sCi8vIG9uZSBsaW5lLgpmdW5jIExpbmVOZXRSYW5nZShlbXBsb3llciBhZGRyZXNzLCBzZXEgaW50NjQsIGkgaW50KSAobG8sIGhpIGludDY0KSB7CglsIDo9IG11c3RMaW5lKGVtcGxveWVyLCBzZXEsIGkpCglyZXR1cm4gbC5ncm9zcyAtIGwud2l0aGhlbGQgLSBsLmZlZUhpLCBsLmdyb3NzIC0gbC53aXRoaGVsZCAtIGwuZmVlTG8KfQoKLy8gVGllckJyZWFrZG93biBpcyB0aGUgd2l0aGhvbGRpbmcgb24gb25lIGxpbmUgc3BsaXQgYnkgYnJhY2tldCwgYXMgYQovLyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBpbiB0aWVyIG9yZGVyIOKAlCB0aGUgY29sdW1uIGEgcGF5c2xpcCByZWFkZXIgYWN0dWFsbHkKLy8gd2FudHMsIGJlY2F1c2UgaXQgc2hvd3Mgd2hpY2ggYnJhY2tldHMgdGhlIGdyb3NzIHJlYWNoZWQuCi8vCi8vIEl0IGlzIHJlY29tcHV0ZWQgZnJvbSB0aGUgcGF5c2xpcCdzIG93biBzY2hlZHVsZSBzbmFwc2hvdCByYXRoZXIgdGhhbgovLyBzdG9yZWQsIHNvIGl0IGlzIGV4YWN0IGZvciB0aGUgc2NoZWR1bGUgdGhhdCBwcmljZWQgdGhlIGxpbmUgYW5kIGNvc3RzIG5vCi8vIHN0b3JhZ2UuIEl0IGNyb3NzLWZvb3RzIHRoZSBjb2x1bW4gYWdhaW5zdCB0aGUgc3RvcmVkIHRvdGFsIGJlZm9yZSByZXR1cm5pbmcKLy8gaXQ6IFtwL3RpZXJzXSBET0NVTUVOVFMgdGhhdCBDaGFyZ2UgaXMgZGVmaW5lZCBhcyB0aGUgc3VtIG9mIENoYXJnZUJ5VGllciwKLy8gYW5kIGEgZG9jdW1lbnRlZCBpZGVudGl0eSBhY3Jvc3MgYSBwYWNrYWdlIGJvdW5kYXJ5IGlzIHdvcnRoIG9uZSBsb29wIHRvCi8vIGFzc2VydC4KZnVuYyBUaWVyQnJlYWtkb3duKGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCwgaSBpbnQpIHN0cmluZyB7CglwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCglsIDo9IG11c3RMaW5lKGVtcGxveWVyLCBzZXEsIGkpCgljb2wsIGVyciA6PSBwLnNjaGVkLkNoYXJnZUJ5VGllcihsLmdyb3NzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoInBheXNsaXBzOiAiICsgZXJyLkVycm9yKCkpCgl9Cgl2YXIgc3VtIGludDY0Cglmb3IgXywgYyA6PSByYW5nZSBjb2wgewoJCXN1bSArPSBjCgl9CglpZiBzdW0gIT0gbC53aXRoaGVsZCB7CgkJcGFuaWMoInBheXNsaXBzOiB0aGUgcGVyLXRpZXIgY29sdW1uIGRvZXMgbm90IHN1bSB0byB0aGUgd2l0aGhvbGRpbmciKQoJfQoJcmV0dXJuIGZvcm1hdEludDY0TGlzdChjb2wpCn0KCi8vIC0tLSByZWFkaW5nIGFuIGVtcGxveWVyIC0tLQoKLy8gU2NoZWR1bGVPZiBpcyBhbiBlbXBsb3llcidzIENVUlJFTlQgc2NoZWR1bGUsIGFzIGxpc3RzIHRoYXQgcm91bmQtdHJpcAovLyB0aHJvdWdoIFtTZXRTY2hlZHVsZV0uIEl0IGlzIG5vdCB3aGF0IHByaWNlZCBhbnkgcHVibGlzaGVkIHBheXNsaXAg4oCUIHNlZQovLyBbU2NoZWR1bGVBdF0uCmZ1bmMgU2NoZWR1bGVPZihlbXBsb3llciBhZGRyZXNzKSAoZWRnZXMsIHJhdGVzIHN0cmluZykgewoJcyA6PSBtdXN0U2NoZWR1bGUoZW1wbG95ZXIpCglyZXR1cm4gZm9ybWF0SW50NjRMaXN0KHMuRWRnZXMoKSksIGZvcm1hdEludDY0TGlzdChzLlJhdGVzKCkpCn0KCi8vIE51bVRpZXJzT2YgaXMgaG93IG1hbnkgYnJhY2tldHMgYW4gZW1wbG95ZXIncyBjdXJyZW50IHNjaGVkdWxlIGhhcy4KZnVuYyBOdW1UaWVyc09mKGVtcGxveWVyIGFkZHJlc3MpIGludCB7IHJldHVybiBtdXN0U2NoZWR1bGUoZW1wbG95ZXIpLk51bVRpZXJzKCkgfQoKLy8gSGFzU2NoZWR1bGUgcmVwb3J0cyB3aGV0aGVyIGFuIGVtcGxveWVyIGhhcyBzZXQgYSBzY2hlZHVsZSwgd2l0aG91dAovLyBwYW5pY2tpbmcgb24gYWJzZW5jZSDigJQgZXZlcnkgb3RoZXIgc2NoZWR1bGUgYWNjZXNzb3IgcGFuaWNzLCB3aGljaCBtYWtlcwovLyB0aGVtIHVudXNhYmxlIGFzIGFuIGV4aXN0ZW5jZSBwcm9iZS4KZnVuYyBIYXNTY2hlZHVsZShlbXBsb3llciBhZGRyZXNzKSBib29sIHsKCV8sIG9rIDo9IHNjaGVkdWxlcy5HZXQoZW1wbG95ZXIuU3RyaW5nKCkpLih0aWVycy5TY2hlZHVsZSkKCXJldHVybiBvawp9CgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGEgcGF5c2xpcCBleGlzdHMsIHNvIHRoZSByZWNvcmQgYWNjZXNzb3JzIGNhbiBiZQovLyBwcmUtY2hlY2tlZCByYXRoZXIgdGhhbiByZWNvdmVyZWQgZnJvbS4gRXZlcnkgb25lIG9mIHRoZW0gcGFuaWNzIG9uIGFuCi8vIGFic2VudCByZWNvcmQsIHdoaWNoIGlzIGRlbGliZXJhdGUg4oCUIHJldHVybmluZyBhIHplcm8gZmlndXJlIGZvciBhIHBheXNsaXAKLy8gdGhhdCB3YXMgbmV2ZXIgcHVibGlzaGVkIGlzIHRoZSBleGFjdCBzaWxlbnQgdW5kZXItcmVwb3J0IHRoaXMgcmVhbG0gZXhpc3RzCi8vIHRvIHJlZnVzZSDigJQgYnV0IGEgcGFuaWMgaXMgb25seSBhIHVzYWJsZSBjb250cmFjdCB3aGVuIHRoZSBjYWxsZXIgaGFzIGEgd2F5Ci8vIG5vdCB0byBoaXQgaXQuCi8vCi8vIEl0IGlzIGhlcmUgYmVmb3JlIHRoZSBmaXJzdCBkZXBsb3kgcmF0aGVyIHRoYW4gaW4gYSBzdWNjZXNzb3IgYmVjYXVzZSBhCi8vIHJlYWxtJ3MgYnl0ZXMgYXJlIGZyb3plbiBieSBhZGRwa2c6IGFuIGFjY2Vzc29yIGEgY29uc3VtZXIgbmVlZHMgY2Fubm90IGJlCi8vIGFkZGVkIGFmdGVyd2FyZHMuCmZ1bmMgSGFzKGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgYm9vbCB7CglfLCBvayA6PSBwYXlzbGlwcy5HZXQoc2xpcEtleShlbXBsb3llci5TdHJpbmcoKSwgc2VxKSkuKCpwYXlzbGlwKQoJcmV0dXJuIG9rCn0KCi8vIENoYXJnZU9uIHF1b3RlcyBhbiBlbXBsb3llcidzIGN1cnJlbnQgc2NoZWR1bGUgYWdhaW5zdCBhbiBhcmJpdHJhcnkgZ3Jvc3MKLy8gd2l0aG91dCBwdWJsaXNoaW5nIGFueXRoaW5nLiBUaGUgcXVvdGUgYSBjYWxsZXIgbmVlZHMgYmVmb3JlIGNob29zaW5nIGEKLy8gc2NoZWR1bGUsIGFuZCB0aGUgb25lIHZpZXcgaGVyZSB0aGF0IGlzIG5vdCBhYm91dCBhIHJlY29yZC4KZnVuYyBDaGFyZ2VPbihlbXBsb3llciBhZGRyZXNzLCBncm9zcyBpbnQ2NCkgaW50NjQgewoJYywgZXJyIDo9IG11c3RTY2hlZHVsZShlbXBsb3llcikuQ2hhcmdlKGdyb3NzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoInBheXNsaXBzOiAiICsgZXJyLkVycm9yKCkpCgl9CglyZXR1cm4gYwp9CgovLyBNYXJnaW5hbFJhdGVPZiBpcyB0aGUgcmF0ZSBhbiBlbXBsb3llcidzIGN1cnJlbnQgc2NoZWR1bGUgd291bGQgY2hhcmdlIG9uCi8vIHRoZSBuZXh0IHVnbm90IG9mIGdyb3NzIHBhc3QgdGhlIGdpdmVuIGFtb3VudCwgb2YgW1JhdGVTY2FsZV0uCmZ1bmMgTWFyZ2luYWxSYXRlT2YoZW1wbG95ZXIgYWRkcmVzcywgZ3Jvc3MgaW50NjQpIGludDY0IHsKCXIsIGVyciA6PSBtdXN0U2NoZWR1bGUoZW1wbG95ZXIpLk1hcmdpbmFsUmF0ZShncm9zcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJwYXlzbGlwczogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIHIKfQoKLy8gQ291bnQgaXMgaG93IG1hbnkgcGF5c2xpcHMgYW4gZW1wbG95ZXIgaGFzIHB1Ymxpc2hlZC4gU2VxdWVuY2UgbnVtYmVycyBydW4KLy8gMS4uQ291bnQgd2l0aCBubyBnYXBzOiBhIHBheXNsaXAgaXMgbmV2ZXIgcmVtb3ZlZC4KZnVuYyBDb3VudChlbXBsb3llciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gZW1wbG95ZXJDb3VudChlbXBsb3llci5TdHJpbmcoKSkgfQoKLy8gUGF5c2xpcHMgaXMgaG93IG1hbnkgcGF5c2xpcHMgZXhpc3QgYWNyb3NzIGV2ZXJ5IGVtcGxveWVyLgpmdW5jIFBheXNsaXBzKCkgaW50IHsgcmV0dXJuIHNsaXBDb3VudCB9CgovLyBFbXBsb3llcnMgaXMgaG93IG1hbnkgYWRkcmVzc2VzIGhhdmUgc2V0IGEgc2NoZWR1bGUgaGVyZS4gTm90ZSB0aGUgdGVuc2U6IGEKLy8gc2NoZWR1bGUgc3Vydml2ZXMsIHNvIHRoaXMgaXMgbm90IGEgY291bnQgb2YgZW1wbG95ZXJzIHdpdGggcGF5c2xpcHMuCmZ1bmMgRW1wbG95ZXJzKCkgaW50IHsgcmV0dXJuIHNjaGVkdWxlcy5TaXplKCkgfQoKLy8gSGVpZ2h0IGlzIHRoZSBjdXJyZW50IGNoYWluIGhlaWdodCwgZXhwb3NlZCBzbyBhIGNhbGxlciBjYW4gc2VlIHRoZSBjbG9jawovLyB0aGlzIHJlYWxtIHJlYWRzIHBheXJvbGwgYWdhaW5zdC4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIGludGVybmFscyAtLS0KCi8vIHBhcnNlRW1wbG95ZWVzIHNwbGl0cywgdmFsaWRhdGVzIGFuZCBkZWR1cGxpY2F0ZXMgdGhlIHNlbGVjdGlvbiwgcHJlc2VydmluZwovLyB0aGUgY2FsbGVyJ3Mgb3JkZXIuIEl0IHJldHVybnMgdGhlIGRpc3RpbmN0IGxpc3QgYW5kIGhvdyBtYW55IGR1cGxpY2F0ZXMKLy8gd2VyZSBkcm9wcGVkLgovLwovLyBUaGUgY2FwIGlzIGNoZWNrZWQgQkVGT1JFIHRoZSBzbGljZSBncm93cywgc28gYSBjYWxsZXIgY2Fubm90IG1ha2UgdGhpcwovLyByZWFsbSBhbGxvY2F0ZSBwYXN0IHRoZSBib3VuZCBvbiB0aGUgd2F5IHRvIGJlaW5nIHJlZnVzZWQuCmZ1bmMgcGFyc2VFbXBsb3llZXMocyBzdHJpbmcpIChbXWFkZHJlc3MsIGludCkgewoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChzLCAiLCIpCglpZiBsZW4ocGFydHMpID4gTWF4RW1wbG95ZWVzUGVyQ2FsbCB7CgkJcGFuaWMoInBheXNsaXBzOiBhdCBtb3N0ICIgKyBzdHJjb252Lkl0b2EoTWF4RW1wbG95ZWVzUGVyQ2FsbCkgKwoJCQkiIGVtcGxveWVlcywgZ290ICIgKyBzdHJjb252Lkl0b2EobGVuKHBhcnRzKSkpCgl9CglvdXQgOj0gbWFrZShbXWFkZHJlc3MsIDAsIGxlbihwYXJ0cykpCglkdXBlcyA6PSAwCglmb3IgXywgcmF3IDo9IHJhbmdlIHBhcnRzIHsKCQl0IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHJhdykKCQlpZiB0ID09ICIiIHsKCQkJcGFuaWMoInBheXNsaXBzOiBlbXB0eSBlbXBsb3llZSBpbiAiICsgc3RyY29udi5RdW90ZShzKSkKCQl9CgkJd2hvIDo9IGFkZHJlc3ModCkKCgkJLy8gVGhlIGxvd2VyY2FzZSBjbGF1c2UgaXMgY2FycmllZCBmcm9tIHIvcGF5cm9sbCdzIEhpcmUsIHdoZXJlIGl0CgkJLy8gaXMgbWVhc3VyZWQ6IGFkZHJlc3MuSXNWYWxpZCgpIGRlZmVycyB0byBhIGRlY29kZXIgdGhhdAoJCS8vIGxvd2VyY2FzZXMgYmVmb3JlIHZlcmlmeWluZyB0aGUgY2hlY2tzdW0sIHNvIGl0IHJldHVybnMgdHJ1ZSBmb3IKCQkvLyB0aGUgYWxsLXVwcGVyY2FzZSBzcGVsbGluZyBvZiBhIHZhbGlkIGFkZHJlc3MuCgkJLy8KCQkvLyBIRVJFIFRIRSBTVEFLRSBJUyBESUZGRVJFTlQgRlJPTSBQQVlST0xMJ1MgQU5EIFNNQUxMRVIsIHdoaWNoIGlzCgkJLy8gd2h5IHRoaXMgaXMgYSBndWFyZCBhbmQgbm90IGEgbG9zcy1wcmV2ZW50aW9uIGNvbnRyb2wuIHBheXJvbGwKCQkvLyBrZXlzIGl0cyBsZWRnZXIgb24gdGhpcyBzdHJpbmcsIHNvIGFuIHVwcGVyY2FzZSBzcGVsbGluZyB0aGVyZQoJCS8vIHN0cmFuZGVkIHJlYWwgY29pbnMuIFRoaXMgcmVhbG0gd291bGQgbWVyZWx5IGZhaWwgdG8gZmluZCB0aGUKCQkvLyBwb3NpdGlvbiBhbmQgcGFuaWMgYXQgSGFzUG9zaXRpb24g4oCUIGFscmVhZHkgZmFpbC1jbG9zZWQuIFRoZQoJCS8vIGd1YXJkIGlzIGtlcHQgYmVjYXVzZSB0aGF0IHBhbmljIHdvdWxkIG5hbWUgdGhlIHdyb25nIGNhdXNlOiBhCgkJLy8gY2FsbGVyIHdvdWxkIHJlYWQgImhhcyBubyBvcGVuIHBvc2l0aW9uIiBhYm91dCBhbiBlbXBsb3llZSB3aG8KCQkvLyBwbGFpbmx5IGRvZXMuIEEgcmVmdXNhbCB0aGF0IG1pc2RpYWdub3NlcyBpdHNlbGYgaXMgaG93IGEgcmVhbAoJCS8vIGRlZmVjdCBnZXRzIGF0dHJpYnV0ZWQgdG8gdGhlIGNoYWluLgoJCWlmICF3aG8uSXNWYWxpZCgpIHx8IHQgIT0gc3RyaW5ncy5Ub0xvd2VyKHQpIHsKCQkJcGFuaWMoInBheXNsaXBzOiAiICsgc3RyY29udi5RdW90ZSh0KSArCgkJCQkiIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3MgaW4gY2Fub25pY2FsIChsb3dlcmNhc2UpIGZvcm0iKQoJCX0KCgkJc2VlbiA6PSBmYWxzZQoJCWZvciBfLCBoYXZlIDo9IHJhbmdlIG91dCB7CgkJCWlmIGhhdmUgPT0gd2hvIHsKCQkJCXNlZW4gPSB0cnVlCgkJCQlicmVhawoJCQl9CgkJfQoJCWlmIHNlZW4gewoJCQlkdXBlcysrCgkJCWNvbnRpbnVlCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIHdobykKCX0KCWlmIGxlbihvdXQpID09IDAgewoJCXBhbmljKCJwYXlzbGlwczogbm8gZW1wbG95ZWVzIG5hbWVkIikKCX0KCXJldHVybiBvdXQsIGR1cGVzCn0KCmZ1bmMgcGFyc2VJbnQ2NExpc3QocyBzdHJpbmcsIG1heCBpbnQsIHdoYXQgc3RyaW5nKSBbXWludDY0IHsKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocywgIiwiKQoJaWYgbGVuKHBhcnRzKSA+IG1heCB7CgkJcGFuaWMoInBheXNsaXBzOiBhdCBtb3N0ICIgKyBzdHJjb252Lkl0b2EobWF4KSArICIgIiArIHdoYXQgKwoJCQkicywgZ290ICIgKyBzdHJjb252Lkl0b2EobGVuKHBhcnRzKSkpCgl9CglvdXQgOj0gbWFrZShbXWludDY0LCAwLCBsZW4ocGFydHMpKQoJZm9yIF8sIHAgOj0gcmFuZ2UgcGFydHMgewoJCXQgOj0gc3RyaW5ncy5UcmltU3BhY2UocCkKCQlpZiB0ID09ICIiIHsKCQkJcGFuaWMoInBheXNsaXBzOiBlbXB0eSAiICsgd2hhdCArICIgaW4gIiArIHN0cmNvbnYuUXVvdGUocykpCgkJfQoJCXYsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHQsIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoInBheXNsaXBzOiAiICsgc3RyY29udi5RdW90ZSh0KSArICIgaXMgbm90IGEgdmFsaWQgIiArIHdoYXQpCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIHYpCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgZm9ybWF0SW50NjRMaXN0KHYgW11pbnQ2NCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpLCBuIDo9IHJhbmdlIHYgewoJCWlmIGkgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChuLCAxMCkpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gc2xpcEtleSBsZWZ0LXBhZHMgc2VxIHRvIHRoZSB3aWR0aCBvZiBNYXhJbnQ2NCBzbyB0aGF0IGFuIGVtcGxveWVyJ3MKLy8gcGF5c2xpcHMgc29ydCBpbiBudW1lcmljIG9yZGVyIHVuZGVyIHRoZSB0cmVlJ3MgbGV4aWNhbCBrZXkgb3JkZXIuCi8vCi8vIE5PVEhJTkcgSU4gVEhJUyBSRUFMTSBDT05TVU1FUyBUSEFUIE9SREVSIFRPREFZLCBhbmQgdGhlIHBhZGRpbmcgaXMgaW4gdGhlCi8vIHNvdXJjZSBhbnl3YXkuIFRoZSB0cmVlIGlzIG9ubHkgZXZlciBTZXQgYW5kIEdldCBoZXJlIOKAlCByZW5kZXJFbXBsb3llciB3YWxrcwovLyB0aGUgc2VxdWVuY2UgbnVtYmVycyBpdCBhbHJlYWR5IGtub3dzIGZyb20gW0NvdW50XSByYXRoZXIgdGhhbiBpdGVyYXRpbmcg4oCUCi8vIHNvIHVucGFkZGVkIGtleXMgd291bGQgcHJvZHVjZSBieXRlLWlkZW50aWNhbCBvdXRwdXQgZnJvbSBldmVyeSB2aWV3LCBhbmQgbm8KLy8gdGVzdCBjYW4gZGlzdGluZ3Vpc2ggdGhlIHR3by4gSXQgaXMga2VwdCBiZWNhdXNlIHRoZSBieXRlcyBmcmVlemUgYXQgYWRkcGtnOgovLyBhbiBlbnVtZXJhdG9yIGFkZGVkIGluIGEgc3VjY2Vzc29yIHJlYWxtLCBvciBhbiBvZmYtY2hhaW4gaW5kZXhlciBkb2luZyBhCi8vIHByZWZpeCBzY2FuIG92ZXIgdGhpcyByZWFsbSdzIHN0b3JhZ2UsIHdvdWxkIHJlYWQgIjEwIiBiZWZvcmUgIjkiIGZvcmV2ZXIsCi8vIGFuZCB0aGUgZml4IHdvdWxkIGJlIHVuYXZhaWxhYmxlLiBUd2VsdmUgYnl0ZXMgb2YgcGFkZGluZyBub3cgYWdhaW5zdCBhCi8vIGRlZmVjdCB0aGF0IGNhbm5vdCBiZSByZXBhaXJlZCBsYXRlci4KLy8KLy8gU3RhdGVkIHRoaXMgd2F5IGRlbGliZXJhdGVseS4gVGhlIGNvbW1lbnQgaGVyZSB1c2VkIHRvIGNsYWltIHRoZSBwYWRkaW5nIGlzCi8vICJ3aGF0IG1ha2VzIGEgcHJlZml4IGl0ZXJhdGlvbiBpbiBSZW5kZXIgcmVhZCBpbiBzZXF1ZW5jZSIsIHdoaWNoIGlzIGEKLy8gcmVhY2hhYmlsaXR5IGFyZ3VtZW50IGZvciBhIHByZWZpeCBpdGVyYXRpb24gdGhhdCBkb2VzIG5vdCBleGlzdC4KZnVuYyBzbGlwS2V5KGVtcGxveWVyIHN0cmluZywgc2VxIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJZm9yIGxlbihzKSA8IDE5IHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIGVtcGxveWVyICsgInwiICsgcwp9CgpmdW5jIGVtcGxveWVyQ291bnQoZW1wbG95ZXIgc3RyaW5nKSBpbnQgewoJbiwgb2sgOj0gY291bnRzLkdldChlbXBsb3llcikuKGludCkKCWlmICFvayB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBuCn0KCmZ1bmMgbXVzdFNjaGVkdWxlKGVtcGxveWVyIGFkZHJlc3MpIHRpZXJzLlNjaGVkdWxlIHsKCXMsIG9rIDo9IHNjaGVkdWxlcy5HZXQoZW1wbG95ZXIuU3RyaW5nKCkpLih0aWVycy5TY2hlZHVsZSkKCWlmICFvayB7CgkJcGFuaWMoInBheXNsaXBzOiAiICsgZW1wbG95ZXIuU3RyaW5nKCkgKwoJCQkiIGhhcyBubyB3aXRoaG9sZGluZyBzY2hlZHVsZTsgY2FsbCBTZXRTY2hlZHVsZSBmaXJzdCIpCgl9CglyZXR1cm4gcwp9CgpmdW5jIG11c3RQYXlzbGlwKGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKnBheXNsaXAgewoJcCwgb2sgOj0gcGF5c2xpcHMuR2V0KHNsaXBLZXkoZW1wbG95ZXIuU3RyaW5nKCksIHNlcSkpLigqcGF5c2xpcCkKCWlmICFvayB7CgkJcGFuaWMoInBheXNsaXBzOiBubyBwYXlzbGlwICIgKyBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSArCgkJCSIgZm9yICIgKyBlbXBsb3llci5TdHJpbmcoKSkKCX0KCXJldHVybiBwCn0KCmZ1bmMgbXVzdExpbmUoZW1wbG95ZXIgYWRkcmVzcywgc2VxIGludDY0LCBpIGludCkgKmxpbmUgewoJcCA6PSBtdXN0UGF5c2xpcChlbXBsb3llciwgc2VxKQoJaWYgaSA8IDAgfHwgaSA+PSBsZW4ocC5saW5lcykgewoJCXBhbmljKCJwYXlzbGlwczogbGluZSAiICsgc3RyY29udi5JdG9hKGkpICsgIiBpcyBvdXQgb2YgcmFuZ2UgZm9yIHBheXNsaXAgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsgIiwgd2hpY2ggaGFzICIgKwoJCQlzdHJjb252Lkl0b2EobGVuKHAubGluZXMpKSArICIgbGluZXMiKQoJfQoJcmV0dXJuIHAubGluZXNbaV0KfQoKZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHMgPCBhKSB8fCAoYiA8IDAgJiYgcyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzLCB0cnVlCn0KCi8vIGNoZWNrZWRNdWwgaXMgd3JpdHRlbiBmb3IgdGhlIG5vbi1uZWdhdGl2ZSBvcGVyYW5kcyB0aGlzIHJlYWxtIGhhcyDigJQgZXZlcnkKLy8gbXVsdGlwbGljYW5kIGlzIGEgcGVyaW9kIGNvdW50IG9yIGEgcGVyLXBlcmlvZCBhbW91bnQsIGJvdGggb2Ygd2hpY2gKLy8gci9wYXlyb2xsIHJlZnVzZXMgdG8gbWFrZSBuZWdhdGl2ZS4gVGhlIGRpdmlzaW9uIHRlc3QgaXMgZXhhY3QgZm9yIHRob3NlLgpmdW5jIGNoZWNrZWRNdWwoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglpZiBhIDwgMCB8fCBiIDwgMCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglpZiBhID09IDAgfHwgYiA9PSAwIHsKCQlyZXR1cm4gMCwgdHJ1ZQoJfQoJcCA6PSBhICogYgoJaWYgcC9iICE9IGEgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHAsIHRydWUKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZW5kZXIgc2VydmVzIHRoZSBpbmRleCBhdCAiIiwgYW4gZW1wbG95ZXIncyBwYWdlIGF0ICI8YWRkcmVzcz4iLCBhbmQgb25lCi8vIHBheXNsaXAgYXQgIjxhZGRyZXNzPi88c2VxPiIuCi8vCi8vIEV2ZXJ5IGNhbGxlci1zdXBwbGllZCBzdHJpbmcgcmVhY2hpbmcgdGhlIG91dHB1dCBnb2VzIHRocm91Z2ggdGhlIHNhbml0aXplci4KLy8gVGhpcyByZWFsbSBzdG9yZXMgbm8gZnJlZSB0ZXh0LCBzbyB0aGUgdW50cnVzdGVkIGJ5dGVzIGFyZSB0aGUgcGF0aCBpdHNlbGYKLy8gYW5kIHRoZSBhZGRyZXNzZXMgaW4gYSByZWNvcmQg4oCUIGFuZCB0aGF0IGlzIHN0aWxsIHRoZSBvbmUgaW5qZWN0aW9uLXNoYXBlZAovLyBzdXJmYWNlIGEgcmVhbG0gd2l0aCBubyBjdXN0b2R5IGhhcy4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglwIDo9IHN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZ3MuVHJpbShwYXRoLCAiLyIpKQoJaWYgcCA9PSAiIiB7CgkJcmV0dXJuIHJlbmRlckluZGV4KCkKCX0KCWlmIGkgOj0gc3RyaW5ncy5JbmRleChwLCAiLyIpOyBpID49IDAgewoJCWVtcGxveWVyIDo9IGFkZHJlc3Moc3RyaW5ncy5UcmltU3BhY2UocFs6aV0pKQoJCXJlc3QgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltKHBbaSsxOl0sICIvIikpCgkJc2VxLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChyZXN0LCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiAiIyBwYXlzbGlwc1xuXG5gIiArIHNhbml0aXplLklubGluZVRleHQocmVzdCkgKwoJCQkJImAgaXMgbm90IGEgcGF5c2xpcCBudW1iZXIuXG4iCgkJfQoJCXJldHVybiByZW5kZXJQYXlzbGlwKGVtcGxveWVyLCBzZXEpCgl9CglyZXR1cm4gcmVuZGVyRW1wbG95ZXIoYWRkcmVzcyhwKSkKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBwYXlzbGlwcyDigJQgZ3JhZHVhdGVkIHdpdGhob2xkaW5nIG92ZXIgYSBsaXZlIHBheXJvbGxcblxuIikKCXNiLldyaXRlU3RyaW5nKCJXaXRoaG9sZGluZyBzdGF0ZW1lbnRzIHByaWNlZCBmcm9tIHdhZ2UgZmFjdHMgaW4gW2AiICsKCQlQYXlyb2xsUGF0aCArICJgXSgiICsgUGF5cm9sbFBhdGggKyAiKSDigJQgbmV2ZXIgZnJvbSBhbW91bnRzIHN1cHBsaWVkICIpCglzYi5Xcml0ZVN0cmluZygiaGVyZS4gVGhpcyByZWFsbSBob2xkcyBubyBjb2lucywgbW92ZXMgbm90aGluZywgYW5kICIpCglzYi5Xcml0ZVN0cmluZygiZGVkdWN0cyBub3RoaW5nOiBpdCBzdGF0ZXMgd2hhdCBhIGJyYWNrZXQgc2NoZWR1bGUgd291bGQgIikKCXNiLldyaXRlU3RyaW5nKCJoYXZlIHdpdGhoZWxkIGZyb20gZ3Jvc3MgdGhhdCBwYXlyb2xsIGhhcyBhbHJlYWR5ICIpCglzYi5Xcml0ZVN0cmluZygic2V0dGxlZC5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiPiAqKkEgcGF5c2xpcCBjb3ZlcnMgdGhlIHBvc2l0aW9uIHRoYXQgd2FzIG9wZW4gYXQgaXRzICIpCglzYi5Xcml0ZVN0cmluZygib3duIGhlaWdodCwgYW5kIG5vdGhpbmcgZWxzZS4qKiBgIiArIFBheXJvbGxQYXRoICsgImAncyAiKQoJc2IuV3JpdGVTdHJpbmcoIlJlbGVhc2UgcmVtb3ZlcyBhIHNldHRsZWQgcG9zaXRpb24sIHNvIGEgcmUtaGlyZSByZXNldHMgIikKCXNiLldyaXRlU3RyaW5nKCJ0aGUgcGVyaW9kIGNvdW50IGFuZCBlYXJsaWVyIHBlcmlvZHMgYmVjb21lIHVucmVhZGFibGUgIikKCXNiLldyaXRlU3RyaW5nKCJmcm9tIGFueSB2aWV3LiBBIGdyb3NzIGhlcmUgaXMgdGhlcmVmb3JlIG5ldmVyIGxpZmV0aW1lICIpCglzYi5Xcml0ZVN0cmluZygiZ3Jvc3MuIEV2ZXJ5IHBheXNsaXAgcHVibGlzaGVzIGEgY292ZXJhZ2UgbGluZSwgYW5kICIpCglzYi5Xcml0ZVN0cmluZygiYE9taXR0ZWRSb3N0ZXJgIGlzIHRoZSBvbmUgbnVtYmVyIHRoYXQgc2F5cyB3aGV0aGVyIGl0ICIpCglzYi5Xcml0ZVN0cmluZygiaXMgY29tcGxldGUuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIj4gKipUaGUgcGxhdGZvcm0gZmVlIGlzIGFuIGludGVydmFsLioqIHBheXJvbGwgZmxvb3JzIGl0cyAiKQoJc2IuV3JpdGVTdHJpbmcoImFjY3J1YWwgZmVlIG9uIGVhY2ggc2V0dGxlbWVudCBhbmQgc2V0dGxlcyBldmVyeSBkdWUgIikKCXNiLldyaXRlU3RyaW5nKCJwZXJpb2QgaW4gb25lIGRlcG9zaXQsIHNvIHRoZSBmZWUgaXQgdG9vayBkZXBlbmRzIG9uIGhvdyAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZSBhY2NydWFscyB3ZXJlIGJhdGNoZWQg4oCUIHdoaWNoIG5vIHZpZXcgZXhwb3Nlcy4gIikKCXNiLldyaXRlU3RyaW5nKCJgUGxhdGZvcm1GZWVSYW5nZWAgYm91bmRzIGl0IHRpZ2h0bHkgZnJvbSB0aGUgdHdvIGZhY3RzICIpCglzYi5Xcml0ZVN0cmluZygidGhhdCBhcmUgZXhwb3NlZC4gQSBzaW5nbGUgbnVtYmVyIHdvdWxkIGhhdmUgYmVlbiAiKQoJc2IuV3JpdGVTdHJpbmcoInBsYXVzaWJsZSBhbmQgd3JvbmcuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBwYXlzbGlwcyBwdWJsaXNoZWQgfCAiICsgc3RyY29udi5JdG9hKHNsaXBDb3VudCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBlbXBsb3llcnMgd2l0aCBhIHNjaGVkdWxlIHwgIiArIHN0cmNvbnYuSXRvYShzY2hlZHVsZXMuU2l6ZSgpKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHBsYXRmb3JtIGZlZSB8ICIgKyBzdHJjb252LkZvcm1hdEludChQbGF0Zm9ybUZlZUJwcywgMTApICsKCQkiIG9mICIgKyBzdHJjb252LkZvcm1hdEludChSYXRlU2NhbGUsIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHdpZGVzdCBzY2hlZHVsZSB8ICIgKyBzdHJjb252Lkl0b2EoTWF4VGllcnMpICsgIiB0aWVycyB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZW1wbG95ZWVzIHBlciBwYXlzbGlwIHwgYXQgbW9zdCAiICsKCQlzdHJjb252Lkl0b2EoTWF4RW1wbG95ZWVzUGVyQ2FsbCkgKyAiIHxcblxuIikKCglzYi5Xcml0ZVN0cmluZygiQnJvd3NlIGFuIGVtcGxveWVyIGF0IGAiICsgUmVhbG1QYXRoICsgIjo8YWRkcmVzcz5gLlxuIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckVtcGxveWVyKGVtcGxveWVyIGFkZHJlc3MpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCgluYW1lIDo9IHNhbml0aXplLklubGluZVRleHQoZW1wbG95ZXIuU3RyaW5nKCkpCglzYi5Xcml0ZVN0cmluZygiIyBwYXlzbGlwcyDigJQgIiArIG5hbWUgKyAiXG5cbiIpCgoJaWYgSGFzU2NoZWR1bGUoZW1wbG95ZXIpIHsKCQllLCByIDo9IFNjaGVkdWxlT2YoZW1wbG95ZXIpCgkJc2IuV3JpdGVTdHJpbmcoIkN1cnJlbnQgc2NoZWR1bGU6IGVkZ2VzIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChlKSArCgkJCSJgIChncm9zcywgdWdub3QpLCByYXRlcyBgIiArIHNhbml0aXplLklubGluZVRleHQocikgKyAiYCAob2YgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KFJhdGVTY2FsZSwgMTApICsgIikuXG5cbiIpCgkJc2IuV3JpdGVTdHJpbmcoIkEgcmVwbGFjZW1lbnQgZG9lcyBub3QgcmUtcHJpY2UgYSBwdWJsaXNoZWQgcGF5c2xpcCDigJQgIikKCQlzYi5Xcml0ZVN0cmluZygiZWFjaCBvbmUgY2FycmllcyB0aGUgc2NoZWR1bGUgdGhhdCBwcmljZWQgaXQuXG5cbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCJObyB3aXRoaG9sZGluZyBzY2hlZHVsZSBzZXQuIGBTZXRTY2hlZHVsZWAgZmlyc3Q7ICIpCgkJc2IuV3JpdGVTdHJpbmcoImBQdWJsaXNoYCByZWZ1c2VzIHdpdGhvdXQgb25lLlxuXG4iKQoJfQoKCW4gOj0gZW1wbG95ZXJDb3VudChlbXBsb3llci5TdHJpbmcoKSkKCXNiLldyaXRlU3RyaW5nKCJPcGVuIHBvc2l0aW9ucyBub3c6ICIgKwoJCXN0cmNvbnYuSXRvYShwYXlyb2xsLlJvc3Rlck9mKGVtcGxveWVyKSkgKyAiLiBQYXlzbGlwcyBwdWJsaXNoZWQ6ICIgKwoJCXN0cmNvbnYuSXRvYShuKSArICIuXG5cbiIpCglpZiBuID09IDAgewoJCXJldHVybiBzYi5TdHJpbmcoKQoJfQoKCXNiLldyaXRlU3RyaW5nKCJ8ICMgfCBoZWlnaHQgfCBsaW5lcyB8IGdyb3NzIHwgd2l0aGhlbGQgfCBmZWUgKGxv4oCTaGkpIHwgb21pdHRlZCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJZmlyc3QgOj0gaW50NjQoMSkKCWlmIGludDY0KG4pID4gaW50NjQoUmVuZGVyUGF5c2xpcExpbWl0KSB7CgkJZmlyc3QgPSBpbnQ2NChuKSAtIGludDY0KFJlbmRlclBheXNsaXBMaW1pdCkgKyAxCgl9Cglmb3Igc2VxIDo9IGludDY0KG4pOyBzZXEgPj0gZmlyc3Q7IHNlcS0tIHsKCQlwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCgkJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJCXNiLldyaXRlU3RyaW5nKCJ8IFsiICsgcyArICJdKCIgKyBSZWFsbVBhdGggKyAiOiIgKyBuYW1lICsgIi8iICsgcyArICIpIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHAuYXQsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5JdG9hKGxlbihwLmxpbmVzKSkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHAuZ3Jvc3MsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQocC53aXRoaGVsZCwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChwLmZlZUxvLCAxMCkgKyAi4oCTIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHAuZmVlSGksIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5JdG9hKHAucm9zdGVyQXQtcC5wcmljZWQpICsgIiB8XG4iKQoJfQoJaWYgaW50NjQobikgPiBpbnQ2NChSZW5kZXJQYXlzbGlwTGltaXQpIHsKCQlzYi5Xcml0ZVN0cmluZygiXG5TaG93aW5nIHRoZSBtb3N0IHJlY2VudCAiICsKCQkJc3RyY29udi5JdG9hKFJlbmRlclBheXNsaXBMaW1pdCkgKyAiIG9mICIgKyBzdHJjb252Lkl0b2EobikgKwoJCQkiLiBPbGRlciBvbmVzIGFyZSBzdGlsbCByZWFkYWJsZSBieSBudW1iZXIg4oCUIG5vdGhpbmcgaXMgcmVtb3ZlZC5cbiIpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJQYXlzbGlwKGVtcGxveWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgc3RyaW5nIHsKCW5hbWUgOj0gc2FuaXRpemUuSW5saW5lVGV4dChlbXBsb3llci5TdHJpbmcoKSkKCgkvLyBBIFVSTCBpcyBjYWxsZXItc3VwcGxpZWQsIHNvIGFuIGFic2VudCByZWNvcmQgaXMgYSB3cm9uZyBndWVzcyBhbmQgbm90IGEKCS8vIGJyb2tlbiBpbnZhcmlhbnQuIFRoZSBhY2Nlc3NvcnMgcGFuaWMgb24gcHVycG9zZTsgYSBwYWdlIGRvZXMgbm90LCBhbmQKCS8vIGdub3dlYiBzZXJ2ZXMgYSBwYW5pYyBhcyBhbiBlcnJvciByYXRoZXIgdGhhbiBhcyBtYXJrZG93bi4gVGhpcyBpcyB0aGUKCS8vIHJlY2VpdmFibGVzIHByZWNlZGVudCAocmVjZWl2YWJsZXMuZ25vIHJlbmRlclJlcG9ydCksIGZvbGxvd2VkIGhlcmUKCS8vIGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBkaXZlcmdlZCBmcm9tLgoJaWYgIUhhcyhlbXBsb3llciwgc2VxKSB7CgkJcmV0dXJuICIjIHBheXNsaXBzXG5cbk5vIHBheXNsaXAgIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsKCQkJIiBmb3IgYCIgKyBuYW1lICsgImAuXG4iCgl9CglwIDo9IG11c3RQYXlzbGlwKGVtcGxveWVyLCBzZXEpCgoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgcGF5c2xpcCAiICsgc3RyY29udi5Gb3JtYXRJbnQoc2VxLCAxMCkgKyAiIOKAlCAiICsgbmFtZSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCJQdWJsaXNoZWQgYXQgaGVpZ2h0ICIgKyBzdHJjb252LkZvcm1hdEludChwLmF0LCAxMCkgKwoJCSIsIHByaWNlZCBmcm9tIFtgIiArIFBheXJvbGxQYXRoICsgImBdKCIgKyBQYXlyb2xsUGF0aCArICIpLlxuXG4iKQoKCW5ldExvIDo9IHAuZ3Jvc3MgLSBwLndpdGhoZWxkIC0gcC5mZWVIaQoJbmV0SGkgOj0gcC5ncm9zcyAtIHAud2l0aGhlbGQgLSBwLmZlZUxvCgoJc2IuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBzZXR0bGVkIGdyb3NzIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KHAuZ3Jvc3MsIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHdpdGhoZWxkIGJ5IHNjaGVkdWxlIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KHAud2l0aGhlbGQsIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHBheXJvbGwgYWNjcnVhbCBmZWUgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQocC5mZWVMbywgMTApICsKCQkiIOKAkyAiICsgc3RyY29udi5Gb3JtYXRJbnQocC5mZWVIaSwgMTApICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgbmV0IHRvIGVtcGxveWVlcyB8ICIgKyBzdHJjb252LkZvcm1hdEludChuZXRMbywgMTApICsKCQkiIOKAkyAiICsgc3RyY29udi5Gb3JtYXRJbnQobmV0SGksIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGdyb3NzIGR1ZSwgbm90IGFjY3J1ZWQgfCAiICsKCQlzdHJjb252LkZvcm1hdEludChwLmR1ZUdyb3NzLCAxMCkgKyAiIHxcblxuIikKCglpZiBuZXRMbyA8IDAgewoJCXNiLldyaXRlU3RyaW5nKCI+ICoqT3Zlci13aXRoaGVsZC4qKiBUaGUgc2NoZWR1bGUgY2hhcmdlcyBtb3JlIHRoYW4gIikKCQlzYi5Xcml0ZVN0cmluZygidGhlIGVtcGxveWVlIHJlY2VpdmVkIGFmdGVyIHBheXJvbGwncyBmZWUuIFRoYXQgaXMgYSAiKQoJCXNiLldyaXRlU3RyaW5nKCJsZWdhbCBzY2hlZHVsZSBhbmQgYWxtb3N0IGNlcnRhaW5seSBhIHRyYW5zcG9zZWQgb3IgIikKCQlzYi5Xcml0ZVN0cmluZygibWlzLXNjYWxlZCByYXRlIGFycmF5IOKAlCBgcC90aWVyc2AgY2Fubm90IGRldGVjdCBvbmUuICIpCgkJc2IuV3JpdGVTdHJpbmcoIlRoZSBwYXlzbGlwIGlzIHB1Ymxpc2hlZCByYXRoZXIgdGhhbiByZWZ1c2VkIHNvIHRoZSAiKQoJCXNiLldyaXRlU3RyaW5nKCJldmlkZW5jZSBzdXJ2aXZlcy5cblxuIikKCX0KCWlmIHAuZHVlR3Jvc3MgPiAwIHsKCQlzYi5Xcml0ZVN0cmluZygiPiAqKiIgKyBzdHJjb252Lkl0b2EocC53aXRoRHVlKSArICIgb2YgIiArCgkJCXN0cmNvbnYuSXRvYShwLnByaWNlZCkgKyAiIGxpbmVzIGNhcnJ5IGdyb3NzIHRoYXQgaGFkIGNvbXBsZXRlZCAiKQoJCXNiLldyaXRlU3RyaW5nKCJhbmQgbm90IGJlZW4gYWNjcnVlZC4qKiBJdCBpcyBleGNsdWRlZCBmcm9tIHRoZSBncm9zcyAiKQoJCXNiLldyaXRlU3RyaW5nKCJhYm92ZSwgYnkgZGVzaWduOiB0aGlzIHJlYWxtIHJlcG9ydHMgd2hhdCBwYXlyb2xsICIpCgkJc2IuV3JpdGVTdHJpbmcoInNldHRsZWQsIGFuZCBwYXlyb2xsIGFjY3J1ZXMgb24gZGVtYW5kLlxuXG4iKQoJfQoKCXNiLldyaXRlU3RyaW5nKCIjIyBDb3ZlcmFnZVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBuYW1lZCB8ICIgKyBzdHJjb252Lkl0b2EocC5saXN0ZWQpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgcHJpY2VkIHwgIiArIHN0cmNvbnYuSXRvYShwLnByaWNlZCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBkdXBsaWNhdGVzIGRyb3BwZWQgfCAiICsgc3RyY29udi5JdG9hKHAuZHVwZXMpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgemVybyBzZXR0bGVkIGdyb3NzIHwgIiArIHN0cmNvbnYuSXRvYShwLnplcm9Hcm9zcykgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBwb3NpdGlvbnMgZW5kZWQgfCAiICsgc3RyY29udi5JdG9hKHAuZW5kZWQpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZW1wbG95ZXIncyBvcGVuIHBvc2l0aW9ucyB0aGVuIHwgIiArCgkJc3RyY29udi5JdG9hKHAucm9zdGVyQXQpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgKipvbWl0dGVkIGZyb20gdGhpcyBwYXlzbGlwKiogfCAqKiIgKwoJCXN0cmNvbnYuSXRvYShwLnJvc3RlckF0LXAucHJpY2VkKSArICIqKiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgb3BlbiBwb3NpdGlvbnMgY2hhaW4td2lkZSB0aGVuIHwgIiArCgkJc3RyY29udi5JdG9hKHAub3BlbkF0KSArICIgfFxuXG4iKQoJaWYgcC5yb3N0ZXJBdC1wLnByaWNlZCA+IDAgewoJCXNiLldyaXRlU3RyaW5nKCI+IFRoZSBlbXBsb3llciBoZWxkICIgKyBzdHJjb252Lkl0b2EocC5yb3N0ZXJBdCkgKwoJCQkiIG9wZW4gcG9zaXRpb25zIGFuZCB0aGlzIHBheXNsaXAgcHJpY2VzICIgKyBzdHJjb252Lkl0b2EocC5wcmljZWQpICsKCQkJIi4gYCIgKyBQYXlyb2xsUGF0aCArICJgIGV4cG9ydHMgbm8gcGVyLWVtcGxveWVyIGVudW1lcmF0b3IsIHNvICIpCgkJc2IuV3JpdGVTdHJpbmcoInRoaXMgcmVhbG0gY2Fubm90IGZpbmQgdGhlIG9taXR0ZWQgb25lcyDigJQgaXQgY2FuIG9ubHkgIikKCQlzYi5Xcml0ZVN0cmluZygiY291bnQgdGhlbS4gQSB0b3RhbCByZWFkIHdpdGhvdXQgdGhpcyBsaW5lIGlzIGJlaW5nICIpCgkJc2IuV3JpdGVTdHJpbmcoInJlYWQgd3JvbmdseS5cblxuIikKCX0KCglzYi5Xcml0ZVN0cmluZygiIyMgU2NoZWR1bGUgdGhhdCBwcmljZWQgdGhpcyBwYXlzbGlwXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiRWRnZXMgYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGZvcm1hdEludDY0TGlzdChwLnNjaGVkLkVkZ2VzKCkpKSArCgkJImAsIHJhdGVzIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChmb3JtYXRJbnQ2NExpc3QocC5zY2hlZC5SYXRlcygpKSkgKwoJCSJgIChvZiAiICsgc3RyY29udi5Gb3JtYXRJbnQoUmF0ZVNjYWxlLCAxMCkgKyAiKSwgIiArCgkJc3RyY29udi5JdG9hKHAuc2NoZWQuTnVtVGllcnMoKSkgKyAiIHRpZXJzLiBQbGF0Zm9ybSBmZWUgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQocC5mZWVCcHMsIDEwKSArICIgb2YgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQoUmF0ZVNjYWxlLCAxMCkgKyAiLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBMaW5lc1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZW1wbG95ZWUgfCBwZXJpb2RzIHwgcGVyIHBlcmlvZCB8IGdyb3NzIHwgd2l0aGhlbGQgfCBmZWUgKGxv4oCTaGkpIHwgZHVlLCB1bmFjY3J1ZWQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIikKCWZvciBfLCBsIDo9IHJhbmdlIHAubGluZXMgewoJCW1hcmsgOj0gIiIKCQlpZiBsLmVuZGVkIHsKCQkJbWFyayA9ICIgKGVuZGVkKSIKCQl9CgkJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGwuZW1wbG95ZWUuU3RyaW5nKCkpICsgImAiICsKCQkJbWFyayArICIgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQobC5wYWlkUGVyaW9kcywgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChsLnBlclBlcmlvZCwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChsLmdyb3NzLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGwud2l0aGhlbGQsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQobC5mZWVMbywgMTApICsgIuKAkyIgKwoJCQlzdHJjb252LkZvcm1hdEludChsLmZlZUhpLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGwuZHVlR3Jvc3MsIDEwKSArICIgfFxuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcbkdyb3NzIGlzIGBwZXJpb2RzIMOXIHBlciBwZXJpb2RgLCBzbyBldmVyeSBsaW5lIGNhbiBiZSAiKQoJc2IuV3JpdGVTdHJpbmcoInJlLWRlcml2ZWQgZnJvbSB0aGUgdHdvIGZhY3RzIGJlc2lkZSBpdC4gYFRpZXJCcmVha2Rvd25gICIpCglzYi5Xcml0ZVN0cmluZygic3BsaXRzIGEgbGluZSdzIHdpdGhob2xkaW5nIGJ5IGJyYWNrZXQuXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KIg0xMDAwMDAwMHVnbm90EhII9trsXhILMTk4OTE0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQFQhq8xN2znMj2yRMs1yyMYGkcb1xdQfLQZOsL8cLZqZaKvMaitGDNdKcKeO+SnfFL2dhiPgeh8k4UU0R/GOlNoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}