{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "5gF1SGmoppozrlmKpOroBtiM7dUewHfzkT9Yh3PGd2M=",
    "height": "375382",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "67649821",
      "GasUsed": "45099881"
    },
    "tx": "CsWGAgoML3ZtLm1fYWRkcGtnErOGAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxL2hQIKCGNhc2hmbG93Ejxnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY2FzaGZsb3caxYQCCgxjYXNoZmxvdy5nbm8Ss4QCLy8gUGFja2FnZSBjYXNoZmxvdyBkZXJpdmVzIGEgRElSRUNULU1FVEhPRCBzdGF0ZW1lbnQgb2YgY2FzaCBmbG93cyBmcm9tIGEKLy8gZG91YmxlLWVudHJ5IGJvb2s6IGhvdyBjYXNoIG1vdmVkIG92ZXIgb25lIHdpbmRvdywgc3BsaXQgaW50byBvcGVyYXRpbmcsCi8vIGludmVzdGluZyBhbmQgZmluYW5jaW5nIGFjdGl2aXR5LCB3aXRoIGFuIGV4cGxpY2l0IHJlZnVzYWwgd2hlcmUgdGhlIHNwbGl0Ci8vIGlzIG5vdCBkZXRlcm1pbmF0ZS4KLy8KLy8gSXQgaXMgdGhlIHRoaXJkIHByaW1hcnkgZmluYW5jaWFsIHN0YXRlbWVudC4gW3Avc3RhdGVtZW50c10gZGVyaXZlcyB0aGUKLy8gb3RoZXIgdHdvIGZyb20gYSBjaGFydCBhdCBhbiBpbnN0YW50LCBhbmQgW3AvcGVyaW9kc10gZGVyaXZlcyBvbmUgd2luZG93J3MKLy8gbW92ZW1lbnQ7IGFsbCB0aHJlZSBvZiB0aG9zZSBwYWNrYWdlcyBjYXJyeSBhIG5vdGUgc2F5aW5nIHRoZXkgZG8gbm90IGRvCi8vIHRoaXMgb25lLCBhbmQgYWxsIHRocmVlIHNheSB0aGUgSU5ESVJFQ1QgbWV0aG9kIG5lZWRzIGEgY2FzaC12cy1hY2NydWFsCi8vIGNsYXNzaWZpY2F0aW9uIFtqb3VybmFsLlBvc3RpbmddIGRvZXMgbm90IGNhcnJ5LiBUaGF0IGlzIHRydWUuIFRoZSBkaXJlY3QKLy8gbWV0aG9kIG5lZWRzIHNvbWV0aGluZyBkaWZmZXJlbnQgYW5kIHNtYWxsZXI6IGEgZGVjbGFyYXRpb24gb2Ygd2hpY2ggY2hhcnQKLy8gY29kZXMgaG9sZCBjYXNoLiBBIGRlY2xhcmF0aW9uIGlzIHNvbWV0aGluZyBhIGNhbGxlciBjYW4gc3VwcGx5LCB3aGljaCBpcwovLyB3aGF0IG1ha2VzIHRoaXMgcGFja2FnZSBwb3NzaWJsZSB3aXRob3V0IGNoYW5naW5nIHdoYXQgYSBwb3N0aW5nIGlzLgovLwovLyAjIFRoZSBzaWduIGNvbnZlbnRpb24sIGFuZCB3aHkgY2FzaCBtdXN0IGJlIGFuIGFzc2V0Ci8vCi8vIEEgZGViaXQgdG8gYSBjYXNoIGFjY291bnQgaXMgYW4gSU5GTE9XIGFuZCBhIGNyZWRpdCBpcyBhbiBPVVRGTE9XLiBUaGF0Ci8vIGZvbGxvd3MgZnJvbSBjYXNoIGJlaW5nIGRlYml0LW5vcm1hbCwgc28gW1BvbGljeV0gcmVxdWlyZXMgZXZlcnkgZGVjbGFyZWQKLy8gY2FzaCBjb2RlIHRvIGJlIGEgW2pvdXJuYWwuQXNzZXRdIGFuZCByZWZ1c2VzIGFueXRoaW5nIGVsc2UKLy8gKFtFcnJDYXNoQWNjb3VudE5vdEFzc2V0XSkuIERlY2xhcmluZyBhIGNyZWRpdC1ub3JtYWwgYWNjb3VudCBhcyBjYXNoIHdvdWxkCi8vIGludmVydCBldmVyeSBmaWd1cmUgaW4gdGhlIHJlcG9ydCBhbmQgbm90aGluZyBkb3duc3RyZWFtIGNvdWxkIHRlbGwuIFRoZQovLyBjb3N0IG9mIHRoZSBydWxlIGlzIHJlYWwgYW5kIGlzIHN0YXRlZCByYXRoZXIgdGhhbiBoaWRkZW46IGEgYmFuayBvdmVyZHJhZnQKLy8gY2FycmllZCBhcyBhIGxpYWJpbGl0eSBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgY2FzaCwgYW5kIGEgY2FsbGVyIGhvbGRpbmcgb25lCi8vIG11c3QgY2FycnkgaXQgYXMgYSBjb250cmEtYXNzZXQgb3IgbGVhdmUgaXQgb3V0LgovLwovLyAjIEF0dHJpYnV0aW9uIGlzIHBlciBFTlRSWSwgbmV2ZXIgcGVyIGxlZwovLwovLyBUaGlzIGlzIHRoZSBwYWNrYWdlJ3MgY2VudHJhbCBjb3JyZWN0bmVzcyBkZWNpc2lvbiwgYW5kIHRoZSBuYXR1cmFsIGRlc2lnbgovLyBpcyB3cm9uZyBpbiBhIHdheSB0aGF0IHByb2R1Y2VzIG51bWJlcnMgd2hpY2ggYmFsYW5jZS4gVGFrZSBvbmUgb3JkaW5hcnkKLy8gcGFydC1wYWlkIHB1cmNoYXNlOgovLwovLwlkZWJpdCAgSW52ZW50b3J5ICAgICAgICAgIDEwMAovLwljcmVkaXQgQ2FzaCAgICAgICAgICAgICAgICA2MAovLwljcmVkaXQgQWNjb3VudHNQYXlhYmxlICAgICA0MAovLwovLyBDbGFzc2lmeWluZyBlYWNoIG5vbi1jYXNoIGxlZyBhbmQgYXR0cmlidXRpbmcgaXRzIG93biBhbW91bnQgcmVwb3J0cyAxMDAgb2YKLy8gaW52ZW50b3J5LXJlbGF0ZWQgb3V0ZmxvdyBhZ2FpbnN0IHRoZSA2MCBvZiBjYXNoIHRoYXQgYWN0dWFsbHkgbW92ZWQuIEl0Ci8vIGludmVudHMgYSBjYXNoIGZsb3cgb2YgNDAgdGhhdCBkaWQgbm90IGhhcHBlbiwgYW5kIHRoZSBzdGF0ZW1lbnQgc3RpbGwgYWRkcwovLyB1cC4gU28gdGhlIHVuaXQgb2YgYXR0cmlidXRpb24gaXMgdGhlIGVudHJ5OgovLwovLyAgIC0gQW4gZW50cnkgd2l0aCBOTyBjYXNoIGxlZ3MgaXMgc2tpcHBlZC4gSXQgaXMgYWNjcnVhbC1vbmx5IGFuZCBtb3ZlZCBubwovLyAgICAgY2FzaC4gVGhpcyBpcyB0aGUgZGlyZWN0IG1ldGhvZCdzIHdob2xlIHBvaW50LgovLyAgIC0gQW4gZW50cnkgd2hvc2UgbmV0IGNhc2ggbW92ZW1lbnQgaXMgWkVSTyBpcyBuYW1lZCBpbiBbUmVwb3J0Lk5ldFplcm9dCi8vICAgICBhbmQgbm90IGNsYXNzaWZpZWQuIEEgdHJhbnNmZXIgYmV0d2VlbiB0d28gZGVjbGFyZWQgY2FzaCBhY2NvdW50cyBpcyB0aGUKLy8gICAgIGNvbW1vbiBjYXNlOyB0aGVyZSBpcyBub3RoaW5nIHRvIGF0dHJpYnV0ZSwgc28gZGV0ZXJtaW5hY3kgaXMgbm90Ci8vICAgICBkZW1hbmRlZCBvZiBpdC4KLy8gICAtIE90aGVyd2lzZSB0aGUgZW50cnkncyBuZXQgY2FzaCBtb3ZlbWVudCBpcyBjb21wdXRlZCBmcm9tIGl0cyBDQVNIIGxlZ3MKLy8gICAgIGFsb25lIOKAlCBzbyB0aGUgZmlndXJlIGlzIHdoYXQgYWN0dWFsbHkgbW92ZWQg4oCUIGFuZCB0aGF0IHdob2xlIGZpZ3VyZSBpcwovLyAgICAgYXR0cmlidXRlZCB0byBvbmUgY2F0ZWdvcnkuCi8vCi8vICMgVGhlIGRldGVybWluYWN5IHJ1bGUsIHN0YXRlZCBhcyBhIHJlZnVzYWwKLy8KLy8gQW4gZW50cnkgdG91Y2hpbmcgY2FzaCBpcyBkZXRlcm1pbmF0ZSBpZmYgaXQgaGFzIGF0IGxlYXN0IG9uZSBub24tY2FzaCBsZWcKLy8gYW5kIGFsbCBvZiBpdHMgbm9uLWNhc2ggbGVncyBjbGFzc2lmeSB0byB0aGUgU0FNRSBjYXRlZ29yeSwgaW4gd2hpY2ggY2FzZQovLyB0aGUgZW50cnkncyB3aG9sZSBuZXQgY2FzaCBkZWx0YSBnb2VzIHRoZXJlLiBPdGhlcndpc2UgdGhlIGVudHJ5IGlzIG5hbWVkIGluCi8vIFtSZXBvcnQuVW5yZXNvbHZlZF0gd2l0aCB0aGUgcmVhc29uLCBhbmQgaXRzIGNhc2ggZGVsdGEgaXMgY2FycmllZCBpbgovLyBbUmVwb3J0LlVuYXR0cmlidXRlZF0uCi8vCi8vIFRoZSAiYXQgbGVhc3Qgb25lIiBjbGF1c2UgaXMgbm90IHBlZGFudHJ5LiBBbiBlbnRyeSB3aXRoIG5vbnplcm8gbmV0IGNhc2gKLy8gYW5kIG5vIG5vbi1jYXNoIGxlZyBhdCBhbGwgY2Fubm90IGNvbWUgb3V0IG9mIGEgYmFsYW5jZWQgYm9vaywgYW5kIGl0IGdldHMKLy8gaXRzIG93biBbUmVhc29uVW5iYWxhbmNlZF0gcmF0aGVyIHRoYW4gYmVpbmcgcmVwb3J0ZWQgYXMgYSBjb25mbGljdCB3aXRoCi8vIG5vdGhpbmcgdG8gY29uZmxpY3Qg4oCUIHNlZSB0aGF0IGNvbnN0YW50LgovLwovLyBVbmRlciB0aGF0IHJ1bGUgdGhlIHB1cmNoYXNlIGFib3ZlIGlzIGRldGVybWluYXRlIHdoZW4gSW52ZW50b3J5IGFuZAovLyBBY2NvdW50c1BheWFibGUgYm90aCBjbGFzc2lmeSBvcGVyYXRpbmc6IDYwIG9mIG9wZXJhdGluZyBvdXRmbG93LCB3aGljaCBpcwovLyByaWdodC4gQW4gZW50cnkgdGhhdCBzZXR0bGVzIGEgbG9hbiBhbmQgYnV5cyBlcXVpcG1lbnQgYXQgb25jZSDigJQgb25lIGxlZwovLyBmaW5hbmNpbmcsIG9uZSBpbnZlc3Rpbmcg4oCUIGlzIE5PVCBkZXRlcm1pbmF0ZSwgYW5kIG5vIGFwcG9ydGlvbm1lbnQgaXMKLy8gaW52ZW50ZWQgZm9yIGl0LiBTcGxpdHRpbmcgaXQgcHJvcG9ydGlvbmFsbHkgd291bGQgYmUgYSBndWVzcyB3ZWFyaW5nIGEKLy8gbnVtYmVyJ3MgY2xvdGhlcy4KLy8KLy8gIyBXaHkgY2xhc3NpZmljYXRpb24gaXMgcGVyIENPREUgYW5kIG5vdCBwZXIgam91cm5hbC5LaW5kCi8vCi8vIEEgbWFwcGluZyBmcm9tIFtqb3VybmFsLktpbmRdIHRvIGEgY2F0ZWdvcnkgd291bGQgbmVlZCBubyBjYWxsZXIKLy8gZGVjbGFyYXRpb24gYXQgYWxsLCBhbmQgaXQgaXMgdGhlIGZpcnN0IGRlc2lnbiBhbnlvbmUgcmVhY2hlcyBmb3IuIEl0IGlzCi8vIHdyb25nIG9uIHRoZSBtb3N0IGNvbW1vbiBhY2NvdW50cyBpbiBhbnkgYm9vazogcmVjZWl2YWJsZXMgYW5kIGludmVudG9yeSBhcmUKLy8gYXNzZXRzIHdob3NlIG1vdmVtZW50IGlzIE9QRVJBVElORywgbm90IGludmVzdGluZywgYW5kIGEga2luZC1iYXNlZCBtYXBwaW5nCi8vIHB1dHMgdGhlIGVudGlyZSB3b3JraW5nLWNhcGl0YWwgY3ljbGUgaW4gdGhlIHdyb25nIHNlY3Rpb24uIFNvIHRoZXJlIGlzIG5vCi8vIGtpbmQtYmFzZWQgZGVmYXVsdCBhbmQgbm8gZGVmYXVsdCBidWNrZXQgb2YgYW55IHNvcnQuIEEgbm9uLWNhc2ggYWNjb3VudAovLyB3aXRoIG5vIGRlY2xhcmVkIGNhdGVnb3J5IG1ha2VzIGl0cyBlbnRyeSB1bnJlc29sdmVkCi8vIChbUmVhc29uVW5kZWNsYXJlZF0pIOKAlCBzaWxlbmNlIGlzIG5vdCBhc3NlbnQuCi8vCi8vICMgV2hhdCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgZG8KLy8KLy8gICAtICoqSXQgbmV2ZXIgd3JpdGVzLCBhbmQgbmV2ZXIgc2VlcyBhIEJvb2suKiogW0Rlcml2ZV0gcmV0dXJucyBmaWd1cmVzOwovLyAgICAgdGhlIGNhbGxlciBvd25zIHBlcnNpc3RlbmNlIGFuZCBpZGVtcG90ZW5jZS4KLy8gICAtICoqSXQgY2Fubm90IHZlcmlmeSB0aGUgcG9saWN5LioqIFdoaWNoIGNvZGVzIGhvbGQgY2FzaCBhbmQgd2hhdCBlYWNoCi8vICAgICBvdGhlciBjb2RlJ3MgbW92ZW1lbnQgbWVhbnMgYXJlIGNhbGxlciBkZWNsYXJhdGlvbnMuIEEgY2hhcnQgdGhhdAovLyAgICAgZGVjbGFyZXMgYSByZWNlaXZhYmxlIGFzIGNhc2ggcHJvZHVjZXMgYSBwbGF1c2libGUsIHdyb25nIHN0YXRlbWVudC4KLy8gICAgIFRoZSBkZWNsYXJhdGlvbiBpcyB0aGUgdHJ1c3QgYm91bmRhcnkuCi8vICAgLSAqKkl0IGNhbm5vdCB2ZXJpZnkgdGhlIG9wZW5pbmcgYmFsYW5jZS4qKiBBIHdpbmRvdy1maWx0ZXJlZCBlbnRyeSBzbGljZQovLyAgICAgY2FycmllcyBwZXJpb2QgbW92ZW1lbnQsIG5vdCBhIGN1bXVsYXRpdmUgcG9zaXRpb24sIHNvIFtSZXBvcnQuT3BlbmluZ10KLy8gICAgIGlzIGVjaG9lZCBiYWNrIGV4YWN0bHkgYXMgc3VwcGxpZWQgYW5kIFtSZXBvcnQuQ2xvc2luZ10gaXMgb25seSBhcyBnb29kCi8vICAgICBhcyBpdC4gVGhpcyBpcyBbcC9wZXJpb2RzXScgbGltaXRhdGlvbiBpbmhlcml0ZWQsIG5vdCBhIG5ldyBvbmUuCi8vICAgLSAqKk5vIHJldmVyc2FsIGhhbmRsaW5nLioqIEEgcmV2ZXJzaW5nIGVudHJ5IHRoYXQgdG91Y2hlcyBjYXNoIG1vdmVkCi8vICAgICBjYXNoLCBhbmQgaXMgY2xhc3NpZmllZCBsaWtlIGFueSBvdGhlciBlbnRyeS4gVGhhdCBkaWZmZXJzIGZyb20KLy8gICAgIFtwL3BlcmlvZHNdLCB3aGVyZSBhbiB1bnJlc29sdmVkIHJldmVyc2FsIGlzIGEgY2Vuc3VzIGl0ZW0sIGFuZCB0aGUKLy8gICAgIGRpZmZlcmVuY2UgaXMgZGVsaWJlcmF0ZTogYSBjYXNoLWZsb3cgc3RhdGVtZW50IHJlcG9ydHMgbW92ZW1lbnQsIGFuZCBhCi8vICAgICByZXZlcnNhbCdzIG1vdmVtZW50IGlzIG1vdmVtZW50LgovLyAgIC0gKipObyBwYWdpbmcgYW5kIG5vIG1lcmdlLioqIFtNYXhFbnRyaWVzXSBpcyB0aGUgaGFyZCBib3VuZC4gTWVyZ2luZwovLyAgICAgcmVwb3J0cyBhY3Jvc3MgcGFnZXMgd291bGQgbWFrZSB0aGUgdW5yZXNvbHZlZCBzZXQgYW4gYXJ0aWZhY3Qgb2YgdGhlCi8vICAgICBwYWdpbmcgcmF0aGVyIHRoYW4gb2YgdGhlIGRhdGEuCi8vICAgLSAqKk5vIGF1ZGl0LioqIEV2ZXJ5IGZpZ3VyZSBpcyBkZXJpdmVkIGZyb20gd2hhdCB0aGUgY2FsbGVyIHN1cHBsaWVkLiBBCi8vICAgICBjaGFydCBmcm9tIG9uZSBib29rIGFuZCBlbnRyaWVzIGZyb20gYW5vdGhlciBwcm9kdWNlIGEgcGxhdXNpYmxlIHJlcG9ydAovLyAgICAgYW5kIG5vdGhpbmcgaGVyZSBkZXRlY3RzIGl0LgovLyAgIC0gKipSZWNvbmNpbGluZyBhZ2FpbnN0IFtwL3BlcmlvZHNdIHByb3ZlcyBub3RoaW5nIGFib3V0IHRoZSBzcGxpdC4qKgovLyAgICAgQ29tcGFyaW5nIFtSZXBvcnQuTmV0Q2hhbmdlXSB3aXRoIHRoZSBjYXNoIGFjY291bnRzJyBtb3ZlbWVudCBpbiBhCi8vICAgICBwZXJpb2RzIHJlcG9ydCBpcyBhbiBhcml0aG1ldGljIHNlbGYtY2hlY2sgdGhhdCBib3RoIHBhY2thZ2VzIGFkZGVkIHRoZQovLyAgICAgc2FtZSBjb2x1bW5zIHRoZSBzYW1lIHdheS4gQSBzdGF0ZW1lbnQgdGhhdCBmaWxlcyBldmVyeSBmbG93IHVuZGVyIHRoZQovLyAgICAgd3JvbmcgY2F0ZWdvcnkgcmVjb25jaWxlcyBwZXJmZWN0bHkuCi8vCi8vIFtwL2pvdXJuYWxdOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2pvdXJuYWwKLy8gW3AvcGVyaW9kc106IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVyaW9kcwovLyBbcC9zdGF0ZW1lbnRzXTogL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zdGF0ZW1lbnRzCnBhY2thZ2UgY2FzaGZsb3cKCmltcG9ydCAoCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvam91cm5hbCIKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVyaW9kcyIKKQoKLy8gTWF4QWNjb3VudHMgYm91bmRzIHRoZSBjaGFydCBbRGVyaXZlXSB3aWxsIGFjY2VwdC4gSXQgaXMgcGVyaW9kcycgYm91bmQsCi8vIHdoaWNoIGlzIHN0YXRlbWVudHMnIGJvdW5kLCB3aGljaCBpcyBqb3VybmFsJ3Mgb3duIGFjY291bnQgY2FwIOKAlCBvbmUKLy8gbnVtYmVyLCBkZWNsYXJlZCBvbmNlLCBzbyBhIGNoYXJ0IHRoYXQgY2xlYXJzIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyBjbGVhcnMKLy8gYWxsIHRocmVlLgpjb25zdCBNYXhBY2NvdW50cyA9IHBlcmlvZHMuTWF4QWNjb3VudHMKCi8vIE1heEVudHJpZXMgYm91bmRzIHRoZSBlbnRyeSBzbGljZSBbRGVyaXZlXSB3aWxsIHdhbGsuIEl0IGlzIHBlcmlvZHMnIGJvdW5kCi8vIGZvciB0aGUgc2FtZSByZWFzb246IGEgY2FsbGVyIGZlZWRpbmcgdGhlIHNhbWUgd2luZG93IHRvIGJvdGggcGFja2FnZXMgbXVzdAovLyBub3QgaGF2ZSBvbmUgb2YgdGhlbSByZWZ1c2Ugd2hhdCB0aGUgb3RoZXIgYWNjZXB0ZWQuCmNvbnN0IE1heEVudHJpZXMgPSBwZXJpb2RzLk1heEVudHJpZXMKCi8vIE51bUNhdGVnb3JpZXMgaXMgaG93IG1hbnkgY2F0ZWdvcmllcyBhIHN0YXRlbWVudCBvZiBjYXNoIGZsb3dzIGhhcywgYW5kIHNvCi8vIHRoZSBsZW5ndGggW1JlcG9ydC5MaW5lc10gYWx3YXlzIGhhcy4gSXQgaXMgYSBjb25zdGFudCBvZiB0aGUgc3RhbmRhcmQsIG5vdAovLyBhIGNvbmZpZ3VyYXRpb24uCmNvbnN0IE51bUNhdGVnb3JpZXMgPSAzCgp2YXIgKAoJLy8gRXJySW52YWxpZFdpbmRvdyBpcyBhIHdpbmRvdyBmYWlsaW5nIFtwZXJpb2RzLldpbmRvdy5WYWxpZF0uCglFcnJJbnZhbGlkV2luZG93ID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGludmFsaWQgd2luZG93IikKCgkvLyBFcnJUb29NYW55QWNjb3VudHMgaXMgYSBjaGFydCBsb25nZXIgdGhhbiBbTWF4QWNjb3VudHNdLgoJRXJyVG9vTWFueUFjY291bnRzID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGNoYXJ0IGxlbmd0aCBleGNlZWRzIE1heEFjY291bnRzIikKCgkvLyBFcnJDaGFydE5vdFNvcnRlZCBpcyBhIGNoYXJ0IHdob3NlIGNvZGVzIGFyZSBub3Qgc3RyaWN0bHkgYXNjZW5kaW5nLgoJLy8gTWVtYmVyc2hpcCBoZXJlIGlzIGEgYmluYXJ5IHNlYXJjaCwgc28gdGhlIG9yZGVyaW5nIGlzIGxvYWQtYmVhcmluZwoJLy8gcmF0aGVyIHRoYW4gY29zbWV0aWMuCglFcnJDaGFydE5vdFNvcnRlZCA9IGVycm9ycy5OZXcoImNhc2hmbG93OiBjaGFydCBjb2RlcyBub3Qgc3RyaWN0bHkgYXNjZW5kaW5nIikKCgkvLyBFcnJJbnZhbGlkS2luZCBpcyBhIGNoYXJ0IHJvdyB3aG9zZSBLaW5kIGlzIG91dHNpZGUgam91cm5hbCdzIGZpdmUuCglFcnJJbnZhbGlkS2luZCA9IGVycm9ycy5OZXcoImNhc2hmbG93OiBpbnZhbGlkIGFjY291bnQga2luZCIpCgoJLy8gRXJyVG9vTWFueUVudHJpZXMgaXMgYW4gZW50cnkgc2xpY2UgbG9uZ2VyIHRoYW4gW01heEVudHJpZXNdLgoJRXJyVG9vTWFueUVudHJpZXMgPSBlcnJvcnMuTmV3KCJjYXNoZmxvdzogZW50cnkgY291bnQgZXhjZWVkcyBNYXhFbnRyaWVzIikKCgkvLyBFcnJFbnRyaWVzTm90U29ydGVkIGlzIGFuIGVudHJ5IHNsaWNlIG5vdCBzdHJpY3RseSBhc2NlbmRpbmcgYnkgSUQuCglFcnJFbnRyaWVzTm90U29ydGVkID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGVudHJ5IElEcyBub3Qgc3RyaWN0bHkgYXNjZW5kaW5nIikKCgkvLyBFcnJUb29NYW55UG9zdGluZ3MgaXMgYW4gZW50cnkgd2l0aCBtb3JlIHRoYW4KCS8vIFtqb3VybmFsLk1heFBvc3RpbmdzUGVyRW50cnldIHBvc3RpbmdzLiBqb3VybmFsIGNhbm5vdCBwcm9kdWNlIG9uZSwgYW5kCgkvLyByZS1jaGVja2luZyBpcyB3aGF0IG1ha2VzIFtNYXhFbnRyaWVzXSdzIGNvc3QgYm91bmQgYSBwcm92ZW4gY2VpbGluZwoJLy8gcmF0aGVyIHRoYW4gYSBob3BlLgoJRXJyVG9vTWFueVBvc3RpbmdzID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGVudHJ5IGV4Y2VlZHMgam91cm5hbC5NYXhQb3N0aW5nc1BlckVudHJ5IikKCgkvLyBFcnJJbnZhbGlkUG9zdGluZyBpcyBhbiBpbi13aW5kb3cgcG9zdGluZyB3aXRoIGFuIGludmFsaWQgU2lkZSBvciBhCgkvLyBub24tcG9zaXRpdmUgQW1vdW50LiBqb3VybmFsIGNhcnJpZXMgZGlyZWN0aW9uIGluIFNpZGUgYW5kIGFtb3VudHMgYXJlCgkvLyBhbHdheXMgcG9zaXRpdmUsIHNvIGEgc2lnbmVkIGFtb3VudCBoZXJlIGlzIGEgcG9zdGluZyBmcm9tIHNvbWV3aGVyZQoJLy8gZWxzZS4KCUVyckludmFsaWRQb3N0aW5nID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGludmFsaWQgcG9zdGluZyIpCgoJLy8gRXJyVW5rbm93bkFjY291bnQgaXMgYW4gaW4td2luZG93IHBvc3RpbmcgbmFtaW5nIGEgY29kZSBhYnNlbnQgZnJvbSB0aGUKCS8vIGNoYXJ0LiBJdCBpcyBzY29wZWQgdG8gdGhlIHdpbmRvdyBiZWNhdXNlIG5vIGZpZ3VyZSBpbiB0aGUgcmVwb3J0CgkvLyBkZXBlbmRzIG9uIGFuIGVudHJ5IG91dHNpZGUgaXQuCglFcnJVbmtub3duQWNjb3VudCA9IGVycm9ycy5OZXcoImNhc2hmbG93OiBwb3N0aW5nIG5hbWVzIGFuIGFjY291bnQgYWJzZW50IGZyb20gdGhlIGNoYXJ0IikKCgkvLyBFcnJOb0Nhc2hBY2NvdW50cyBpcyBhbiBlbXB0eSBbUG9saWN5LkNhc2hdLiBBIHN0YXRlbWVudCBvZiBjYXNoIGZsb3dzCgkvLyBvdmVyIGEgYm9vayB3aXRoIG5vIGRlY2xhcmVkIGNhc2ggaXMgYWxsIHplcm9lcyBhbmQgbG9va3MgZXhhY3RseSBsaWtlCgkvLyBhIHF1aWV0IHBlcmlvZCwgc28gdGhlIGVtcHR5IGRlY2xhcmF0aW9uIGlzIHJlZnVzZWQgcmF0aGVyIHRoYW4KCS8vIHJlcG9ydGVkLgoJRXJyTm9DYXNoQWNjb3VudHMgPSBlcnJvcnMuTmV3KCJjYXNoZmxvdzogcG9saWN5IGRlY2xhcmVzIG5vIGNhc2ggYWNjb3VudHMiKQoKCS8vIEVyckNhc2hOb3RTb3J0ZWQgaXMgYSBbUG9saWN5LkNhc2hdIG5vdCBzdHJpY3RseSBhc2NlbmRpbmcuCglFcnJDYXNoTm90U29ydGVkID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IHBvbGljeSBjYXNoIGNvZGVzIG5vdCBzdHJpY3RseSBhc2NlbmRpbmciKQoKCS8vIEVyclVua25vd25DYXNoQWNjb3VudCBpcyBhIGRlY2xhcmVkIGNhc2ggY29kZSBhYnNlbnQgZnJvbSB0aGUgY2hhcnQuCglFcnJVbmtub3duQ2FzaEFjY291bnQgPSBlcnJvcnMuTmV3KCJjYXNoZmxvdzogcG9saWN5IGRlY2xhcmVzIGEgY2FzaCBhY2NvdW50IGFic2VudCBmcm9tIHRoZSBjaGFydCIpCgoJLy8gRXJyQ2FzaEFjY291bnROb3RBc3NldCBpcyBhIGRlY2xhcmVkIGNhc2ggY29kZSB3aG9zZSBjaGFydCBLaW5kIGlzIG5vdAoJLy8gW2pvdXJuYWwuQXNzZXRdLiBTZWUgdGhlIHBhY2thZ2UgZG9jIG9uIHRoZSBzaWduIGNvbnZlbnRpb246IHRoaXMgaXMKCS8vIHdoYXQga2VlcHMgYSBkZWJpdCB0byBjYXNoIG1lYW5pbmcgYW4gaW5mbG93LgoJRXJyQ2FzaEFjY291bnROb3RBc3NldCA9IGVycm9ycy5OZXcoImNhc2hmbG93OiBwb2xpY3kgZGVjbGFyZXMgYSBub24tYXNzZXQgYWNjb3VudCBhcyBjYXNoIikKCgkvLyBFcnJSdWxlc05vdFNvcnRlZCBpcyBhIFtQb2xpY3kuUnVsZXNdIG5vdCBzdHJpY3RseSBhc2NlbmRpbmcgYnkgQ29kZS4KCUVyclJ1bGVzTm90U29ydGVkID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IHBvbGljeSBydWxlIGNvZGVzIG5vdCBzdHJpY3RseSBhc2NlbmRpbmciKQoKCS8vIEVyckludmFsaWRDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IG91dHNpZGUgdGhlIGRlY2xhcmVkIHRocmVlIOKAlCBpbiBhCgkvLyBwb2xpY3kgcnVsZSwgb3IgcGFzc2VkIHRvIFtSZXBvcnQuTGluZV0uCglFcnJJbnZhbGlkQ2F0ZWdvcnkgPSBlcnJvcnMuTmV3KCJjYXNoZmxvdzogdW5rbm93biBjYXRlZ29yeSIpCgoJLy8gRXJyVW5rbm93blJ1bGVBY2NvdW50IGlzIGEgcG9saWN5IHJ1bGUgbmFtaW5nIGEgY29kZSBhYnNlbnQgZnJvbSB0aGUKCS8vIGNoYXJ0LgoJRXJyVW5rbm93blJ1bGVBY2NvdW50ID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IHBvbGljeSBydWxlIG5hbWVzIGFuIGFjY291bnQgYWJzZW50IGZyb20gdGhlIGNoYXJ0IikKCgkvLyBFcnJDYXNoQWNjb3VudENsYXNzaWZpZWQgaXMgYSBjb2RlIGRlY2xhcmVkIGJvdGggYXMgY2FzaCBhbmQgYXMgYQoJLy8gY2xhc3NpZmllZCBhY2NvdW50LiBUaGUgdHdvIHJvbGVzIGFyZSBleGNsdXNpdmU6IGEgY2FzaCBhY2NvdW50IGlzIHdoYXQKCS8vIE1PVkVTLCBhbmQgYSBjbGFzc2lmaWVkIGFjY291bnQgaXMgd2hhdCB0aGUgbW92ZW1lbnQgaXMgRk9SLiBBY2NlcHRpbmcKCS8vIGJvdGggd291bGQgbWFrZSB0aGUgc2FtZSBjb2RlIGFuc3dlciB0d28gZGlmZmVyZW50IHF1ZXN0aW9ucyBpbiBvbmUKCS8vIGVudHJ5LgoJRXJyQ2FzaEFjY291bnRDbGFzc2lmaWVkID0gZXJyb3JzLk5ldygiY2FzaGZsb3c6IGNvZGUgaXMgZGVjbGFyZWQgYXMgY2FzaCBhbmQgYWxzbyBjbGFzc2lmaWVkIikKCgkvLyBFcnJPdmVyZmxvdyBpcyBhbiBpbnQ2NCBvdmVyZmxvdyBpbiBhbnkgYWNjdW11bGF0aW9uLCBpbmNsdWRpbmcgdGhlCgkvLyBlbnRyeS1sZXZlbCBjYXNoIHRvdGFsIGFuZCB0aGUgY2xvc2luZyBiYWxhbmNlLgoJRXJyT3ZlcmZsb3cgPSBlcnJvcnMuTmV3KCJjYXNoZmxvdzogaW50NjQgb3ZlcmZsb3ciKQopCgovLyBDYXRlZ29yeSBpcyB3aGljaCBhY3Rpdml0eSBhIGNhc2ggZmxvdyBiZWxvbmdzIHRvLiBUaGUgemVybyB2YWx1ZSBpcwovLyBkZWxpYmVyYXRlbHkgaW52YWxpZCwgc28gYSBmb3Jnb3R0ZW4gZmllbGQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4KLy8gb3BlcmF0aW5nIGFjdGl2aXR5IOKAlCB3aGljaCBpcyB0aGUgYnVja2V0IGEgZGVmYXVsdGluZyBpbXBsZW1lbnRhdGlvbiB3b3VsZAovLyBwaWNrIGFuZCB0aGUgb25lIHRoYXQgd291bGQgaGlkZSB0aGUgbW9zdC4KLy8KLy8gVGhlIGNvbnN0YW50cyBjYXJyeSBhIENhdGVnb3J5IHByZWZpeCBmb3IgdGhlIHNhbWUgcmVhc29uCi8vIFtzdGF0ZW1lbnRzLlNlY3Rpb25dJ3MgZG86IGEgYmFyZSBPcGVyYXRpbmcgd291bGQgcmVhZCBhcyBhIGZpZWxkIG5hbWUuCnR5cGUgQ2F0ZWdvcnkgdWludDgKCi8vIFRoZSB0aHJlZSBhY3Rpdml0eSBjYXRlZ29yaWVzIG9mIGEgc3RhdGVtZW50IG9mIGNhc2ggZmxvd3MuCmNvbnN0ICgKCUNhdGVnb3J5T3BlcmF0aW5nIENhdGVnb3J5ID0gMSAvLyB0cmFkaW5nOiB0aGUgd29ya2luZy1jYXBpdGFsIGN5Y2xlCglDYXRlZ29yeUludmVzdGluZyBDYXRlZ29yeSA9IDIgLy8gbG9uZy1saXZlZCBhc3NldHMgYW5kIGludmVzdG1lbnRzCglDYXRlZ29yeUZpbmFuY2luZyBDYXRlZ29yeSA9IDMgLy8gY2FwaXRhbCBhbmQgYm9ycm93aW5ncwopCgovLyBWYWxpZCByZXBvcnRzIHdoZXRoZXIgYyBpcyBvbmUgb2YgdGhlIHRocmVlIGNhdGVnb3JpZXMuCmZ1bmMgKGMgQ2F0ZWdvcnkpIFZhbGlkKCkgYm9vbCB7CglyZXR1cm4gYyA+PSBDYXRlZ29yeU9wZXJhdGluZyAmJiBjIDw9IENhdGVnb3J5RmluYW5jaW5nCn0KCi8vIFN0cmluZyByZXR1cm5zIHRoZSBjYXRlZ29yeSdzIG5hbWUsIG9yICJpbnZhbGlkIiBmb3IgdGhlIHplcm8gdmFsdWUgYW5kIGFueQovLyB1bnJlY29nbmlzZWQgY29kZS4KZnVuYyAoYyBDYXRlZ29yeSkgU3RyaW5nKCkgc3RyaW5nIHsKCXN3aXRjaCBjIHsKCWNhc2UgQ2F0ZWdvcnlPcGVyYXRpbmc6CgkJcmV0dXJuICJvcGVyYXRpbmciCgljYXNlIENhdGVnb3J5SW52ZXN0aW5nOgoJCXJldHVybiAiaW52ZXN0aW5nIgoJY2FzZSBDYXRlZ29yeUZpbmFuY2luZzoKCQlyZXR1cm4gImZpbmFuY2luZyIKCX0KCXJldHVybiAiaW52YWxpZCIKfQoKLy8gUmVhc29uIGlzIHdoeSBbRGVyaXZlXSB3b3VsZCBub3QgY2xhc3NpZnkgYW4gZW50cnkuIFRoZSB6ZXJvIHZhbHVlIGlzCi8vIGRlbGliZXJhdGVseSBpbnZhbGlkLgp0eXBlIFJlYXNvbiB1aW50OAoKLy8gVGhlIHRocmVlIHJlYXNvbnMgYW4gZW50cnkgaXMgdW5yZXNvbHZlZC4KY29uc3QgKAoJLy8gUmVhc29uQ29uZmxpY3QgaXMgYW4gZW50cnkgd2hvc2Ugbm9uLWNhc2ggbGVncyBjbGFzc2lmeSB0byBtb3JlIHRoYW4KCS8vIG9uZSBjYXRlZ29yeS4gW1VucmVzb2x2ZWQuQ2F0ZWdvcmllc10gbmFtZXMgdGhlbSwgYW5kIG5hbWVzIGF0IGxlYXN0CgkvLyB0d28uCglSZWFzb25Db25mbGljdCBSZWFzb24gPSAxCgoJLy8gUmVhc29uVW5kZWNsYXJlZCBpcyBhbiBlbnRyeSB3aXRoIGEgbm9uLWNhc2ggbGVnIHdob3NlIGFjY291bnQgaGFzIG5vCgkvLyBwb2xpY3kgcnVsZS4gW1VucmVzb2x2ZWQuQ29kZXNdIG5hbWVzIHRoZW0uIEFuIHVuZGVjbGFyZWQgYWNjb3VudCBpcwoJLy8gbmFtZWQgcmF0aGVyIHRoYW4gZGVmYXVsdGVkLCBiZWNhdXNlIGEgZGVmYXVsdCBidWNrZXQgdHVybnMgYSBtaXNzaW5nCgkvLyBkZWNsYXJhdGlvbiBpbnRvIGEgZmlndXJlIG5vYm9keSBxdWVzdGlvbnMuCgkvLwoJLy8gSXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFtSZWFzb25Db25mbGljdF0gd2hlbiBhbiBlbnRyeSBoYXMgYm90aCBhbgoJLy8gdW5kZWNsYXJlZCBjb2RlIGFuZCB0d28gZGVjbGFyZWQgY2F0ZWdvcmllcywgYmVjYXVzZSB0aGUgdW5kZWNsYXJlZAoJLy8gY29kZSBpcyB0aGUgYWN0aW9uYWJsZSBoYWxmOiBkZWNsYXJpbmcgaXQgbWF5IHJlc29sdmUgdGhlIGVudHJ5LCBhbmQKCS8vIHJlcG9ydGluZyBhIGNvbmZsaWN0IHdoaWxlIGNvbmNlYWxpbmcgYSBtaXNzaW5nIGRlY2xhcmF0aW9uIHdvdWxkIHNlbmQKCS8vIHRoZSByZWFkZXIgdG8gcmUtZXhhbWluZSBhIHBvbGljeSB0aGF0IGlzIG5vdCB5ZXQgY29tcGxldGUuCglSZWFzb25VbmRlY2xhcmVkIFJlYXNvbiA9IDIKCgkvLyBSZWFzb25VbmJhbGFuY2VkIGlzIGFuIGVudHJ5IGFsbCBvZiB3aG9zZSBsZWdzIGFyZSBkZWNsYXJlZCBjYXNoCgkvLyBhY2NvdW50cyBhbmQgd2hvc2UgY2FzaCBsZWdzIGRvIG5vdCBuZXQgdG8gemVyby4KCS8vCgkvLyBbam91cm5hbC5Cb29rXSBjYW5ub3QgcHJvZHVjZSBvbmU6IGEgYmFsYW5jZWQgZW50cnkgd2hvc2UgZXZlcnkgbGVnIGlzCgkvLyBjYXNoIGhhcyBlcXVhbCBkZWJpdHMgYW5kIGNyZWRpdHMgb3ZlciBjYXNoIGFuZCB0aGVyZWZvcmUgbmV0cyB0byB6ZXJvLAoJLy8gd2hpY2ggbWFrZXMgaXQgYSBbUmVwb3J0Lk5ldFplcm9dIGl0ZW0gaW5zdGVhZC4gU28gdGhpcyByZWFzb24gaXMKCS8vIHJlYWNoYWJsZSBvbmx5IGZyb20gYSBoYW5kLWJ1aWx0IGVudHJ5IHNsaWNlLCB0aGUgc2FtZSBjbGFzcwoJLy8gW3AvcGVyaW9kc10gZG9jdW1lbnRzIGZvciBpdHMgb3duIGhhbmQtYnVpbHQgUmVwb3J0LgoJLy8KCS8vIEl0IGV4aXN0cyByYXRoZXIgdGhhbiBiZWluZyBmb2xkZWQgaW50byBbUmVhc29uQ29uZmxpY3RdIGJlY2F1c2UgYQoJLy8gY29uZmxpY3QgY2FycnlpbmcgYW4gRU1QVFkgW1VucmVzb2x2ZWQuQ2F0ZWdvcmllc10gaXMgaW5kaXN0aW5ndWlzaGFibGUKCS8vIGZyb20gYSBidWcgaW4gdGhpcyBwYWNrYWdlLCBhbmQgYSBjZW5zdXMgaXRlbSBhIHJlYWRlciBjYW5ub3QgdGVsbCBmcm9tCgkvLyBhIGRlZmVjdCBpcyBub3QgYSBjZW5zdXMgaXRlbS4gRm91bmQgYnkgd3JpdGluZyB0aGUgdGVzdCBmb3IgdGhlCgkvLyBjb25mbGljdCBjYXNlLCBub3QgYnkgcmVhZGluZyB0aGUgY29kZS4KCVJlYXNvblVuYmFsYW5jZWQgUmVhc29uID0gMwopCgovLyBWYWxpZCByZXBvcnRzIHdoZXRoZXIgciBpcyBvbmUgb2YgdGhlIHRocmVlIHJlYXNvbnMuCmZ1bmMgKHIgUmVhc29uKSBWYWxpZCgpIGJvb2wgeyByZXR1cm4gciA+PSBSZWFzb25Db25mbGljdCAmJiByIDw9IFJlYXNvblVuYmFsYW5jZWQgfQoKLy8gU3RyaW5nIHJldHVybnMgdGhlIHJlYXNvbidzIG5hbWUsIG9yICJpbnZhbGlkIi4KZnVuYyAociBSZWFzb24pIFN0cmluZygpIHN0cmluZyB7Cglzd2l0Y2ggciB7CgljYXNlIFJlYXNvbkNvbmZsaWN0OgoJCXJldHVybiAiY29uZmxpY3QiCgljYXNlIFJlYXNvblVuZGVjbGFyZWQ6CgkJcmV0dXJuICJ1bmRlY2xhcmVkIgoJY2FzZSBSZWFzb25VbmJhbGFuY2VkOgoJCXJldHVybiAidW5iYWxhbmNlZCIKCX0KCXJldHVybiAiaW52YWxpZCIKfQoKLy8gQ2xhc3NpZmljYXRpb24gaXMgb25lIGFjY291bnQgY29kZSdzIGFjdGl2aXR5IGNhdGVnb3J5LCBkZWNsYXJlZCBieSB0aGUKLy8gY2FsbGVyLiBTZWUgdGhlIHBhY2thZ2UgZG9jIG9uIHdoeSB0aGlzIGlzIHBlciBjb2RlIHJhdGhlciB0aGFuIHBlcgovLyBbam91cm5hbC5LaW5kXS4KdHlwZSBDbGFzc2lmaWNhdGlvbiBzdHJ1Y3QgewoJQ29kZSAgICAgc3RyaW5nCglDYXRlZ29yeSBDYXRlZ29yeQp9CgovLyBQb2xpY3kgaXMgdGhlIGNhbGxlcidzIHdob2xlIGRlY2xhcmF0aW9uOiB3aGljaCBjaGFydCBjb2RlcyBob2xkIGNhc2gsIGFuZAovLyB3aGF0IGVhY2ggb3RoZXIgY29kZSdzIG1vdmVtZW50IGlzIGZvci4KLy8KLy8gQm90aCBzbGljZXMgbXVzdCBiZSBzdHJpY3RseSBhc2NlbmRpbmcgYnkgY29kZSwgYmVjYXVzZSBtZW1iZXJzaGlwIGlzIGEKLy8gYmluYXJ5IHNlYXJjaCBpbiBbRGVyaXZlXSdzIGlubmVyIGxvb3AuIFRoZSB0d28gc2V0cyBtdXN0IGJlIGRpc2pvaW50Ci8vIChbRXJyQ2FzaEFjY291bnRDbGFzc2lmaWVkXSkuIE5laXRoZXIgaXMgdmVyaWZpZWQgYWdhaW5zdCBhbnl0aGluZyBidXQgdGhlCi8vIGNoYXJ0IOKAlCB0aGlzIHBhY2thZ2UgY2Fubm90IGtub3cgd2hldGhlciBhIGNvZGUgY2FsbGVkICJwZXR0eSBjYXNoIiBob2xkcwovLyBjYXNoLCBhbmQgc2F5cyBzbyBpbiBpdHMgZG9jIHJhdGhlciB0aGFuIHByZXRlbmRpbmcgdGhlIG5hbWUgaXMgZXZpZGVuY2UuCnR5cGUgUG9saWN5IHN0cnVjdCB7CgkvLyBDYXNoIGlzIHRoZSBjb2RlcyB0aGF0IGhvbGQgY2FzaCwgc3RyaWN0bHkgYXNjZW5kaW5nLiBNdXN0IGJlCgkvLyBub24tZW1wdHksIGFuZCBldmVyeSBjb2RlIG11c3QgYmUgYSBbam91cm5hbC5Bc3NldF0gaW4gdGhlIGNoYXJ0LgoJQ2FzaCBbXXN0cmluZwoKCS8vIFJ1bGVzIGlzIHRoZSBhY3Rpdml0eSBjYXRlZ29yeSBmb3Igbm9uLWNhc2ggY29kZXMsIHN0cmljdGx5IGFzY2VuZGluZwoJLy8gYnkgQ29kZS4gQSBjb2RlIGFic2VudCBmcm9tIGhlcmUgaXMgTk9UIGRlZmF1bHRlZDsgYW4gZW50cnkgdG91Y2hpbmcgaXQKCS8vIGlzIHVucmVzb2x2ZWQgd2l0aCBbUmVhc29uVW5kZWNsYXJlZF0uCglSdWxlcyBbXUNsYXNzaWZpY2F0aW9uCn0KCi8vIExpbmUgaXMgb25lIGNhdGVnb3J5J3MgZ3Jvc3MgZmxvd3Mgb3ZlciB0aGUgd2luZG93LgovLwovLyBJbmZsb3dzIGFuZCBPdXRmbG93cyBhcmUgYm90aCBub24tbmVnYXRpdmUgQVMgUFJPRFVDRUQgQlkgW0Rlcml2ZV0sIGFuZAovLyBncm9zcyByYXRoZXIgdGhhbiBuZXR0ZWQsIGJlY2F1c2UgYSBjYXRlZ29yeSB3aXRoIDEsMDAwIGluIGFuZCAxLDAwMCBvdXQgaXMKLy8gbm90IHRoZSBzYW1lIGJ1c2luZXNzIGFzIG9uZSB3aXRoIG5vdGhpbmcgaGFwcGVuaW5nIGFuZCBhIG5ldCBvZiB6ZXJvIGlzCi8vIGFsbCBhIG5ldHRlZCBmaWd1cmUgY2FuIHNheSBhYm91dCBlaXRoZXIuCnR5cGUgTGluZSBzdHJ1Y3QgewoJQ2F0ZWdvcnkgQ2F0ZWdvcnkKCgkvLyBJbmZsb3dzIGlzIHRoZSBncm9zcyBjYXNoIHJlY2VpdmVkLCBub24tbmVnYXRpdmUuCglJbmZsb3dzIGludDY0CgoJLy8gT3V0Zmxvd3MgaXMgdGhlIGdyb3NzIGNhc2ggcGFpZCwgbm9uLW5lZ2F0aXZlLgoJT3V0Zmxvd3MgaW50NjQKCgkvLyBFbnRyaWVzIGlzIGhvdyBtYW55IGluLXdpbmRvdyBlbnRyaWVzIHdlcmUgYXR0cmlidXRlZCBoZXJlLgoJRW50cmllcyBpbnQKfQoKLy8gTmV0IHJldHVybnMgSW5mbG93cyBtaW51cyBPdXRmbG93cy4KLy8KLy8gVGhlIHN1YnRyYWN0aW9uIGlzIHVuY2hlY2tlZCwgYW5kIHRoYXQgaXMgc2FmZSBmb3IgYW55IExpbmUgW0Rlcml2ZV0KLy8gcHJvZHVjZXM6IGJvdGggY29sdW1ucyBhcmUgbm9uLW5lZ2F0aXZlLCBzbyB0aGUgZGlmZmVyZW5jZSBpcyBpbiByYW5nZSBmb3IKLy8gZXZlcnkgcGFpciBvZiBpbnQ2NCB2YWx1ZXMgdGhleSBjYW4gaG9sZC4gQSBoYW5kLWJ1aWx0IExpbmUgd2l0aCBhIG5lZ2F0aXZlCi8vIGNvbHVtbiBjYW4gd3JhcCwgYW5kIHRoYXQgaXMgdGhlIG9ubHkgd2F5IGl0IGNhbi4KLy8KLy8gVGhlIHdyYXBwZWQgdmFsdWUgZG9lcyBub3Qgc3RheSBsb2NhbCwgd2hpY2ggaXMgdGhlIHBhcnQgd29ydGggc3RhdGluZzoKLy8gW1JlcG9ydC5SZWNvbmNpbGVzXSBzdW1zIE5ldCgpIG92ZXIgdGhlIGxpbmVzLCBhbmQgYSB3cmFwcGVkIE5ldCgpIGNhbiBtYWtlCi8vIGl0IGFncmVlIG92ZXIgYSByZXBvcnQgd2hvc2UgY29sdW1ucyBzYXkgc29tZXRoaW5nIGVsc2UgZW50aXJlbHkuIFNvCi8vIFJlY29uY2lsZXMgcmVmdXNlcyBhIG5lZ2F0aXZlIGNvbHVtbiBvdXRyaWdodCByYXRoZXIgdGhhbiBzdW1taW5nIGl0IOKAlCBzZWUKLy8gdGhlIGd1YXJkIHRoZXJlLiBOZXQoKSBpdHNlbGYgc3RheXMgdW5jaGVja2VkIGJlY2F1c2UgaXQgaGFzIG5vIHdheSB0bwovLyByZXBvcnQgYSByZWZ1c2FsIGFuZCBhIExpbmUgaXMgYSBmaWd1cmUsIG5vdCBhIGNsYWltLgovLwovLyBUaGlzIG5vdGUgcHJldmlvdXNseSBjb21wYXJlZCB0aGUgYmxhc3QgcmFkaXVzIHRvCi8vIFtwZXJpb2RzLkFjdGl2aXR5Lk1vdmVtZW50XSBhbmQgc2FpZCB0aGF0IG9uZSB3YXMgd2lkZXIgYmVjYXVzZSBhIG5lZ2F0aXZlCi8vIGNvbHVtbiB0aGVyZSBhbHNvIGludmVydHMgYSBzaWduIGNvbnZlbnRpb24uIFRoYXQgY29tcGFyYXRpdmUgd2FzIHdyb25nLAovLyBhbmQgYW4gYXVkaXQgb2YgdGhpcyBwYWNrYWdlIGZvdW5kIGl0OiBib3RoIHdyYXAgYSBmaWd1cmUgdGhhdCB0aGVuIHBhc3NlcwovLyBldmVyeSBkb3duc3RyZWFtIGd1YXJkLCBhbmQgdGhlIHJlYWwgYXN5bW1ldHJ5IGlzIGluIHdoZXJlIHRoZSB3cmFwcGVkCi8vIHZhbHVlIEdPRVMsIG5vdCBpbiBzaWduIGludmVyc2lvbi4gVGhlIG5vdGUgaXMga2VwdCwgY29ycmVjdGVkLCBiZWNhdXNlIHRoZQovLyBlcXVpdmFsZW50IG5vdGUgaW4gcGVyaW9kcyB3YXMgYWxzbyBvbmNlIHdyb25nIGFib3V0IGl0cyBvd24gYmxhc3QgcmFkaXVzCi8vIGFuZCBhbHNvIGhhZCB0byBiZSBmb3VuZCBieSBhbiBhdWRpdCDigJQgdHdpY2UgaXMgYSBwYXR0ZXJuLCBhbmQgdGhlIHBhdHRlcm4KLy8gaXMgdGhhdCBhIGNvbXBhcmF0aXZlIGNsYWltIGFib3V0IGFub3RoZXIgcGFja2FnZSdzIGhhemFyZCBpcyB0aGUgc2VudGVuY2UKLy8gbm90aGluZyBjaGVja3MuCmZ1bmMgKGwgTGluZSkgTmV0KCkgaW50NjQgeyByZXR1cm4gbC5JbmZsb3dzIC0gbC5PdXRmbG93cyB9CgovLyBVbnJlc29sdmVkIGlzIG9uZSBpbi13aW5kb3cgZW50cnkgW0Rlcml2ZV0gd291bGQgbm90IGNsYXNzaWZ5LiBJdCBpcyBhCi8vIGNlbnN1cyBpdGVtLCBub3QgYW4gZXJyb3I6IHRoZSBlbnRyeSdzIGNhc2ggbW92ZW1lbnQgaXMgcmVhbCBhbmQgaXMgY2FycmllZAovLyBpbiBbUmVwb3J0LlVuYXR0cmlidXRlZF0sIHNvIFtSZXBvcnQuTmV0Q2hhbmdlXSBhbmQgW1JlcG9ydC5DbG9zaW5nXSBzdGF5Ci8vIHRydWUgZXZlbiB3aGVuIHRoZSBzcGxpdCBpcyBpbmNvbXBsZXRlLgovLwovLyBXaGV0aGVyIGFuIGVudHJ5IGhlcmUgU0hPVUxEIGhhdmUgYmVlbiBjbGFzc2lmaWFibGUgaXMgYW4gYWNjb3VudGluZwovLyBqdWRnZW1lbnQgbWFkZSBvdXRzaWRlIHRoaXMgcGFja2FnZS4gV2hhdCBpcyByZXBvcnRlZCBpcyB0aGF0IHRoaXMgcG9saWN5Ci8vIGNvdWxkIG5vdCBkZWNpZGUgaXQsIGFuZCBleGFjdGx5IHdoYXQgd2FzIG1pc3Npbmcgb3IgaW4gY29uZmxpY3QuCnR5cGUgVW5yZXNvbHZlZCBzdHJ1Y3QgewoJLy8gRW50cnlJRCBpcyB0aGUgZW50cnkncyBqb3VybmFsIElELgoJRW50cnlJRCB1aW50NjQKCgkvLyBSZWFzb24gaXMgd2h5IGl0IGNvdWxkIG5vdCBiZSBjbGFzc2lmaWVkLgoJUmVhc29uIFJlYXNvbgoKCS8vIE5ldCBpcyB0aGUgZW50cnkncyBuZXQgY2FzaCBtb3ZlbWVudDogcG9zaXRpdmUgZm9yIGFuIGluZmxvdy4gUmVwb3J0ZWQKCS8vIHNvIGEgcmVhZGVyIGNhbiBzZWUgdGhlIHNpemUgb2Ygd2hhdCBpcyB1bmF0dHJpYnV0ZWQgcmF0aGVyIHRoYW4gb25seQoJLy8gdGhhdCBzb21ldGhpbmcgaXMuCglOZXQgaW50NjQKCgkvLyBDYXRlZ29yaWVzIGlzIHRoZSBjb25mbGljdGluZyBzZXQsIGFzY2VuZGluZyBhbmQgb2YgbGVuZ3RoIGF0IGxlYXN0CgkvLyB0d28sIHdoZW4gUmVhc29uIGlzIFtSZWFzb25Db25mbGljdF07IGVtcHR5IG90aGVyd2lzZS4gRnJlc2hseQoJLy8gYWxsb2NhdGVkIGFuZCBuZXZlciBuaWwuCgkvLwoJLy8gQXNjZW5kaW5nIHJhdGhlciB0aGFuIGluIHBvc3Rpbmcgb3JkZXIsIHNvIHRoYXQgdHdvIHJlY29yZHMgb2YgdGhlIHNhbWUKCS8vIGNvbmZsaWN0IGNvbXBhcmUgZXF1YWwgd2hpY2hldmVyIGxlZyB3YXMgcG9zdGVkIGZpcnN0LgoJQ2F0ZWdvcmllcyBbXUNhdGVnb3J5CgoJLy8gQ29kZXMgaXMgdGhlIHVuZGVjbGFyZWQgYWNjb3VudCBjb2RlcywgaW4gcG9zdGluZyBvcmRlciBhbmQKCS8vIGRlZHVwbGljYXRlZCwgd2hlbiBSZWFzb24gaXMgW1JlYXNvblVuZGVjbGFyZWRdOyBlbXB0eSBvdGhlcndpc2UuCgkvLyBGcmVzaGx5IGFsbG9jYXRlZCBhbmQgbmV2ZXIgbmlsLgoJLy8KCS8vIFBvc3Rpbmcgb3JkZXIgcmF0aGVyIHRoYW4gYXNjZW5kaW5nLCBiZWNhdXNlIHRoZXNlIGFyZSBhIHdvcmtsaXN0IGZvcgoJLy8gd2hvZXZlciBleHRlbmRzIHRoZSBwb2xpY3kgYW5kIHRoZSBvcmRlciBhIHJlYWRlciBtZWV0cyB0aGVtIGluIHRoZQoJLy8gZW50cnkgaXMgdGhlIG1vcmUgdXNlZnVsIG9uZS4gVGhlIHR3byBzbGljZXMgZGlmZmVyIG9uIHRoaXMKCS8vIGRlbGliZXJhdGVseTogYSBjb25mbGljdCBzZXQgaXMgY29tcGFyZWQsIGEgY29kZSBsaXN0IGlzIHdvcmtlZAoJLy8gdGhyb3VnaC4KCUNvZGVzIFtdc3RyaW5nCn0KCi8vIFJlcG9ydCBpcyBvbmUgd2luZG93J3Mgc3RhdGVtZW50IG9mIGNhc2ggZmxvd3MuIEV2ZXJ5IHNsaWNlIGlzIGZyZXNobHkKLy8gYWxsb2NhdGVkIGJ5IFtEZXJpdmVdIG9uIGV2ZXJ5IGNhbGwgYW5kIGlzIG5ldmVyIG5pbCwgc28gdGhlIGNhbGxlciBvd25zIGl0Ci8vIGFuZCBhbiBlbXB0eSByZXN1bHQgaXMgYW4gZW1wdHkgc2xpY2UgcmF0aGVyIHRoYW4gYSBuaWwgdG8gYmUgZGlzdGluZ3Vpc2hlZAovLyBmcm9tIG9uZS4KLy8KLy8gVGhlIGludmFyaWFudCB0aGF0IG1ha2VzIHRoZSByZXBvcnQgcmVhZGFibGUgd2hlbiB0aGUgc3BsaXQgaXMgaW5jb21wbGV0ZToKLy8KLy8Jc3VtKExpbmVzW2ldLk5ldCgpKSArIFVuYXR0cmlidXRlZCA9PSBOZXRDaGFuZ2UKLy8JT3BlbmluZyArIE5ldENoYW5nZSAgICAgICAgICAgICA9PSBDbG9zaW5nCi8vCi8vIEJvdGggaG9sZCBvbiBldmVyeSBSZXBvcnQgW0Rlcml2ZV0gcmV0dXJucywgaW5jbHVkaW5nIG9uZSB3aXRoIHVucmVzb2x2ZWQKLy8gZW50cmllcy4gW1JlcG9ydC5SZWNvbmNpbGVzXSBhc3NlcnRzIHRoZSBmaXJzdC4KdHlwZSBSZXBvcnQgc3RydWN0IHsKCS8vIFdpbmRvdyBpcyB0aGUgd2luZG93IHRoZSBmaWd1cmVzIGFyZSBmb3IsIGVjaG9lZCBiYWNrIHNvIGEgc3RvcmVkCgkvLyByZXBvcnQgY2Fubm90IGJlIHJlYWQgd2l0aG91dCBpdC4KCVdpbmRvdyBwZXJpb2RzLldpbmRvdwoKCS8vIExpbmVzIGlzIHRoZSB0aHJlZSBjYXRlZ29yaWVzLCBhc2NlbmRpbmcgYnkgQ2F0ZWdvcnksIGFsd2F5cyBwcmVzZW50CgkvLyBhbmQgYWx3YXlzIG9mIGxlbmd0aCBbTnVtQ2F0ZWdvcmllc10g4oCUIGEgY2F0ZWdvcnkgd2l0aCBubyBhY3Rpdml0eSBpcyBhCgkvLyB6ZXJvIGxpbmUsIG5vdCBhbiBhYnNlbnQgb25lLCBiZWNhdXNlIGEgc3RhdGVtZW50IG9mIGNhc2ggZmxvd3Mgd2l0aCBhCgkvLyBtaXNzaW5nIHNlY3Rpb24gaXMgbm90IGEgc3RhdGVtZW50IG9mIGNhc2ggZmxvd3MuIFVzZSBbUmVwb3J0LkxpbmVdIHRvCgkvLyByZWFjaCBvbmUgYnkgY2F0ZWdvcnkgcmF0aGVyIHRoYW4gaW5kZXhpbmcgYnkgYXJpdGhtZXRpYy4KCUxpbmVzIFtdTGluZQoKCS8vIE9wZW5pbmcgaXMgdGhlIGNhbGxlci1zdXBwbGllZCBvcGVuaW5nIGNhc2ggcG9zaXRpb24sIGVjaG9lZCBiYWNrCgkvLyB1bmNoYW5nZWQuIFRoaXMgcGFja2FnZSBjYW5ub3QgdmVyaWZ5IGl0OyBzZWUgdGhlIHBhY2thZ2UgZG9jLiBBCgkvLyBuZWdhdGl2ZSB2YWx1ZSBpcyBhY2NlcHRlZCDigJQgYW4gb3ZlcmRyYXduIHBvc2l0aW9uIGlzIGEgcmVhbCBvbmUg4oCUIHNvCgkvLyB0aGUgc2lnbiBpcyBub3QgY29uc3RyYWluZWQgaGVyZS4KCU9wZW5pbmcgaW50NjQKCgkvLyBOZXRDaGFuZ2UgaXMgdGhlIHdpbmRvdydzIHRvdGFsIG5ldCBjYXNoIG1vdmVtZW50LCBhdHRyaWJ1dGVkIGFuZAoJLy8gdW5hdHRyaWJ1dGVkIHRvZ2V0aGVyLiBJdCBpcyB0aGUgYm9vaydzIGZpZ3VyZSwgbm90IHRoZSBzdGF0ZW1lbnQncywgc28KCS8vIGl0IGlzIHRydWUgZXZlbiB3aGVuIHRoZSBzcGxpdCBpcyBub3QgY29tcGxldGUuCglOZXRDaGFuZ2UgaW50NjQKCgkvLyBVbmF0dHJpYnV0ZWQgaXMgdGhlIG5ldCBjYXNoIG1vdmVtZW50IG9mIHRoZSBlbnRyaWVzIGluIFVucmVzb2x2ZWQuCgkvLyBaZXJvIGV4YWN0bHkgd2hlbiBldmVyeSBlbnRyeSB0aGF0IG1vdmVkIGNhc2ggd2FzIGNsYXNzaWZpZWQuCglVbmF0dHJpYnV0ZWQgaW50NjQKCgkvLyBDbG9zaW5nIGlzIE9wZW5pbmcgcGx1cyBOZXRDaGFuZ2UuCglDbG9zaW5nIGludDY0CgoJLy8gRW50cmllcyBpcyBob3cgbWFueSBlbnRyaWVzIGZlbGwgaW4gdGhlIHdpbmRvdywgaW5jbHVkaW5nIHRoZSBvbmVzIHRoYXQKCS8vIG1vdmVkIG5vIGNhc2guIFplcm8gaXMgYSBsZWdpdGltYXRlIHJlcG9ydCBvZiBhIHF1aWV0IHBlcmlvZCwgbm90IGFuCgkvLyBlcnJvci4KCUVudHJpZXMgaW50CgoJLy8gQ2FzaEVudHJpZXMgaXMgaG93IG1hbnkgaW4td2luZG93IGVudHJpZXMgdG91Y2hlZCBhIGRlY2xhcmVkIGNhc2gKCS8vIGFjY291bnQgYXQgYWxsLCBpbmNsdWRpbmcgdGhlIG9uZXMgaW4gTmV0WmVybyBhbmQgVW5yZXNvbHZlZC4KCUNhc2hFbnRyaWVzIGludAoKCS8vIE5ldFplcm8gaXMgdGhlIElEcyBvZiBpbi13aW5kb3cgZW50cmllcyB0aGF0IHRvdWNoZWQgY2FzaCBidXQgbW92ZWQKCS8vIG5vbmUgb24gbmV0IOKAlCBhIHRyYW5zZmVyIGJldHdlZW4gdHdvIGRlY2xhcmVkIGNhc2ggYWNjb3VudHMsIHBvc3NpYmx5CgkvLyBhbG9uZ3NpZGUgbm9uLWNhc2ggbGVncy4gQ2xhc3NpZmljYXRpb24gaXMgZGVsaWJlcmF0ZWx5IG5vdCBhdHRlbXB0ZWQ6CgkvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGF0dHJpYnV0ZSwgc28gZGVtYW5kaW5nIGRldGVybWluYWN5IG9mIHRoZW0gd291bGQKCS8vIG1hbnVmYWN0dXJlIHVucmVzb2x2ZWQgZW50cmllcyBvdXQgb2Ygbm9uLWV2ZW50cy4KCU5ldFplcm8gW111aW50NjQKCgkvLyBVbnJlc29sdmVkIGlzIHRoZSBlbnRyaWVzIHdob3NlIGNhdGVnb3J5IHdhcyBub3QgZGV0ZXJtaW5hdGUuCglVbnJlc29sdmVkIFtdVW5yZXNvbHZlZAp9CgovLyBMaW5lIHJldHVybnMgdGhlIGxpbmUgZm9yIGMuIEFuIGludmFsaWQgY2F0ZWdvcnkgaXMgW0VyckludmFsaWRDYXRlZ29yeV07Ci8vIHRoZXJlIGlzIG5vIGRlZmF1bHQgbGluZS4KLy8KLy8gVGhpcyBpcyB0aGUgYWNjZXNzb3IgdG8gdXNlLiBbUmVwb3J0LkxpbmVzXSBpcyBvcmRlcmVkIGJ5IENhdGVnb3J5IGFuZCBhCi8vIGNvbnN1bWVyIGNvdWxkIGluZGV4IGl0IGFzIExpbmVzW2MtMV0sIGJ1dCB0aGF0IGFyaXRobWV0aWMgaXMgYSBzZWNvbmQgY29weQovLyBvZiB0aGUgb3JkZXJpbmcgaW52YXJpYW50IGFuZCB0aGUga2luZCBvZiB0aGluZyB0aGF0IHN1cnZpdmVzIGEgcmVvcmRlcmluZwovLyBzaWxlbnRseS4KZnVuYyAociBSZXBvcnQpIExpbmUoYyBDYXRlZ29yeSkgKExpbmUsIGVycm9yKSB7CglpZiAhYy5WYWxpZCgpIHsKCQlyZXR1cm4gTGluZXt9LCBFcnJJbnZhbGlkQ2F0ZWdvcnkKCX0KCWZvciBfLCBsIDo9IHJhbmdlIHIuTGluZXMgewoJCWlmIGwuQ2F0ZWdvcnkgPT0gYyB7CgkJCXJldHVybiBsLCBuaWwKCQl9Cgl9CglyZXR1cm4gTGluZXt9LCBFcnJJbnZhbGlkQ2F0ZWdvcnkKfQoKLy8gQ29tcGxldGUgcmVwb3J0cyB3aGV0aGVyIGV2ZXJ5IGluLXdpbmRvdyBlbnRyeSB0aGF0IG1vdmVkIGNhc2ggd2FzCi8vIGF0dHJpYnV0ZWQgdG8gYSBjYXRlZ29yeS4KLy8KLy8gQSBjb21wbGV0ZSByZXBvcnQgaXMgbm90IGEgY29ycmVjdCBvbmU6IGNvbXBsZXRlbmVzcyBpcyBhIHByb3BlcnR5IG9mIHRoZQovLyBQT0xJQ1kncyBjb3ZlcmFnZSwgYW5kIGEgcG9saWN5IHRoYXQgY2xhc3NpZmllcyBldmVyeSBhY2NvdW50IHdyb25nbHkgaXMKLy8gY29tcGxldGUuIFNlZSB0aGUgcGFja2FnZSBkb2MuCmZ1bmMgKHIgUmVwb3J0KSBDb21wbGV0ZSgpIGJvb2wgeyByZXR1cm4gbGVuKHIuVW5yZXNvbHZlZCkgPT0gMCB9CgovLyBSZWNvbmNpbGVzIHJlcG9ydHMgd2hldGhlciB0aGUgYXR0cmlidXRlZCBsaW5lcyBwbHVzIHRoZSB1bmF0dHJpYnV0ZWQKLy8gcmVzaWR1YWwgZXF1YWwgTmV0Q2hhbmdlLgovLwovLyBJdCBpcyBvZmZlcmVkIGFzIEFQSSByYXRoZXIgdGhhbiBhc3NlcnRlZCBpbnRlcm5hbGx5IGJlY2F1c2UgYSBSZXBvcnQgY2FuCi8vIGJlIGJ1aWx0IGJ5IGhhbmQsIGFuZCBhIGNvbnN1bWVyIHRoYXQgc3RvcmVzIG9uZSBzaG91bGQgYmUgYWJsZSB0byBjaGVjayBpdAovLyBvbiB0aGUgd2F5IGJhY2sgb3V0LiBPbiBhIFJlcG9ydCBmcm9tIFtEZXJpdmVdIGl0IGlzIGFsd2F5cyB0cnVlLgovLwovLyBGYWxzZSBtZWFucyBvbmUgb2YgdGhyZWUgdGhpbmdzIGFuZCBkb2VzIG5vdCBkaXN0aW5ndWlzaCB0aGVtOiB0aGUgbGluZXMgZG8KLy8gbm90IHN1bSB0byBOZXRDaGFuZ2UsIHRoZSBzdW0gb3ZlcmZsb3dzLCBvciBhIGxpbmUgY2FycmllcyBhIG5lZ2F0aXZlCi8vIGNvbHVtbiAod2hpY2ggW0xpbmUuTmV0XSB3b3VsZCB3cmFwKS4gQWxsIHRocmVlIGFyZSAiZG8gbm90IHRydXN0IHRoaXMKLy8gcmVwb3J0Iiwgd2hpY2ggaXMgdGhlIHdob2xlIHF1ZXN0aW9uIGEgYm9vbCBjYW4gYW5zd2VyLgpmdW5jIChyIFJlcG9ydCkgUmVjb25jaWxlcygpIGJvb2wgewoJdG90YWwgOj0gaW50NjQoMCkKCWZvciBfLCBsIDo9IHJhbmdlIHIuTGluZXMgewoJCS8vIEJlZm9yZSB0aGUgc3VtLCBhbmQgdGhlIHJlYXNvbiBpcyB0aGF0IE5ldCgpIGNhbm5vdCByZWZ1c2UuIEEKCQkvLyBoYW5kLWJ1aWx0IExpbmV7SW5mbG93czogbWF4STY0LCBPdXRmbG93czogLTF9IG5ldHMgdG8gbWluSTY0IGJ5CgkJLy8gd3JhcHBpbmcsIGFuZCBjaGVja2VkQWRkIGNhbm5vdCBzZWUgaXQ6IHRoZSB3cmFwIGhhcHBlbmVkIGluIHRoZQoJCS8vIHN1YnRyYWN0aW9uLCBzbyB3aGF0IGFycml2ZXMgaGVyZSBpcyBhbiBvcmRpbmFyeSBpbi1yYW5nZSBuZWdhdGl2ZQoJCS8vIGFuZCBldmVyeSBhZGQgaXMgaG9uZXN0LiBSZWNvbmNpbGVzIHdvdWxkIHRoZW4gYWdyZWUgd2l0aCBhIHJlcG9ydAoJCS8vIHdob3NlIG9wZXJhdGluZyBsaW5lIGFkdmVydGlzZXMgYW4gaW5mbG93IG9mIG1heEk2NCAtLSB3aGljaCBpcwoJCS8vIHdvcnNlIHRoYW4gZGlzYWdyZWVpbmcsIGJlY2F1c2UgUmVjb25jaWxlcyBpcyB0aGUgb25lIGNoZWNrIGEKCQkvLyBjb25zdW1lciBzdG9yaW5nIGEgaGFuZC1idWlsdCBSZXBvcnQgaXMgdG9sZCB0byB0cnVzdC4KCQkvLwoJCS8vIERlcml2ZSBuZXZlciBwcm9kdWNlcyBhIG5lZ2F0aXZlIGNvbHVtbiAoYm90aCBhcmUgYWNjdW11bGF0ZWQgZnJvbQoJCS8vIHplcm8gdGhyb3VnaCBjaGVja2VkQWRkKSwgc28gdGhpcyBjb3N0cyBhIERlcml2ZS1zb3VyY2VkIHJlcG9ydAoJCS8vIG5vdGhpbmcuIHAvcGVyaW9kcyBndWFyZHMgdGhlIHNhbWUgc2hhcGUgYXQgdGhlIHNhbWUga2luZCBvZgoJCS8vIGJvdW5kYXJ5LCB3aXRoIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgYm9vbCBiZWNhdXNlIGl0IGhhcyBvbmUgdG8KCQkvLyByZXR1cm4uCgkJaWYgbC5JbmZsb3dzIDwgMCB8fCBsLk91dGZsb3dzIDwgMCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQluLCBvayA6PSBjaGVja2VkQWRkKHRvdGFsLCBsLk5ldCgpKQoJCWlmICFvayB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQl0b3RhbCA9IG4KCX0KCXRvdGFsLCBvayA6PSBjaGVja2VkQWRkKHRvdGFsLCByLlVuYXR0cmlidXRlZCkKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdG90YWwgPT0gci5OZXRDaGFuZ2UKfQoKLy8gRGVyaXZlIGJ1aWxkcyB0aGUgc3RhdGVtZW50IGZvciBvbmUgd2luZG93LgovLwovLyBQcmVjb25kaXRpb25zLCBhbGwgcmVmdXNlZCByYXRoZXIgdGhhbiBhc3N1bWVkOiB3IG11c3QgYmUgdmFsaWQ7IGNoYXJ0IG11c3QKLy8gYmUgc3RyaWN0bHkgYXNjZW5kaW5nIGJ5IENvZGUsIG5vIGxvbmdlciB0aGFuIFtNYXhBY2NvdW50c10sIHdpdGggZXZlcnkKLy8gS2luZCBvbmUgb2Ygam91cm5hbCdzIGZpdmU7IGVudHJpZXMgbXVzdCBiZSBzdHJpY3RseSBhc2NlbmRpbmcgYnkgSUQgYW5kIG5vCi8vIGxvbmdlciB0aGFuIFtNYXhFbnRyaWVzXSwgd2l0aCBhdCBtb3N0IFtqb3VybmFsLk1heFBvc3RpbmdzUGVyRW50cnldCi8vIHBvc3RpbmdzIGVhY2g7IGFuZCBwIG11c3Qgc2F0aXNmeSB0aGUgcnVsZXMgb24gW1BvbGljeV0uCi8vCi8vIEVudHJpZXMgb3V0c2lkZSB3IGFyZSBza2lwcGVkLCBub3QgcmVmdXNlZCDigJQgYSBjYWxsZXIgcGFzc2luZyB0aGUgd2hvbGUKLy8gYm9vayBpcyB0aGUgZXhwZWN0ZWQgY2FzZSDigJQgYW5kIHRoZWlyIHBvc3RpbmdzIGFyZSB0aGVyZWZvcmUgbm90Ci8vIGNvbnRlbnQtY2hlY2tlZCwgYmVjYXVzZSBubyBmaWd1cmUgaW4gdGhlIHJlcG9ydCBkZXBlbmRzIG9uIHRoZW0uCi8vIFtFcnJJbnZhbGlkUG9zdGluZ10gYW5kIFtFcnJVbmtub3duQWNjb3VudF0gYXJlIHNjb3BlZCB0byB0aGUgd2luZG93IGZvcgovLyB0aGF0IHJlYXNvbjsgdGhlIHBvc3RpbmdzLXBlci1lbnRyeSBjYXAgaXMgbm90LCBzaW5jZSBpdCBpcyB3aGF0IG1ha2VzCi8vIFtNYXhFbnRyaWVzXSdzIGNvc3QgY2VpbGluZyBhIGJvdW5kIHJhdGhlciB0aGFuIGEgaG9wZS4KZnVuYyBEZXJpdmUoY2hhcnQgW11qb3VybmFsLkFjY291bnQsIGVudHJpZXMgW11qb3VybmFsLkVudHJ5LCB3IHBlcmlvZHMuV2luZG93LCBwIFBvbGljeSwgb3BlbmluZyBpbnQ2NCkgKFJlcG9ydCwgZXJyb3IpIHsKCWlmICF3LlZhbGlkKCkgewoJCXJldHVybiBSZXBvcnR7fSwgRXJySW52YWxpZFdpbmRvdwoJfQoJaWYgbGVuKGNoYXJ0KSA+IE1heEFjY291bnRzIHsKCQlyZXR1cm4gUmVwb3J0e30sIEVyclRvb01hbnlBY2NvdW50cwoJfQoJaWYgbGVuKGVudHJpZXMpID4gTWF4RW50cmllcyB7CgkJcmV0dXJuIFJlcG9ydHt9LCBFcnJUb29NYW55RW50cmllcwoJfQoJZm9yIGksIGEgOj0gcmFuZ2UgY2hhcnQgewoJCWlmICFhLktpbmQuVmFsaWQoKSB7CgkJCXJldHVybiBSZXBvcnR7fSwgRXJySW52YWxpZEtpbmQKCQl9CgkJaWYgaSA+IDAgJiYgY2hhcnRbaS0xXS5Db2RlID49IGEuQ29kZSB7CgkJCXJldHVybiBSZXBvcnR7fSwgRXJyQ2hhcnROb3RTb3J0ZWQKCQl9Cgl9Cglmb3IgaSwgZSA6PSByYW5nZSBlbnRyaWVzIHsKCQlpZiBsZW4oZS5Qb3N0aW5ncykgPiBqb3VybmFsLk1heFBvc3RpbmdzUGVyRW50cnkgewoJCQlyZXR1cm4gUmVwb3J0e30sIEVyclRvb01hbnlQb3N0aW5ncwoJCX0KCQlpZiBpID4gMCAmJiBlbnRyaWVzW2ktMV0uSUQgPj0gZS5JRCB7CgkJCXJldHVybiBSZXBvcnR7fSwgRXJyRW50cmllc05vdFNvcnRlZAoJCX0KCX0KCWlmIGVyciA6PSB2YWxpZGF0ZVBvbGljeShjaGFydCwgcCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBSZXBvcnR7fSwgZXJyCgl9CgoJcmVwIDo9IFJlcG9ydHsKCQlXaW5kb3c6ICAgICB3LAoJCUxpbmVzOiAgICAgIG1ha2UoW11MaW5lLCAwLCBOdW1DYXRlZ29yaWVzKSwKCQlPcGVuaW5nOiAgICBvcGVuaW5nLAoJCU5ldFplcm86ICAgIG1ha2UoW111aW50NjQsIDApLAoJCVVucmVzb2x2ZWQ6IG1ha2UoW11VbnJlc29sdmVkLCAwKSwKCX0KCWZvciBjIDo9IENhdGVnb3J5T3BlcmF0aW5nOyBjIDw9IENhdGVnb3J5RmluYW5jaW5nOyBjKysgewoJCXJlcC5MaW5lcyA9IGFwcGVuZChyZXAuTGluZXMsIExpbmV7Q2F0ZWdvcnk6IGN9KQoJfQoKCWZvciBfLCBlIDo9IHJhbmdlIGVudHJpZXMgewoJCWlmICF3LkNvbnRhaW5zKGUuQXQpIHsKCQkJY29udGludWUKCQl9CgkJcmVwLkVudHJpZXMrKwoKCQluZXQgOj0gaW50NjQoMCkKCQljYXNoTGVncyA6PSAwCgkJY2F0cyA6PSBtYWtlKFtdQ2F0ZWdvcnksIDAsIE51bUNhdGVnb3JpZXMpCgkJY29kZXMgOj0gbWFrZShbXXN0cmluZywgMCkKCgkJZm9yIF8sIHBnIDo9IHJhbmdlIGUuUG9zdGluZ3MgewoJCQlpZiAhcGcuU2lkZS5WYWxpZCgpIHx8IHBnLkFtb3VudCA8PSAwIHsKCQkJCXJldHVybiBSZXBvcnR7fSwgRXJySW52YWxpZFBvc3RpbmcKCQkJfQoJCQlpZiAhaW5DaGFydChjaGFydCwgcGcuQWNjb3VudCkgewoJCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJVbmtub3duQWNjb3VudAoJCQl9CgkJCWlmIGlzQ2FzaChwLkNhc2gsIHBnLkFjY291bnQpIHsKCQkJCWNhc2hMZWdzKysKCQkJCXNpZ25lZCA6PSBwZy5BbW91bnQKCQkJCWlmIHBnLlNpZGUgPT0gam91cm5hbC5DcmVkaXQgewoJCQkJCXNpZ25lZCA9IC1wZy5BbW91bnQKCQkJCX0KCQkJCXN1bSwgb2sgOj0gY2hlY2tlZEFkZChuZXQsIHNpZ25lZCkKCQkJCWlmICFvayB7CgkJCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJPdmVyZmxvdwoJCQkJfQoJCQkJbmV0ID0gc3VtCgkJCQljb250aW51ZQoJCQl9CgkJCWMsIGZvdW5kIDo9IHJ1bGVGb3IocC5SdWxlcywgcGcuQWNjb3VudCkKCQkJaWYgIWZvdW5kIHsKCQkJCWlmICFoYXNDb2RlKGNvZGVzLCBwZy5BY2NvdW50KSB7CgkJCQkJY29kZXMgPSBhcHBlbmQoY29kZXMsIHBnLkFjY291bnQpCgkJCQl9CgkJCQljb250aW51ZQoJCQl9CgkJCWlmICFoYXNDYXRlZ29yeShjYXRzLCBjKSB7CgkJCQljYXRzID0gYXBwZW5kKGNhdHMsIGMpCgkJCX0KCQl9CgoJCWlmIGNhc2hMZWdzID09IDAgewoJCQljb250aW51ZQoJCX0KCQlyZXAuQ2FzaEVudHJpZXMrKwoKCQlpZiBuZXQgPT0gMCB7CgkJCXJlcC5OZXRaZXJvID0gYXBwZW5kKHJlcC5OZXRaZXJvLCBlLklEKQoJCQljb250aW51ZQoJCX0KCgkJdG90YWwsIG9rIDo9IGNoZWNrZWRBZGQocmVwLk5ldENoYW5nZSwgbmV0KQoJCWlmICFvayB7CgkJCXJldHVybiBSZXBvcnR7fSwgRXJyT3ZlcmZsb3cKCQl9CgkJcmVwLk5ldENoYW5nZSA9IHRvdGFsCgoJCWlmIGxlbihjb2RlcykgPiAwIHx8IGxlbihjYXRzKSAhPSAxIHsKCQkJLy8gVGhlIHRocmVlIGNhc2VzIGFyZSBzZWxlY3RlZCBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGJ5IGZhbGxpbmcKCQkJLy8gdGhyb3VnaCB0byBhIGRlZmF1bHQsIHNvIHRoYXQgZWFjaCBVbnJlc29sdmVkIHJlY29yZCBjYXJyaWVzIHRoZQoJCQkvLyBzZXQgdGhhdCBleHBsYWlucyBpdDogQ29kZXMgZm9yIGEgbWlzc2luZyBkZWNsYXJhdGlvbiwKCQkJLy8gQ2F0ZWdvcmllcyBmb3IgYSBjb25mbGljdCwgYW5kIE5FSVRIRVIgZm9yIGFuIHVuYmFsYW5jZWQKCQkJLy8gY2FzaC1vbmx5IGVudHJ5IC0tIHdoaWNoIGlzIHdoeSB0aGF0IGNhc2UgaGFzIGl0cyBvd24gcmVhc29uCgkJCS8vIHJhdGhlciB0aGFuIGFwcGVhcmluZyBhcyBhIGNvbmZsaWN0IHdpdGggYW4gZW1wdHkgc2V0LgoJCQl2YXIgcmVhc29uIFJlYXNvbgoJCQlyZXBvcnRlZCA6PSBtYWtlKFtdQ2F0ZWdvcnksIDAsIGxlbihjYXRzKSkKCQkJcmVwb3J0ZWRDb2RlcyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4oY29kZXMpKQoJCQlzd2l0Y2ggewoJCQljYXNlIGxlbihjb2RlcykgPiAwOgoJCQkJcmVhc29uID0gUmVhc29uVW5kZWNsYXJlZAoJCQkJcmVwb3J0ZWRDb2RlcyA9IGFwcGVuZChyZXBvcnRlZENvZGVzLCBjb2Rlcy4uLikKCQkJY2FzZSBsZW4oY2F0cykgPT0gMDoKCQkJCXJlYXNvbiA9IFJlYXNvblVuYmFsYW5jZWQKCQkJZGVmYXVsdDoKCQkJCXJlYXNvbiA9IFJlYXNvbkNvbmZsaWN0CgkJCQlyZXBvcnRlZCA9IGFwcGVuZChyZXBvcnRlZCwgc29ydGVkQ2F0ZWdvcmllcyhjYXRzKS4uLikKCQkJfQoJCQl1bmF0dHJpYnV0ZWQsIG9rIDo9IGNoZWNrZWRBZGQocmVwLlVuYXR0cmlidXRlZCwgbmV0KQoJCQlpZiAhb2sgewoJCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJPdmVyZmxvdwoJCQl9CgkJCXJlcC5VbmF0dHJpYnV0ZWQgPSB1bmF0dHJpYnV0ZWQKCQkJcmVwLlVucmVzb2x2ZWQgPSBhcHBlbmQocmVwLlVucmVzb2x2ZWQsIFVucmVzb2x2ZWR7CgkJCQlFbnRyeUlEOiAgICBlLklELAoJCQkJUmVhc29uOiAgICAgcmVhc29uLAoJCQkJTmV0OiAgICAgICAgbmV0LAoJCQkJQ2F0ZWdvcmllczogcmVwb3J0ZWQsCgkJCQlDb2RlczogICAgICByZXBvcnRlZENvZGVzLAoJCQl9KQoJCQljb250aW51ZQoJCX0KCgkJaWR4IDo9IGludChjYXRzWzBdKSAtIDEKCQlpZiBuZXQgPiAwIHsKCQkJaW4sIG9rIDo9IGNoZWNrZWRBZGQocmVwLkxpbmVzW2lkeF0uSW5mbG93cywgbmV0KQoJCQlpZiAhb2sgewoJCQkJcmV0dXJuIFJlcG9ydHt9LCBFcnJPdmVyZmxvdwoJCQl9CgkJCXJlcC5MaW5lc1tpZHhdLkluZmxvd3MgPSBpbgoJCX0gZWxzZSB7CgkJCW91dCwgb2sgOj0gY2hlY2tlZEFkZChyZXAuTGluZXNbaWR4XS5PdXRmbG93cywgLW5ldCkKCQkJaWYgIW9rIHsKCQkJCXJldHVybiBSZXBvcnR7fSwgRXJyT3ZlcmZsb3cKCQkJfQoJCQlyZXAuTGluZXNbaWR4XS5PdXRmbG93cyA9IG91dAoJCX0KCQlyZXAuTGluZXNbaWR4XS5FbnRyaWVzKysKCX0KCgljbG9zaW5nLCBvayA6PSBjaGVja2VkQWRkKHJlcC5PcGVuaW5nLCByZXAuTmV0Q2hhbmdlKQoJaWYgIW9rIHsKCQlyZXR1cm4gUmVwb3J0e30sIEVyck92ZXJmbG93Cgl9CglyZXAuQ2xvc2luZyA9IGNsb3NpbmcKCglyZXR1cm4gcmVwLCBuaWwKfQoKLy8gdmFsaWRhdGVQb2xpY3kgY2hlY2tzIHAgYWdhaW5zdCB0aGUgY2hhcnQuIEV2ZXJ5IGZhaWx1cmUgaXMgYSBkaXN0aW5jdAovLyBlcnJvciwgYmVjYXVzZSBlYWNoIG9uZSBoYXMgYSBkaXN0aW5jdCBmaXggYW5kICJpbnZhbGlkIHBvbGljeSIgdGVsbHMgYQovLyBjYWxsZXIgbm90aGluZyBhYm91dCB3aGljaCBvZiBzaXggdGhpbmdzIHRvIGxvb2sgYXQuCmZ1bmMgdmFsaWRhdGVQb2xpY3koY2hhcnQgW11qb3VybmFsLkFjY291bnQsIHAgUG9saWN5KSBlcnJvciB7CglpZiBsZW4ocC5DYXNoKSA9PSAwIHsKCQlyZXR1cm4gRXJyTm9DYXNoQWNjb3VudHMKCX0KCWlmIGxlbihwLkNhc2gpID4gTWF4QWNjb3VudHMgfHwgbGVuKHAuUnVsZXMpID4gTWF4QWNjb3VudHMgewoJCXJldHVybiBFcnJUb29NYW55QWNjb3VudHMKCX0KCWZvciBpLCBjb2RlIDo9IHJhbmdlIHAuQ2FzaCB7CgkJaWYgaSA+IDAgJiYgcC5DYXNoW2ktMV0gPj0gY29kZSB7CgkJCXJldHVybiBFcnJDYXNoTm90U29ydGVkCgkJfQoJCWssIGZvdW5kIDo9IGtpbmRPZihjaGFydCwgY29kZSkKCQlpZiAhZm91bmQgewoJCQlyZXR1cm4gRXJyVW5rbm93bkNhc2hBY2NvdW50CgkJfQoJCWlmIGsgIT0gam91cm5hbC5Bc3NldCB7CgkJCXJldHVybiBFcnJDYXNoQWNjb3VudE5vdEFzc2V0CgkJfQoJfQoJZm9yIGksIHIgOj0gcmFuZ2UgcC5SdWxlcyB7CgkJaWYgaSA+IDAgJiYgcC5SdWxlc1tpLTFdLkNvZGUgPj0gci5Db2RlIHsKCQkJcmV0dXJuIEVyclJ1bGVzTm90U29ydGVkCgkJfQoJCWlmICFyLkNhdGVnb3J5LlZhbGlkKCkgewoJCQlyZXR1cm4gRXJySW52YWxpZENhdGVnb3J5CgkJfQoJCWlmIF8sIGZvdW5kIDo9IGtpbmRPZihjaGFydCwgci5Db2RlKTsgIWZvdW5kIHsKCQkJcmV0dXJuIEVyclVua25vd25SdWxlQWNjb3VudAoJCX0KCQlpZiBpc0Nhc2gocC5DYXNoLCByLkNvZGUpIHsKCQkJcmV0dXJuIEVyckNhc2hBY2NvdW50Q2xhc3NpZmllZAoJCX0KCX0KCXJldHVybiBuaWwKfQoKLy8ga2luZE9mIHJldHVybnMgdGhlIGNoYXJ0IEtpbmQgZm9yIGNvZGUuIFRoZSBjaGFydCBpcyBzdHJpY3RseSBhc2NlbmRpbmcsIHNvCi8vIHRoaXMgaXMgYSBiaW5hcnkgc2VhcmNoLgpmdW5jIGtpbmRPZihjaGFydCBbXWpvdXJuYWwuQWNjb3VudCwgY29kZSBzdHJpbmcpIChqb3VybmFsLktpbmQsIGJvb2wpIHsKCWxvLCBoaSA6PSAwLCBsZW4oY2hhcnQpLTEKCWZvciBsbyA8PSBoaSB7CgkJbWlkIDo9IGxvICsgKGhpLWxvKS8yCgkJc3dpdGNoIHsKCQljYXNlIGNoYXJ0W21pZF0uQ29kZSA9PSBjb2RlOgoJCQlyZXR1cm4gY2hhcnRbbWlkXS5LaW5kLCB0cnVlCgkJY2FzZSBjaGFydFttaWRdLkNvZGUgPCBjb2RlOgoJCQlsbyA9IG1pZCArIDEKCQlkZWZhdWx0OgoJCQloaSA9IG1pZCAtIDEKCQl9Cgl9CglyZXR1cm4gMCwgZmFsc2UKfQoKLy8gaW5DaGFydCByZXBvcnRzIHdoZXRoZXIgY29kZSBpcyBpbiB0aGUgY2hhcnQuCmZ1bmMgaW5DaGFydChjaGFydCBbXWpvdXJuYWwuQWNjb3VudCwgY29kZSBzdHJpbmcpIGJvb2wgewoJXywgZm91bmQgOj0ga2luZE9mKGNoYXJ0LCBjb2RlKQoJcmV0dXJuIGZvdW5kCn0KCi8vIGlzQ2FzaCByZXBvcnRzIHdoZXRoZXIgY29kZSBpcyBhIGRlY2xhcmVkIGNhc2ggYWNjb3VudC4gY2FzaCBpcyBzdHJpY3RseQovLyBhc2NlbmRpbmcsIHNvIHRoaXMgaXMgYSBiaW5hcnkgc2VhcmNoLgpmdW5jIGlzQ2FzaChjYXNoIFtdc3RyaW5nLCBjb2RlIHN0cmluZykgYm9vbCB7CglsbywgaGkgOj0gMCwgbGVuKGNhc2gpLTEKCWZvciBsbyA8PSBoaSB7CgkJbWlkIDo9IGxvICsgKGhpLWxvKS8yCgkJc3dpdGNoIHsKCQljYXNlIGNhc2hbbWlkXSA9PSBjb2RlOgoJCQlyZXR1cm4gdHJ1ZQoJCWNhc2UgY2FzaFttaWRdIDwgY29kZToKCQkJbG8gPSBtaWQgKyAxCgkJZGVmYXVsdDoKCQkJaGkgPSBtaWQgLSAxCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCi8vIHJ1bGVGb3IgcmV0dXJucyB0aGUgZGVjbGFyZWQgY2F0ZWdvcnkgZm9yIGNvZGUuIHJ1bGVzIGlzIHN0cmljdGx5IGFzY2VuZGluZwovLyBieSBDb2RlLCBzbyB0aGlzIGlzIGEgYmluYXJ5IHNlYXJjaC4KZnVuYyBydWxlRm9yKHJ1bGVzIFtdQ2xhc3NpZmljYXRpb24sIGNvZGUgc3RyaW5nKSAoQ2F0ZWdvcnksIGJvb2wpIHsKCWxvLCBoaSA6PSAwLCBsZW4ocnVsZXMpLTEKCWZvciBsbyA8PSBoaSB7CgkJbWlkIDo9IGxvICsgKGhpLWxvKS8yCgkJc3dpdGNoIHsKCQljYXNlIHJ1bGVzW21pZF0uQ29kZSA9PSBjb2RlOgoJCQlyZXR1cm4gcnVsZXNbbWlkXS5DYXRlZ29yeSwgdHJ1ZQoJCWNhc2UgcnVsZXNbbWlkXS5Db2RlIDwgY29kZToKCQkJbG8gPSBtaWQgKyAxCgkJZGVmYXVsdDoKCQkJaGkgPSBtaWQgLSAxCgkJfQoJfQoJcmV0dXJuIDAsIGZhbHNlCn0KCi8vIGhhc0NhdGVnb3J5IHJlcG9ydHMgd2hldGhlciBjIGlzIGFscmVhZHkgaW4gY2F0cy4gVGhlIHNsaWNlIGlzIGF0IG1vc3QKLy8gTnVtQ2F0ZWdvcmllcyBsb25nLCBzbyBhIGxpbmVhciBzY2FuIGlzIHRoZSB3aG9sZSBjb3N0LgpmdW5jIGhhc0NhdGVnb3J5KGNhdHMgW11DYXRlZ29yeSwgYyBDYXRlZ29yeSkgYm9vbCB7Cglmb3IgXywgeCA6PSByYW5nZSBjYXRzIHsKCQlpZiB4ID09IGMgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgovLyBoYXNDb2RlIHJlcG9ydHMgd2hldGhlciBjb2RlIGlzIGFscmVhZHkgaW4gY29kZXMuIFRoZSBzbGljZSBpcyBhdCBtb3N0Ci8vIGpvdXJuYWwuTWF4UG9zdGluZ3NQZXJFbnRyeSBsb25nLgpmdW5jIGhhc0NvZGUoY29kZXMgW11zdHJpbmcsIGNvZGUgc3RyaW5nKSBib29sIHsKCWZvciBfLCB4IDo9IHJhbmdlIGNvZGVzIHsKCQlpZiB4ID09IGNvZGUgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgovLyBzb3J0ZWRDYXRlZ29yaWVzIHJldHVybnMgY2F0cyBpbiBhc2NlbmRpbmcgb3JkZXIsIGZyZXNobHkgYWxsb2NhdGVkLiBUaGUKLy8gaW5wdXQgaXMgYXQgbW9zdCBOdW1DYXRlZ29yaWVzIGxvbmcsIHNvIHRoaXMgaXMgYSBzZWxlY3Rpb24gb3ZlciB0aHJlZQovLyB2YWx1ZXMgYW5kIHRoZSBvcmRlcmluZyBleGlzdHMgc28gYSByZWFkZXIgY29tcGFyaW5nIHR3byBVbnJlc29sdmVkIHJlY29yZHMKLy8gaXMgY29tcGFyaW5nIHNldHMgcmF0aGVyIHRoYW4gcG9zdGluZyBvcmRlcnMuCmZ1bmMgc29ydGVkQ2F0ZWdvcmllcyhjYXRzIFtdQ2F0ZWdvcnkpIFtdQ2F0ZWdvcnkgewoJb3V0IDo9IG1ha2UoW11DYXRlZ29yeSwgMCwgbGVuKGNhdHMpKQoJZm9yIGMgOj0gQ2F0ZWdvcnlPcGVyYXRpbmc7IGMgPD0gQ2F0ZWdvcnlGaW5hbmNpbmc7IGMrKyB7CgkJaWYgaGFzQ2F0ZWdvcnkoY2F0cywgYykgewoJCQlvdXQgPSBhcHBlbmQob3V0LCBjKQoJCX0KCX0KCXJldHVybiBvdXQKfQoKLy8gY2hlY2tlZEFkZCByZXR1cm5zIGErYiBhbmQgd2hldGhlciBpdCBpcyByZXByZXNlbnRhYmxlLiBCb3RoIG9wZXJhbmRzIGFyZQovLyBpbnQ2NCBhbmQgdGhlIHNpZ24gdGVzdCBpcyB0aGUgc3RhbmRhcmQgb25lOiBhbiBvdmVyZmxvdyBpcyBleGFjdGx5IHRoZQovLyBjYXNlIHdoZXJlIHR3byBzYW1lLXNpZ25lZCBvcGVyYW5kcyBwcm9kdWNlIGEgZGlmZmVyZW50bHktc2lnbmVkIHN1bS4KZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGEgPiAwICYmIGIgPiAwICYmIHMgPCAwKSB8fCAoYSA8IDAgJiYgYiA8IDAgJiYgcyA+PSAwKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gcywgdHJ1ZQp9ChpjCgtnbm9tb2QudG9tbBJUbW9kdWxlID0gImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jYXNoZmxvdyIKZ25vID0gIjAuOSIKIg0xMDAwMDAwMHVnbm90EhIIuoTCQBILMTM1MzAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQEUQnl0vORdrhdzXaNa6QkqkOwmyTVev1Fcddi0Mw82yRNclHdvvxuR8HhIwKp5irEWnH6I0b0VB6G1ADoEOpVoaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}