{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "qK4wbrV6auDtUpDsf2K7VBOMNUIrKN1h1VBzgvgaM08=",
    "height": "364085",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "73420858",
      "GasUsed": "48947239"
    },
    "tx": "CoGeAgoML3ZtLm1fYWRkcGtnEu+dAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKynQIKBXRpZXJzEjlnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvdGllcnMaYAoLZ25vbW9kLnRvbWwSUW1vZHVsZSA9ICJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvdGllcnMiCmdubyA9ICIwLjkiChqKnAIKCXRpZXJzLmdubxL7mwIvLyBQYWNrYWdlIHRpZXJzIHByaWNlcyBvbmUgYW1vdW50IGFnYWluc3QgYSBncmFkdWF0ZWQgc2NoZWR1bGU6IGN1dCB0aGUKLy8gYW1vdW50IGF0IGNhbGxlci1kZWNsYXJlZCBicmVha3BvaW50cywgY2hhcmdlIGVhY2ggc2xpY2UgYXQgaXRzIG93biByYXRlLAovLyBhbmQgc3VtLgovLwovLyBUaGlzIGlzIHRoZSBhcml0aG1ldGljIGJlaGluZCBhIHByb2dyZXNzaXZlIGZlZSwgYSBtYXJnaW5hbCB0YXggYnJhY2tldCwgYQovLyB2b2x1bWUgZGlzY291bnQgYW5kIGEgdGllcmVkIHJveWFsdHkuIE5vdGhpbmcgaGVyZSByZWFkcyB0aGUgY2hhaW4sIGhvbGRzCi8vIHN0YXRlLCBvciBrbm93cyB3aGF0IHRoZSBhbW91bnQgaXMgYSBxdWFudGl0eSBvZiwgc28gYSByZWFsbSBjYW4gcHJpY2UgYQovLyB3aG9sZSBzY2hlZHVsZSB3aXRob3V0IGEgbm9kZS4KLy8KLy8JcywgXyA6PSBOZXcoW11pbnQ2NHsxMDAwLCA1MDAwfSwgW11pbnQ2NHsxMDAsIDI1MCwgNTAwfSkKLy8JcGFydHMsIGVyciA6PSBzLlNsaWNlQXQoNzAwMCkgICAgIC8vIFsxMDAwIDQwMDAgMjAwMF0gLS0gdGhlIHBhcnRpdGlvbgovLwljb2wsIGVyciA6PSBzLkNoYXJnZUJ5VGllcig3MDAwKSAgLy8gWzEwIDEwMCAxMDBdICAgICAgLS0gdGhlIGxpbmUgaXRlbXMKLy8JZmVlLCBlcnIgOj0gcy5DaGFyZ2UoNzAwMCkgICAgICAgIC8vIDIxMCAgICAgICAgICAgICAgIC0tIHRoZWlyIHN1bQovLwovLyBUaGUgdGhyZWUgc3RlcHMgYXJlIHNlcGFyYWJsZSBvbiBwdXJwb3NlLCBpbiB0aGUgc2hhcGUgW3AvYWdpbmddIHVzZXM6IHRoZQovLyBwYXJ0aXRpb24gaXMgd2hhdCBhIHJlYWRlciBjaGVja3MgYWdhaW5zdCB0aGUgc2NoZWR1bGUsIHRoZSBwZXItdGllciBjb2x1bW4KLy8gaXMgdGhlIGxpbmUgaXRlbXMsIGFuZCBbU2NoZWR1bGUuQ2hhcmdlXSBpcyB0aGUgb25lIG51bWJlciB0aGF0IGdvZXMgaW4gYQovLyBsZWRnZXIuIENoYXJnZSBpcyAqZGVmaW5lZCogYXMgdGhlIHN1bSBvZiB0aGUgY29sdW1uLCBzbyB0aGUgdHdvIGNhbm5vdAovLyBkaXNhZ3JlZS4KLy8KLy8gIyBNYXJnaW5hbCwgYW5kIG5ldmVyIGEgY2xpZmYKLy8KLy8gRWFjaCBzbGljZSBvZiB0aGUgYW1vdW50IGlzIGNoYXJnZWQgYXQgdGhlIHJhdGUgZm9yIHRoZSB0aWVyIGl0IGZhbGxzIGluLgovLyBUaGUgd2hvbGUgYW1vdW50IGlzIG5ldmVyIGNoYXJnZWQgYXQgdGhlIHRvcCB0aWVyJ3MgcmF0ZS4gVGhvc2UgYXJlCi8vIGRpZmZlcmVudCBudW1iZXJzLCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgbm90IGEgcm91bmRpbmcgbWF0dGVyOiB0aGUgY2xpZmYKLy8gZm9ybSBoYXMgYSBkaXNjb250aW51aXR5IGF0IGV2ZXJ5IGVkZ2UsIHdoZXJlIGVhcm5pbmcgb25lIG1vcmUgdW5pdCBjYW4KLy8gY29zdCBtb3JlIHRoYW4gb25lIHVuaXQuCi8vCi8vIFdpdGggZWRnZXMgYHsxMDB9YCBhbmQgcmF0ZXMgYHswLCA1MDAwfWAsIHRoZSBjbGlmZiBmb3JtIGNoYXJnZXMgMCBhdCA5OSBhbmQKLy8gNTAgYXQgMTAwIOKAlCBvbmUgZXh0cmEgdW5pdCBjb3N0cyBmaWZ0eS4gVGhlIGdyYWR1YXRlZCBmb3JtIGNoYXJnZXMgMCBhdCAxMDAKLy8gYW5kIDAgYXQgMTAxLCBiZWNhdXNlIG9ubHkgdGhlIG9uZSB1bml0IGFib3ZlIHRoZSBlZGdlIGlzIHByaWNlZCBhdCA1MCUuCi8vCi8vIFdoYXQgdGhpcyBwYWNrYWdlIGd1YXJhbnRlZXMsIGF0IGV2ZXJ5IGFtb3VudCBhbmQgZm9yIGV2ZXJ5IHZhbGlkIHNjaGVkdWxlOgovLwovLwlDaGFyZ2UobikgPD0gQ2hhcmdlKG4rMSkgPD0gQ2hhcmdlKG4pICsgMQovLwovLyBUaGUgbGVmdCBpbmVxdWFsaXR5IGlzIG1vbm90b25pY2l0eTsgdGhlIHJpZ2h0IGlzIHRoZSBuby1jbGlmZiBwcm9wZXJ0eS4KLy8gQWRkaW5nIG9uZSB1bml0IHRvIHRoZSBhbW91bnQgZ3Jvd3MgZXhhY3RseSBvbmUgc2xpY2UgYnkgb25lLCBhbmQKLy8gYGZsb29yKCh4KzEpci9SYXRlU2NhbGUpIC0gZmxvb3IoeMK3ci9SYXRlU2NhbGUpYCBpcyAwIG9yIDEgd2hlbmV2ZXIKLy8gYHIgPD0gUmF0ZVNjYWxlYC4gW1Rlc3RDaGFyZ2VIYXNOb0NsaWZmQXRBbnlFZGdlXSBhc3NlcnRzIGl0IGF0IGFuZCBhcm91bmQKLy8gZXZlcnkgZWRnZSBvZiBldmVyeSBzY2hlZHVsZSBpdCBidWlsZHMsIGFuZCBbVGVzdENsaWZmRm9ybXVsYVZpb2xhdGVzSXRdCi8vIHBpbnMgdGhlIGNvdW50ZXJleGFtcGxlIHNvIHRoYXQgYSBsYXRlciAic2ltcGxpZmljYXRpb24iIHRvIHRoZSBjbGlmZiBmb3JtCi8vIGZhaWxzIHRoZSBzdWl0ZSBpbnN0ZWFkIG9mIHNpbGVudGx5IGNoYW5naW5nIGV2ZXJ5IHB1Ymxpc2hlZCBudW1iZXIuCi8vCi8vIEEgdGhpcmQgY29uc2VxdWVuY2Ugb2YgdGhlIHNhbWUgYm91bmQ6IGBDaGFyZ2UobikgPD0gbmAuIEEgZ3JhZHVhdGVkCi8vIHNjaGVkdWxlIGNhbiBuZXZlciBjaGFyZ2UgbW9yZSB0aGFuIHRoZSBhbW91bnQgaXQgaXMgcHJpY2luZywgd2hpY2ggaXMgd2hhdAovLyBtYWtlcyB0aGUgcmF0ZSBjYXAgaW4gW05ld10gYW4gYXJpdGhtZXRpYyBmYWN0IGFuZCBub3Qgb25seSBoeWdpZW5lLgovLwovLyAjIFRoZSBhbW91bnQgaXMgYSBsZW5ndGgsIGFuZCB0aGUgaGFsZi1vcGVuIGNvbnZlbnRpb24gaXMgbG9hZC1iZWFyaW5nCi8vCi8vIFRoaW5rIG9mIHRoZSBhbW91bnQgYXMgdGhlIGludGVydmFsIGBbMCwgYW1vdW50KWAuIFRpZXIgaSBjb3ZlcnMgdGhlCi8vIGhhbGYtb3BlbiByYW5nZSBgW2VkZ2VzW2ktMV0sIGVkZ2VzW2ldKWAsIHdpdGggdGllciAwIHN0YXJ0aW5nIGF0IDAgYW5kIHRoZQovLyBsYXN0IHRpZXIgdW5ib3VuZGVkIGFib3ZlLiBUaGF0IG1ha2VzIHRoZSB0aWVycyBleGhhdXN0aXZlIGFuZCBkaXNqb2ludCBvdmVyCi8vIGV2ZXJ5IG5vbi1uZWdhdGl2ZSBhbW91bnQsIHdpdGggbm8gYnJlYWtwb2ludCBzaGFyZWQgYnkgdHdvIHRpZXJzLiBBIHNsaWNlCi8vIGlzIHRoZSBvdmVybGFwIG9mIGBbMCwgYW1vdW50KWAgd2l0aCBhIHRpZXIncyByYW5nZSwgc28gdGhlIHNsaWNlcyBhbHdheXMKLy8gc3VtIHRvIGV4YWN0bHkgdGhlIGFtb3VudCDigJQgW1NjaGVkdWxlLlNsaWNlQXRdJ3MgY3Jvc3MtZm9vdC4KLy8KLy8gVGhlIHVuaXQgcnVubmluZyBmcm9tIHggdG8geCsxIGlzIHByaWNlZCBhdCB0aGUgdGllciBjb250YWluaW5nICoqeCoqLiBTbwovLyBbU2NoZWR1bGUuVGllck9mXSBhbmQgW1NjaGVkdWxlLk1hcmdpbmFsUmF0ZV0gYW5zd2VyIGEgcXVlc3Rpb24gYWJvdXQgdGhlCi8vICpuZXh0KiB1bml0LCBub3QgdGhlIGxhc3Qgb25lOgovLwovLwlNYXJnaW5hbFJhdGUobikgaXMgdGhlIHJhdGUgdGhlIChuKzEpJ3RoIHVuaXQgd2lsbCBhdHRyYWN0LgovLwovLyBBdCBhbiBlZGdlIHRoZSB0d28gcmVhZGluZ3MgZGlmZmVyLCBhbmQgdGhhdCBkaWZmZXJlbmNlIGlzIHRoZSBvZmYtYnktb25lCi8vIHRoaXMgcGFja2FnZSBpcyBtb3N0IGV4cG9zZWQgdG8uIFdpdGggZWRnZXMgYHszMH1gLCBgTWFyZ2luYWxSYXRlKDMwKWAgaXMKLy8gdGhlICp1cHBlciogdGllcidzIHJhdGU6IHRoZSBhbW91bnQgMzAgZXhhY3RseSBmaWxscyB0aWVyIDAsIGFuZCB0aGUgbmV4dAovLyB1bml0IGlzIHRoZSBmaXJzdCBvbmUgYWJvdmUgdGhlIGVkZ2UuIFRoZSBvdGhlciByZWFkaW5nIOKAlCAidGhlIHJhdGUgdGhlIGxhc3QKLy8gdW5pdCB3YXMgY2hhcmdlZCBhdCIg4oCUIHdvdWxkIGFuc3dlciB3aXRoIHRoZSBsb3dlciB0aWVyLCBhbmQgaXMgbm90IG9mZmVyZWQsCi8vIGJlY2F1c2UgaXQgaXMgdW5kZWZpbmVkIGF0IGFtb3VudCAwLgovLwovLyBbcC9hZ2luZ10gc2hpcHBlZCBhbiBvZmYtYnktb25lIG9mIGV4YWN0bHkgdGhpcyBraW5kIGluIGl0cyBvd24gZGlzY292ZXJ5Ci8vIHJlY29yZCAoaXRzIGRvYywgIlRoZSBkZWdlbmVyYXRlIHR3by1idWNrZXQgY2FzZSIpLCBzbyB0aGUgY29udmVudGlvbiBpcwovLyBzdGF0ZWQgaGVyZSBhbmQgcGlubmVkIGJ5IFtUZXN0TWFyZ2luYWxSYXRlQXRBbkVkZ2VJc1RoZVVwcGVyVGllcl0gcmF0aGVyCi8vIHRoYW4gbGVmdCB0byBhIHJlYWRlciB0byByZWNvbnN0cnVjdC4gW1NjaGVkdWxlLlRpZXJSYW5nZV0gZXhpc3RzIGZvciB0aGUKLy8gc2FtZSByZWFzb246IHJlY29uc3RydWN0aW5nIGEgaGFsZi1vcGVuIHJhbmdlIGZyb20gW1NjaGVkdWxlLkVkZ2VzXSBpcyB3aGVyZQovLyB0aGUgbWlzdGFrZSBsaXZlcy4KLy8KLy8gIyBXaHkgdGhlIGZsb29yIGlzIHRha2VuIHBlciBzbGljZQovLwovLwlDaGFyZ2UgPSDOoyBmbG9vcihzbGljZeG1oiDDlyByYXRl4bWiIC8gUmF0ZVNjYWxlKQovLwovLyBub3Qgb25lIGZsb29yIHRha2VuIGF0IHRoZSBlbmQgb2YgYW4gZXhhY3QgcmF0aW9uYWwgdG90YWwuIFRob3NlIGFyZQovLyBkaWZmZXJlbnQgbnVtYmVycywgYW5kIHdoaWNoIG9uZSBhIHBhY2thZ2Ugc2hpcHBlZCBpcyBpbnZpc2libGUgaW4gYW55IHRlc3QKLy8gdGhhdCBoYXBwZW5zIHRvIHVzZSByb3VuZCByYXRlcy4KLy8KLy8gUGVyLXNsaWNlIGlzIGNob3NlbiBiZWNhdXNlIFtTY2hlZHVsZS5DaGFyZ2VCeVRpZXJdIGlzIHRoZSBsaW5lLWl0ZW0gY29sdW1uCi8vIGEgcmVhZGVyIHNlZXMgbmV4dCB0byB0aGUgc2xpY2VzLCBhbmQgbGluZSBpdGVtcyB0aGF0IGRvIG5vdCBhZGQgdXAgdG8gdGhlCi8vIHN0YXRlZCB0b3RhbCBhcmUgYSBib29ra2VlcGluZyBkZWZlY3QgcmVnYXJkbGVzcyBvZiB3aGljaCB0b3RhbCBpcyAibW9yZQovLyBhY2N1cmF0ZSIuIFRoZSBzYW1lIGRpc2NpcGxpbmUsIGFuZCB0aGUgc2FtZSByYXRpb25hbGUsIGFzIFtwL2FnaW5nXSdzCi8vIHBlci1idWNrZXQgZmxvb3IgYW5kIFtwL2RlcHJlY2lhdGlvbl0ncyBgQ2hhcmdlYC1mcm9tLWBDYXJyeWluZ0F0YC4KLy8KLy8gW1Rlc3RGbG9vcklzUGVyU2xpY2VOb3RBdFRoZUVuZF0gcGlucyBhIGNhc2Ugd2hlcmUgdGhlIHR3byBkaXNhZ3JlZS4KLy8KLy8gIyBNb25vdG9uZSBpbiB0aGUgYW1vdW50IOKAlCBhbmQgd2h5LCB1bmxpa2UgW3AvYWdpbmddLCBpdCByZWFsbHkgaXMKLy8KLy8gW3AvYWdpbmddIHB1Ymxpc2hlZCB0aGUgYW5hbG9nb3VzIGNsYWltIGFzIHNldHRsZWQgYW5kIHRoZSBjb2RlIGZhbHNpZmllZAovLyBpdDogaXRzIHByb3Zpc2lvbiBjYW4gKipmYWxsKiogYXMgdGltZSBhZHZhbmNlcywgYnkgdXAgdG8gb25lIHVuaXQgcGVyCi8vIGJ1Y2tldCwgYmVjYXVzZSBtYXNzICptb3ZlcyBiZXR3ZWVuKiBidWNrZXRzIGFzIGFuIG9ibGlnYXRpb24gYWdlcyBhbmQgZWFjaAovLyBidWNrZXQgcmUtZmxvb3JzLiBJdHMgZG9jIHJlY29yZHMgdGhlIGNvdW50ZXJleGFtcGxlIGFuZCB0aGUgYXR0YWluZWQgYm91bmQuCi8vCi8vIEhlcmUgdGhlIGNsYWltIGhvbGRzLCBhbmQgdGhlIHJlYXNvbiBpcyBzdHJ1Y3R1cmFsIHJhdGhlciB0aGFuIGZvcnR1bmF0ZToKLy8gaW5jcmVhc2luZyB0aGUgYW1vdW50IG9ubHkgZXZlciAqKmFkZHMgbWFzcyBhdCB0aGUgdG9wKiouIEV2ZXJ5IGxvd2VyIHNsaWNlCi8vIGlzIGFscmVhZHkgZnVsbCwgc28gaXRzIHN1YnRvdGFsIGlzIGxpdGVyYWxseSB0aGUgc2FtZSBudW1iZXIgYW5kIG5vIGZsb29yZWQKLy8gc3VidG90YWwgY2FuIHNocmluay4gTm90aGluZyBtb3ZlcyBiZXR3ZWVuIHNsaWNlcy4KLy8KLy8gVGhhdCBpcyBhbiBhcmd1bWVudCwgc28gaXQgaXMgYWxzbyBtZWFzdXJlZDogW1Rlc3RDaGFyZ2VJc01vbm90b25lXSBzd2VlcHMKLy8gcmFuZG9tIHNjaGVkdWxlcyBhY3Jvc3MgY29udGlndW91cyBhbW91bnRzIGFuZCBhc3NlcnRzIGEgc3RyaWN0bHkKLy8gbm9uLWRlY3JlYXNpbmcgY2hhcmdlLiBUaGUgZGlzY292ZXJ5IHJlY29yZCBmb3IgdGhpcyBwYWNrYWdlIGNvbW1pdHRlZCB0bwovLyBhbWVuZGluZyBpdHNlbGYgcmF0aGVyIHRoYW4gcXVpZXRseSBlZGl0aW5nIGlmIHRoZSBzd2VlcCBmb3VuZCBhIGRyb3A7IHRoZQovLyBzd2VlcCBmb3VuZCBub25lLCBhbmQgdGhlIGZpZ3VyZSBpdCByYW4gaXMgaW4gdGhlIHRlc3QgcmF0aGVyIHRoYW4gcmVzdGF0ZWQKLy8gaGVyZS4KLy8KLy8gIyBXaHkgdGhlIHJhdGVzIG5lZWQgTk9UIGJlIG1vbm90b25lLCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgW3AvYWdpbmddCi8vCi8vIFtOZXddIGFjY2VwdHMgcmF0ZXMgaW4gYW55IG9yZGVyLiBBIHJpc2luZyBzY2hlZHVsZSBpcyBhIHByb2dyZXNzaXZlIGZlZTsgYQovLyBmYWxsaW5nIG9uZSBpcyBhIHZvbHVtZSBkaXNjb3VudCwgd2hpY2ggaXMgdGhlIHNhbWUgYXJpdGhtZXRpYyByZWFkIGZyb20gdGhlCi8vIG90aGVyIGVuZCBhbmQgaXMgYSBmaXJzdC1jbGFzcyB1c2Ugb2YgdGhpcyBwYWNrYWdlLCBub3QgYSB0b2xlcmF0ZWQKLy8gZGVnZW5lcmF0ZSBjYXNlLgovLwovLyBbcC9hZ2luZ10gcmVmdXNlcyBhIGZhbGxpbmcgc2NoZWR1bGUsIGFuZCB0aGUgY29udHJhc3QgaXMgd29ydGggc3RhdGluZwovLyBiZWNhdXNlIGNvcHlpbmcgdGhhdCBjaGVjayBoZXJlIHdvdWxkIGJlIHRoZSBwbGF1c2libGUgbWlzdGFrZS4gSXQgbmVlZHMgdGhlCi8vIG9yZGVyaW5nIGZvciB0d28gcmVhc29ucywgbmVpdGhlciBvZiB3aGljaCB0cmFuc2ZlcnM6IGEgZmFsbGluZyBsb3NzIHJhdGUgaXMKLy8gYSBkb21haW4gZXJyb3IgKGFuIG9sZGVyIHJlY2VpdmFibGUgaXMgbm90IG1vcmUgY29sbGVjdGlibGUpLCBhbmQgd2l0aG91dCB0aGUKLy8gb3JkZXJpbmcgaXRzIGV4YWN0LXJhdGlvbmFsIG1vbm90b25pY2l0eSBmYWlscyBhcyB3ZWxsLCBzaW5jZSBhbiBvYmxpZ2F0aW9uCi8vIGNyb3NzaW5nIGludG8gYSBjaGVhcGVyIGJ1Y2tldCAqcmVkdWNlcyogdGhlIHRvdGFsLiBJbiB0aGlzIHBhY2thZ2Ugbm90aGluZwovLyBjcm9zc2VzIGludG8gYW55dGhpbmcuIFRoZSBtb25vdG9uaWNpdHkgYWJvdmUgbmVlZHMgb25seSBgcmF0ZSA+PSAwYC4KLy8KLy8gU28gYSB0cmFuc3Bvc2VkIHJhdGUgYXJyYXkgaXMgYSBzaWxlbnQgYXV0aG9yaW5nIGVycm9yIGhlcmUgaW4gYSB3YXkgaXQgaXMKLy8gbm90IGluIFtwL2FnaW5nXSwgYW5kIHRoaXMgcGFja2FnZSBjYW5ub3QgZGV0ZWN0IGl0LiBUaGF0IGlzIHJlY29yZGVkIGluCi8vICJXaGF0IHRoaXMgcGFja2FnZSBkb2VzIG5vdCBjbGFpbSIgcmF0aGVyIHRoYW4gcGFwZXJlZCBvdmVyIHdpdGggYSBjaGVjawovLyB0aGF0IHdvdWxkIGFsc28gZm9yYmlkIGV2ZXJ5IGRpc2NvdW50IHNjaGVkdWxlLgovLwovLyAjIFRoZSBwZXItc2xpY2UgbXVsdGlwbHkgZ29lcyB0aHJvdWdoIDEyOCBiaXRzCi8vCi8vIGBzbGljZSDDlyByYXRlYCBvdmVyZmxvd3MgYW4gaW50NjQgZm9yIGxhcmdlIGFtb3VudHMg4oCUIGEgc2xpY2UgbmVhciBtYXhJbnQ2NAovLyBhdCBhbnkgcmF0ZSBhYm92ZSAxIGJhc2lzIHBvaW50IOKAlCBzbyB0aGUgcHJvZHVjdCBpcyB0YWtlbiBpbiAxMjggYml0cyB3aXRoCi8vIGBiaXRzLk11bDY0YCBhbmQgZGl2aWRlZCB3aXRoIGBiaXRzLkRpdjY0YC4KLy8KLy8gVGhlIGRpc2NpcGxpbmUgaXMgQURPUFRFRCwgbm90IGRlcml2ZWQsIGFuZCB0aGUgc291cmNlIGlzIFtwL2N1cnZlXSwgcmVhZCBpbgovLyBmdWxsIGJlZm9yZSB0aGlzIHdhcyB3cml0dGVuLiBJdHMgZ3VhcmQgY2FycmllcyB0aGUgYXJndW1lbnQgaW4gaXRzIG93bgovLyBjb21tZW50OiB3aXRob3V0IHRoZSBgaGkgPCBtYCBjaGVjaywgYGJpdHMuRGl2NjRgIHZpb2xhdGVzIGl0cyBvd24KLy8gcHJlY29uZGl0aW9uIGFuZCBvdmVyLWlzc3Vlcy4gU2VlIERJU0NPVkVSWS5tZCDCpyAzIGFuZCDCpyA0LCB3aGljaCBhdHRyaWJ1dGUKLy8gaXQuCi8vCi8vIEhlcmUgdGhhdCBwcmVjb25kaXRpb24gaXMgKnByb3ZhYmxlKjogcmF0ZXMgYXJlIGNhcHBlZCBhdCBSYXRlU2NhbGUsIHNvCi8vIGBzbGljZSDDlyByYXRlIDwgMl42MyDDlyAxMF40IDwgMl43N2AgYW5kIGBoaSA8IDJeMTMgPSA4MTkyIDwgMTAwMDAgPSBtYC4KLy8gKipJdCBpcyBjaGVja2VkIGFueXdheSoqLCBhbmQgc28gaXMgdGhlIHF1b3RpZW50J3MgZml0IGluIGFuIGludDY0LCB3aGljaCBpcwovLyBwcm92YWJsZSBmcm9tIHRoZSBzYW1lIGNhcC4gQSBwcm9vZiB0aGF0IHJlc3RzIG9uIHRoZSByYXRlIGNhcCBpcyBhIHByb29mCi8vIHRoYXQgZXhwaXJlcyBzaWxlbnRseSB0aGUgZGF5IHNvbWVvbmUgcmFpc2VzIHRoZSBjYXAsIGFuZCBDTEFVREUubWQgwqcgN2EncwovLyB3aG9sZSBzdWJqZWN0IGlzIGNoZWNrcyB0aGF0IHN0b3AgYXNraW5nIHRoZWlyIHF1ZXN0aW9uLgovLwovLyBFdmVyeSBndWFyZCBpbiBgY2hhcmdlU2xpY2VgIGlzIHRoZXJlZm9yZSB1bnJlYWNoYWJsZSB0aHJvdWdoIHRoZSBleHBvcnRlZAovLyBBUEksIHdoaWNoIG1ha2VzIHRoZW0gdW50ZXN0YWJsZSB0aHJvdWdoIGl0LiBUaGV5IGFyZSBub3QgbGVmdCB1bmV4ZXJjaXNlZDoKLy8gYGNoYXJnZVNsaWNlYCBpcyB1bmV4cG9ydGVkIGFuZCB0aGUgc3VpdGUgY2FsbHMgaXQgZGlyZWN0bHkg4oCUCi8vIFtUZXN0Q2hhcmdlU2xpY2VHdWFyZHNBUHJlY29uZGl0aW9uVGhlQVBJQ2Fubm90UmVhY2hdIOKAlCBzbyBlYWNoIGd1YXJkIGhhcyBhCi8vIHRlc3QgdGhhdCBmYWlscyB3aGVuIGl0IGlzIHJlbW92ZWQuCi8vCi8vIE5vIGNvdW50IGlzIGdpdmVuIGhlcmUsIGRlbGliZXJhdGVseS4gVGhpcyBwYXJhZ3JhcGggc2FpZCAiQm90aCBndWFyZHMiIHdoZW4KLy8gaXQgbWVhbnQgdGhlIHR3byBPVkVSRkxPVyBndWFyZHMgc3BlY2lmaWNhbGx5LCBhbmQgd2hlbiB0aGUgcmF0ZS1zaWduIGd1YXJkCi8vIHdhcyBhZGRlZCB0aGUgb2J2aW91cyByZXBhaXIg4oCUICJ0aHJlZSIg4oCUIHdhcyB3cm9uZyB0d2ljZSBvdmVyOiB0aGUgZnVuY3Rpb24KLy8gaG9sZHMgZm91ciBndWFyZHMsIGFuZCB0d28gb2YgdGhlIGZvdXIgYXJlIHByZWNvbmRpdGlvbnMgcmF0aGVyIHRoYW4gb3ZlcmZsb3cKLy8gY2hlY2tzLCBzbyBhbnkgc2luZ2xlIG51bWJlciBoZXJlIGFuc3dlcnMgYW4gYW1iaWd1b3VzIHF1ZXN0aW9uLiBDTEFVREUubWQKLy8gwqcgNGEncyBydWxlIGFwcGxpZXMg4oCUIHByZWZlciBkZWxldGluZyBhIHJlc3RhdGVkIG51bWJlciBvdmVyIHVwZGF0aW5nIGl0IOKAlAovLyBhbmQgdGhlIHNhYm90YWdlIGhhcm5lc3MgY291bnRzIHRoZW0gYnkgY29uc3RydWN0aW9uIGFueXdheS4KLy8KLy8gQW4gYWx0ZXJuYXRpdmUgd2FzIGNvbnNpZGVyZWQgYW5kCi8vIHJlamVjdGVkOiBiaW5kaW5nIHRoZSBhbW91bnQgdG8gYG1heEludDY0L1JhdGVTY2FsZWAgc28gYSBwbGFpbiBpbnQ2NAovLyBtdWx0aXBseSBjb3VsZCBub3Qgd3JhcC4gVGhhdCBib3VuZCBpcyBzYWZlIGZvciBhbnkgwrVHTk9UIHF1YW50aXR5IGFuZCBpcwovLyByZWZ1c2VkIGZvciBleGFjdGx5IHRoYXQgcmVhc29uIOKAlCBqdXN0aWZ5aW5nIGl0IG5lZWRzIGEgdW5pdCwgYW5kIHRoaXMKLy8gcGFja2FnZSBkZWNsYXJlcyBpdCBoYXMgbm9uZS4gU2VlIERJU0NPVkVSWS5tZCDCpyA0LgovLwovLyBUaGUgcmF0ZS1zaWduIGd1YXJkIHdhcyBhZGRlZCBhZnRlciBhbiBhZHZlcnNhcmlhbCBhdWRpdCwgYW5kIHRoZQovLyByZWFzb24gaXQgd2FzIG1pc3NpbmcgaXMgd29ydGggbW9yZSB0aGFuIHRoZSBmaXguIFRoZSBwYXJhZ3JhcGggYWJvdmUgcHJvdmVzCi8vIHRoZSBwcmVjb25kaXRpb24gZnJvbSB0aGUgcmF0ZSAqY2FwKiwgYW5kIGEgY2FwIGlzIGFuIHVwcGVyIGJvdW5kOiB3cml0aW5nIGl0Ci8vIG91dCBlc3RhYmxpc2hlZCBgcmF0ZSA8PSBSYXRlU2NhbGVgIGFuZCBzYWlkIG5vdGhpbmcgYWJvdXQgdGhlIG90aGVyIGVuZCwKLy8gd2hpbGUgdGhlIGBzbGljZSA8IDBgIGd1YXJkIHNpdHRpbmcgb25lIGxpbmUgYXdheSBtYWRlIHRoZSBmdW5jdGlvbiBsb29rIGFzCi8vIHRob3VnaCBib3RoIG9mIGl0cyBzaWduZWQgaW5wdXRzIGhhZCBiZWVuIGNvbnNpZGVyZWQuIE1lYXN1cmVkLCBiZWZvcmUgdGhlCi8vIGZpeDogYGNoYXJnZVNsaWNlKDEsIC0xKWAgcmV0dXJuZWQgYCgxODQ0Njc0NDA3MzcwOTU1LCBuaWwpYCDigJQgYSBwb3NpdGl2ZQovLyBjaGFyZ2UsIGEgbmlsIGVycm9yLCBhbmQgYm90aCBvdmVyZmxvdyBndWFyZHMgY2xlYW5seSBwYXNzZWQsIGJlY2F1c2UKLy8gYHVpbnQ2NCgtMSlgIGhhcyBhIHplcm8gaGlnaCB3b3JkIHdoZW4gbXVsdGlwbGllZCBieSAxLgovLwovLyBXaGF0IG1hZGUgaXQgc3Vydml2ZSByZXZpZXcgaXMgdGhlIG5lYXIgbWlzczogYGNoYXJnZVNsaWNlKG1heEludDY0LCAtMSlgCi8vICppcyogY2F1Z2h0LCBieSBgaGkgPj0gbWAsIHNvIHRoZSBuZWdhdGl2ZS1yYXRlIGZhbWlseSBpcyBoYWxmLWNvdmVyZWQgYnkgYW4KLy8gZXhpc3RpbmcgY2hlY2sgYW5kIGEgc3BvdCBwcm9iZSBhdCB0aGUgaW50ZXJlc3RpbmcgZW5kIG9mIGludDY0IHJlcG9ydHMgYW4KLy8gZXJyb3IgZXhhY3RseSBhcyBpdCBzaG91bGQuIFRoZSBob2xlIGlzIGF0IHRoZSAqc21hbGwqIGVuZCwgd2hlcmUgbm90aGluZwovLyBhYm91dCB0aGUgdmFsdWUgbG9va3MgZXh0cmVtZS4gQSBndWFyZCB0aGF0IGNhdGNoZXMgdGhlIGRyYW1hdGljIGNhc2UgYW5kCi8vIG1pc3NlcyB0aGUgbXVuZGFuZSBvbmUgcmVhZHMsIGZyb20gdGhlIG91dHNpZGUsIGxpa2UgYSBndWFyZCB0aGF0IHdvcmtzLgovLwovLyAjIFdoYXQgYm91bmRzIHRoZSB3b3JrCi8vCi8vIFRpZXIgbG9va3VwIGlzIGEgbGluZWFyIHNjYW4gb3ZlciB0aGUgZWRnZXMsIGNoZWFwZXIgdGhhbiBhIGJpbmFyeSBzZWFyY2ggYXQKLy8gdGhlc2Ugc2l6ZXMgYW5kIHRoZSBzaGFwZSBhbiBhdWRpdG9yIGNhbiBjaGVjayBieSByZWFkaW5nLiBbTWF4VGllcnNdIGlzIDE2LAovLyBzbyB0aGVyZSBhcmUgYXQgbW9zdCAxNSBlZGdlcy4gT25lIFtTY2hlZHVsZS5DaGFyZ2VdIHBlcmZvcm1zIGF0IG1vc3QgMTYKLy8gMTI4LWJpdCBtdWx0aXBsaWNhdGlvbnMgYW5kIGRpdmlzaW9ucyBvdmVyIGEgMTYtZW50cnkgcGFydGl0aW9uLCBhbmQgZXZlcnkKLy8gZXhwb3J0ZWQgbWV0aG9kIHJlLXJ1bnMgYGNoZWNrYCwgY29zdGluZyBhdCBtb3N0IDUwIGZ1cnRoZXIgY29tcGFyaXNvbnMuCi8vCi8vIFRoYXQgNTAgaXMgYDIgKyAyICsgKE1heFRpZXJzLTIpICsgMsOXTWF4VGllcnNgLCBhbmQgdGhlIGRlY29tcG9zaXRpb24gaXMKLy8gcGlubmVkIGJ5IFtUZXN0Q29uc3RhbnRzQXJlVGhlRG9jdW1lbnRlZFZhbHVlc10gcmF0aGVyIHRoYW4gbGVmdCBhcyBhCi8vIG51bWJlciBpbiBwcm9zZSBiZXNpZGUgYSBjb25zdGFudCBub2JvZHkgY2hlY2tlZC4gVGhpcyBwcm9qZWN0IGhhcyBzaGlwcGVkCi8vIHRoYXQgZGVmZWN0IG1vcmUgdGhhbiBvbmNlLgovLwovLyBUaG9zZSBhcmUgdGhlIGZpZ3VyZXMsIG5vdCBhbiBhc3NlcnRpb24gdGhhdCB0aGV5IGFyZSBhZmZvcmRhYmxlLiBBIHJlYWxtCi8vIHByaWNpbmcgbWFueSBhbW91bnRzIGluIG9uZSB0cmFuc2FjdGlvbiwgb3IgZG9pbmcgaXQgaW5zaWRlIGEgYFJlbmRlcmAsIG11c3QKLy8gc2l6ZSB0aGVtIGFnYWluc3QgdGhlIGdhcyBpdCBoYXMuIFRoaXMgcGFja2FnZSBib3VuZHMgdGhlIHdvcms7IGl0IGRvZXMgbm90Ci8vIHByaWNlIGl0LgovLwovLyAjIFRoZSBvbmUtdGllciBzY2hlZHVsZSwgYW5kIHdoYXQgaXQgc3Vic3VtZXMKLy8KLy8gRW1wdHkgZWRnZXMgYXJlIGxlZ2l0aW1hdGU6IGBOZXcobmlsLCBbXWludDY0ezI1MH0pYCBpcyBhIGZsYXQgMi41JSBvbiB0aGUKLy8gd2hvbGUgYW1vdW50LCB3aXRoIG9uZSB0aWVyIGFuZCBubyBicmVha3BvaW50LiBJdCBpcyB0aGUgZGVnZW5lcmF0ZSBjYXNlIG9mCi8vIHRoZSBzYW1lIGZvcm11bGEgcmF0aGVyIHRoYW4gYSBzcGVjaWFsIHBhdGguCi8vCi8vIFRoYXQgc2NoZWR1bGUgcmVwcm9kdWNlcyBbcC9udC9ncmM3MjEvcm95YWx0eV0ncyBhcml0aG1ldGljIOKAlCBgc2FsZVByaWNlICoKLy8gQnBzIC8gRmVlRGVub21pbmF0b3JgIGFnYWluc3QgdGhlIHNhbWUgMTAwMDAgZGVub21pbmF0b3Ig4oCUIHdpdGggb25lCi8vIGRpZmZlcmVuY2UgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBub25lIGluIHRoZSByZXN1bHQgZm9yIHRoZSBhbW91bnRzIHRoYXQKLy8gcGFja2FnZSBjYW4gdGFrZS4gUm95YWx0eSBtdWx0aXBsaWVzIGJlZm9yZSBkaXZpZGluZyBpbiBwbGFpbiBpbnQ2NCwgc28gaXQgaXMKLy8gaW1wbGljaXRseSBib3VuZGVkIGF0IGFib3V0IGBtYXhJbnQ2NC8xMDAwMCDiiYggOS4yZTE0YDsgdGhpcyBwYWNrYWdlJ3MKLy8gMTI4LWJpdCBwYXRoIGhhcyBubyBzdWNoIGJvdW5kLiBbVGVzdE9uZVRpZXJTY2hlZHVsZV0gcGlucyB0aGUgYWdyZWVtZW50Ci8vIG92ZXIgdGhlIHJhbmdlIHdoZXJlIGJvdGggYXJlIGRlZmluZWQuCi8vCi8vIFtwL2FnaW5nXSBpcyByZWZ1c2VkIGFzIGEgY29tcGFyaXNvbiBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uOiBpdCBiaW5zIGEgKnNldCoKLy8gb2YgaXRlbXMgYnkgZWFjaCBpdGVtJ3MgYWdlLCB3aGVyZSB0aGlzIHNsaWNlcyAqb25lKiBhbW91bnQgYnkgbWFnbml0dWRlLiBBCi8vIGJpbiBpcyBub3QgYSBzbGljZSwgYW5kIHRoZSBtZWFzdXJhYmxlIGNvbnNlcXVlbmNlIGlzIHRoZSBtb25vdG9uaWNpdHkKLy8gc2VjdGlvbiBhYm92ZS4gU2VlIERJU0NPVkVSWS5tZCDCpyAzLgovLwovLyAjIFdoYXQgdGhpcyBwYWNrYWdlIGRvZXMgbm90IGNsYWltCi8vCi8vICAgLSAqKk5vIG5vdmVsdHkgZm9yIHRoZSBmb3JtdWxhLioqIEEgZ3JhZHVhdGVkIHJhdGUgc2NoZWR1bGUgaXMgdGV4dGJvb2sKLy8gICAgIGFyaXRobWV0aWMgYW5kIHRocmVlIGluZGVwZW5kZW50IG11bC1kaXYgaGVscGVycyBhbHJlYWR5IGV4aXN0IGluIHRoZQovLyAgICAgZWNvc3lzdGVtLiBXaGF0IHdhcyBub3QgZm91bmQgaW4gdGhlIHNlYXJjaGVkIHNvdXJjZXMgaXMgdGhpcyBzaGFwZToKLy8gICAgIGEgcGFydGl0aW9uIG9mIG9uZSBhbW91bnQgaW50byBtYWduaXR1ZGUgc2xpY2VzIGF0IGNhbGxlci1kZWNsYXJlZAovLyAgICAgZWRnZXMsIGVhY2ggcHJpY2VkIGF0IGl0cyBvd24gcmF0ZS4gU2VlIERJU0NPVkVSWS5tZCDCpyAxIGFuZCDCpyAzLCB3aGljaAovLyAgICAgYWxzbyByZWNvcmQgYSBmdW5jdGlvbmFsbHkgZXhhY3QgbXVsLWRpdiBwcmltaXRpdmUgdGhhdCB3YXMgZm91bmQsCi8vICAgICBjbGFzc2lmaWVkIHJldXNhYmxlLCBhbmQgZGVsaWJlcmF0ZWx5IG5vdCBpbXBvcnRlZC4KLy8gICAtICoqTm8gdW5pdCwgZGVsaWJlcmF0ZWx5LioqIFRoZSBhbW91bnQsIHRoZSBlZGdlcyBhbmQgdGhlIHNsaWNlcyBhcmUKLy8gICAgIGludDY0IGluIHdoYXRldmVyIHVuaXQgdGhlIGNhbGxlciBrZWVwcyBjb25zaXN0ZW50bHkuIEEgcmF0ZSBpcwovLyAgICAgZGltZW5zaW9ubGVzcy4gVGhpcyBpcyB0aGUgc3Ryb25nZXIgaGFsZiBvZiBbcC9hZ2luZ10ncyBydWxlLCBhbmQgaGVyZQovLyAgICAgaXQgY29zdHMgbm90aGluZyBiZWNhdXNlIHRoZXJlIGlzIG5vIHRpbWUgYXhpcyB0byBwaWNrIGEgY29udmVudGlvbiBmb3IuCi8vICAgLSAqKk5vdGhpbmcgYWJvdXQgbW9uZXkuKiogQSBjaGFyZ2UgaXMgYSBudW1iZXIgaW4gYSByZXBvcnQuIFRoaXMgcGFja2FnZQovLyAgICAgbmV2ZXIgc2VlcyBhIGNvaW4sIGFuZCBhIHJlYWxtIHVzaW5nIGl0IG11c3Qgbm90IGluZmVyIGN1c3RvZHkgb3IgYQovLyAgICAgdHJhbnNmZXIgZnJvbSBpdC4KLy8gICAtICoqTm8gb3BpbmlvbiBvbiB3aGVyZSB0aGUgZWRnZXMgYW5kIHJhdGVzIGNvbWUgZnJvbS4qKiBQaWNraW5nIHRoZW0gaXMKLy8gICAgIHRoZSB3aG9sZSBvZiBhIGZlZSBwb2xpY3kgYW5kIG5vbmUgb2YgaXQgaXMgaGVyZS4gVGhleSBhcmUgdmFsaWRhdGVkIGZvcgovLyAgICAgc2hhcGUgYW5kIHJhbmdlLCBuZXZlciBmb3IgcGxhdXNpYmlsaXR5IOKAlCBhbmQsIHVubGlrZSBbcC9hZ2luZ10sIG5vdCBmb3IKLy8gICAgIG9yZGVyaW5nIGVpdGhlci4gQSB0cmFuc3Bvc2VkIHJhdGUgYXJyYXkgaXMgYWNjZXB0ZWQuCi8vICAgLSAqKk5vIHNjaGVkdWxlIGlkZW50aXR5LCBhbmQgbm8gdmVyc2lvbmluZy4qKiBBIFtTY2hlZHVsZV0gaXMgYSB2YWx1ZQovLyAgICAgd2l0aCBubyBuYW1lIGFuZCBubyBlZmZlY3RpdmUgZGF0ZS4gQSByZWFsbSB0aGF0IGNoYW5nZXMgaXRzIGZlZXMgbXVzdAovLyAgICAga2VlcCBpdHMgb3duIHJlY29yZCBvZiB3aGljaCBzY2hlZHVsZSBwcmljZWQgd2hpY2ggY2hhcmdlLCBiZWNhdXNlCi8vICAgICBub3RoaW5nIGhlcmUgY2FuIHRlbGwgdHdvIHNjaGVkdWxlcyBhcGFydCBvciBzYXkgd2hlbiBvbmUgdG9vayBlZmZlY3QuCi8vICAgLSAqKk5vdCBhIHJvdW5kaW5nIHBvbGljeS4qKiBUaGUgZmxvb3IgaXMgdGhlIG9ubHkgcm91bmRpbmcgdGhpcyBwYWNrYWdlCi8vICAgICBwZXJmb3JtcyBhbmQgaXQgaXMgbm90IGNvbmZpZ3VyYWJsZS4gQSBjYWxsZXIgbmVlZGluZyByb3VuZC1oYWxmLXVwLCBvcgovLyAgICAgbmVlZGluZyB0aGUgZXhhY3QgcmF0aW9uYWwsIG11c3QgY29tcHV0ZSBpdCBmcm9tIFtTY2hlZHVsZS5TbGljZUF0XSBhbmQKLy8gICAgIHRoZSByYXRlcywgYm90aCBvZiB3aGljaCBhcmUgZXhwb3J0ZWQgZm9yIHRoYXQgcHVycG9zZS4KLy8KLy8gW3AvYWdpbmddOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2FnaW5nCi8vIFtwL2RlcHJlY2lhdGlvbl06IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvZGVwcmVjaWF0aW9uCi8vIFtwL2N1cnZlXTogL3AvZzFlY3N1ajBxNTcyanIwZGh1MjlxOW5qdG5tdzAzaHl1N3R5eXZ2Ni9jdXJ2ZS92MAovLyBbcC9udC9ncmM3MjEvcm95YWx0eV06IC9wL250L2dyYzcyMS9yb3lhbHR5L3YwCnBhY2thZ2UgdGllcnMKCmltcG9ydCAoCgkiZXJyb3JzIgoJIm1hdGgvYml0cyIKKQoKLy8gUmF0ZVNjYWxlIGlzIHRoZSBkZW5vbWluYXRvciBldmVyeSByYXRlIGlzIGV4cHJlc3NlZCBhZ2FpbnN0LCBzbyBhIHJhdGUgaXMKLy8gaW4gYmFzaXMgcG9pbnRzOiAwIGlzIDAlLCAyNTAgaXMgMi41JSwgMTAwMDAgaXMgMTAwJS4KLy8KLy8gSXQgaXMgYSBjb25zdGFudCByYXRoZXIgdGhhbiBhIHBlci1zY2hlZHVsZSBmaWVsZCBvbiBwdXJwb3NlLCB0aGUgc2FtZQovLyBkZWNpc2lvbiBhbmQgdGhlIHNhbWUgcmVhc29uIGFzIFtwL2FnaW5nXSdzOiBhIHNjaGVkdWxlIGNhcnJ5aW5nIGl0cyBvd24KLy8gZGVub21pbmF0b3IgbGV0cyB0d28gc2NoZWR1bGVzIGluIG9uZSByZWFsbSBiZSBwcmljZWQgb24gZGlmZmVyZW50IHNjYWxlcywKLy8gYW5kIHRoZSBmaXJzdCBzeW1wdG9tIG9mIHRoYXQgaXMgYSBjaGFyZ2Ugd3JvbmcgYnkgYSBmYWN0b3Igb2YgYSBodW5kcmVkCi8vIHdpdGggZXZlcnkgaW5kaXZpZHVhbCBudW1iZXIgbG9va2luZyByZWFzb25hYmxlLgovLwovLyBUaGUgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgY29ycHVzIHJhdGhlciB0aGFuIGludmVudGVkLgovLyBbcC9udC9ncmM3MjEvcm95YWx0eV0gZGVjbGFyZXMgaXQgYXMgdGhlIEVJUC0yOTgxIGJhc2lzLXBvaW50IGRlbm9taW5hdG9yCi8vIGFuZCBgZ3VpbGRoYWxsL3RydXN0L3YwYCBpbmRlcGVuZGVudGx5IHNoaXBzIHRoZSBzYW1lIGNlaWxpbmc7IHNlZQovLyBESVNDT1ZFUlkubWQgwqcgNC4KY29uc3QgUmF0ZVNjYWxlIGludDY0ID0gMTAwMDAKCi8vIE1heFRpZXJzIGJvdW5kcyB0aGUgbnVtYmVyIG9mIHRpZXJzLCBhbmQgc28gYm91bmRzIHRoZSBlZGdlIHNjYW4gaW4KLy8gW1NjaGVkdWxlLlRpZXJPZl0gYW5kIHRoZSBsb29wcyBpbiBbU2NoZWR1bGUuU2xpY2VBdF0gYW5kCi8vIFtTY2hlZHVsZS5DaGFyZ2VCeVRpZXJdLiAxNiBpcyBwYXN0IHRoZSBwb2ludCB3aGVyZSBhIHRpZXIgaXMgbWVhbmluZ2Z1bDogYQovLyBjb252ZW50aW9uYWwgZmVlIHNjaGVkdWxlIHVzZXMgdGhyZWUgb3IgZm91ci4KLy8KLy8gVGhlIG1pbmltdW0gaXMgMSwgbm90IDIsIGFuZCB0aGF0IGlzIHRoZSBkZWxpYmVyYXRlIGRpZmZlcmVuY2UgZnJvbQovLyBbcC9hZ2luZ10ncyBNYXhCdWNrZXRzLiBBIG9uZS10aWVyIHNjaGVkdWxlIGhhcyBubyBlZGdlcyBhbmQgYXBwbGllcyBvbmUKLy8gcmF0ZSB0byB0aGUgd2hvbGUgYW1vdW50LCB3aGljaCBpcyBhIGZsYXQgZmVlIOKAlCBkZWdlbmVyYXRlLCBidXQgdGhlIHNhbWUKLy8gZm9ybXVsYSwgYW5kIHVzZWZ1bCBlbm91Z2ggdG8gYmUgdGhlIHN1YmplY3Qgb2YgaXRzIG93biBzZWN0aW9uIGluIHRoZQovLyBwYWNrYWdlIGRvYy4gW3AvYWdpbmddIHJlZnVzZXMgaXRzIG93biBvbmUtYnVja2V0IGNhc2UgYmVjYXVzZSBhIGZsYXQgbG9zcwovLyByYXRlIGlzIG5vdCBhbiBhZ2luZyBzY2hlZHVsZSBhdCBhbGw7IGEgZmxhdCBmZWUgKmlzKiBhIHJhdGUgc2NoZWR1bGUuCi8vCi8vIFdoYXQgdGhlIGJvdW5kIGNvc3RzOiBhIGNhbGxlciBuZWVkaW5nIG1vcmUgdGhhbiAxNiB0aWVycyBtdXN0IGNvbXBvc2UgdHdvCi8vIHNjaGVkdWxlcywgYW5kIHRoZSBjb21wb3NpdGlvbiBpcyAqKm5vdCoqIGEgMzItdGllciBzY2hlZHVsZS4gVGhlIHNlY29uZAovLyB3b3VsZCByZXN0YXJ0IGl0cyBwYXJ0aXRpb24gYXQgMCwgc28gZXZlcnkgc2xpY2UgYW5kIGV2ZXJ5IGZsb29yIHdvdWxkIGJlCi8vIHRha2VuIGFnYWluc3QgdGhlIHdyb25nIG9yaWdpbi4gQ29tcG9zaW5nIGdyYWR1YXRlZCBzY2hlZHVsZXMgaXMgbm90Ci8vIHN1cHBvcnRlZCBhbmQgY2Fubm90IGJlIGZha2VkIGJ5IGFkZGl0aW9uLgpjb25zdCBNYXhUaWVycyA9IDE2Cgp2YXIgKAoJLy8gRXJyQmFkVGllckNvdW50IGlzIHJldHVybmVkIHdoZW4gYSBzY2hlZHVsZSB3b3VsZCBoYXZlIGZld2VyIHRoYW4gMSBvcgoJLy8gbW9yZSB0aGFuIE1heFRpZXJzIHRpZXJzLiBUaGUgdGllciBjb3VudCBpcyBsZW4oZWRnZXMpKzEsIHNvIHRoaXMgaXMgYQoJLy8gc3RhdGVtZW50IGFib3V0IHRoZSBlZGdlIHNsaWNlOiBpdCBtdXN0IGhvbGQgYmV0d2VlbiAwIGFuZCBNYXhUaWVycy0xCgkvLyBlbnRyaWVzLiBBIG5pbCBvciBlbXB0eSBlZGdlIHNsaWNlIGlzIGxlZ2l0aW1hdGUgYW5kIGRvZXMgTk9UIGxhbmQKCS8vIGhlcmUg4oCUIGl0IGlzIHRoZSBvbmUtdGllciBmbGF0IHNjaGVkdWxlLgoJRXJyQmFkVGllckNvdW50ID0gZXJyb3JzLk5ldygidGllcnM6IHRpZXIgY291bnQgbXVzdCBiZSBpbiBbMSwgTWF4VGllcnNdIikKCgkvLyBFcnJCYWRFZGdlcyBpcyByZXR1cm5lZCB3aGVuIHRoZSBlZGdlcyBhcmUgbm90IHBvc2l0aXZlIGFuZCBzdHJpY3RseQoJLy8gaW5jcmVhc2luZy4KCS8vCgkvLyBFcXVhbCBhZGphY2VudCBlZGdlcyB3b3VsZCBkZWZpbmUgYW4gZW1wdHkgdGllciwgd2hpY2ggaXMgbm90IGFuIGVycm9yCgkvLyBpbiBhcml0aG1ldGljIGJ1dCBpcyBhbHdheXMgYW4gYXV0aG9yaW5nIG1pc3Rha2U6IGl0IHNpbGVudGx5IHJlZHVjZXMKCS8vIHRoZSBzY2hlZHVsZSdzIHJlc29sdXRpb24gd2hpbGUgZXZlcnkgdGllciBzdGlsbCByZXBvcnRzLgoJLy8KCS8vIFBvc2l0aXZlIGFuZCBub3QgbWVyZWx5IG5vbi1uZWdhdGl2ZSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBvbmUgc3RlcAoJLy8gZWFybGllci4gQSBmaXJzdCBlZGdlIG9mIDAgbWFrZXMgdGllciAwIHRoZSBoYWxmLW9wZW4gcmFuZ2UgWzAsMCksCgkvLyBvY2N1cGlhYmxlIGJ5IG5vdGhpbmcsIGZvciBldmVyeSBhbW91bnQsIGZvcmV2ZXIg4oCUIHdoaWxlIE51bVRpZXJzIHN0aWxsCgkvLyByZXBvcnRzIGl0IGFuZCBpdHMgcmF0ZSBzdGlsbCBwcmludHMuIFRoYXQgaXMgW3AvYWdpbmddJ3MgZmluZGluZyBZMiwKCS8vIHdoaWNoIHNoaXBwZWQgYXMgYDwgMGAgYW5kIHdhcyBjb3JyZWN0ZWQgYmVmb3JlIGRlcGxveW1lbnQ7IHRoZSBjaGVjawoJLy8gaGVyZSByZWFjaGVzIHRoZSBmaXJzdCBlZGdlIGZyb20gdGhlIG91dHNldCBiZWNhdXNlIG9mIGl0LgoJRXJyQmFkRWRnZXMgPSBlcnJvcnMuTmV3KCJ0aWVyczogZWRnZXMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgc3RyaWN0bHkgaW5jcmVhc2luZyIpCgoJLy8gRXJyQmFkUmF0ZUNvdW50IGlzIHJldHVybmVkIHdoZW4gbGVuKHJhdGVzKSAhPSBsZW4oZWRnZXMpKzEuIFRoZQoJLy8gb2ZmLWJ5LW9uZSBoZXJlIGlzIHRoZSBtb3N0IGxpa2VseSB3YXkgdG8gYnVpbGQgYSB3cm9uZyBzY2hlZHVsZSB0aGF0CgkvLyBzdGlsbCBsb29rcyByaWdodCwgc28gaXQgaXMgbmFtZWQgYXBhcnQgZnJvbSBFcnJCYWRSYXRlOiBhIHJlYWRlcgoJLy8gc2VlaW5nIHRoaXMgZXJyb3Iga25vd3MgdG8gY291bnQsIG5vdCB0byBsb29rIGF0IHZhbHVlcy4KCUVyckJhZFJhdGVDb3VudCA9IGVycm9ycy5OZXcoInRpZXJzOiBuZWVkIGV4YWN0bHkgb25lIHJhdGUgcGVyIHRpZXIsIHdoaWNoIGlzIGxlbihlZGdlcykrMSIpCgoJLy8gRXJyQmFkUmF0ZSBpcyByZXR1cm5lZCB3aGVuIGEgcmF0ZSBpcyBuZWdhdGl2ZSBvciBleGNlZWRzIFJhdGVTY2FsZS4KCS8vCgkvLyBUaGUgY2FwIGlzIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBoeWdpZW5lLiBgcmF0ZSA8PSBSYXRlU2NhbGVgIGlzIHdoYXQKCS8vIG1ha2VzIGBDaGFyZ2UobikgPD0gbmAsIHdoYXQgbWFrZXMgdGhlIG5vLWNsaWZmIGJvdW5kCgkvLyBgQ2hhcmdlKG4rMSkgPD0gQ2hhcmdlKG4pKzFgIGhvbGQsIGFuZCB3aGF0IHByb3ZlcyB0aGUgMTI4LWJpdAoJLy8gcHJlY29uZGl0aW9uIGluIGNoYXJnZVNsaWNlLiBBIHJhdGUgYWJvdmUgMTAwJSB3b3VsZCBjaGFyZ2UgbW9yZSB0aGFuCgkvLyB0aGUgYW1vdW50OyBhIG5lZ2F0aXZlIHJhdGUgd291bGQgY2hhcmdlIGEgcmVmdW5kIGFuZCB3b3VsZCBicmVhayB0aGUKCS8vIG1vbm90b25pY2l0eSB0aGUgcGFja2FnZSBkb2MgY2xhaW1zLgoJLy8KCS8vIFRoZSByYXRlcyBhcmUgTk9UIHJlcXVpcmVkIHRvIGJlIG9yZGVyZWQuIFNlZSB0aGUgcGFja2FnZSBkb2M6IGEKCS8vIGZhbGxpbmcgc2NoZWR1bGUgaXMgYSB2b2x1bWUgZGlzY291bnQsIGFuZCByZWZ1c2luZyBpdCB3b3VsZCBiZSBjb3B5aW5nCgkvLyBhIGNoZWNrIGZyb20gW3AvYWdpbmddIHdob3NlIHR3byByZWFzb25zIGRvIG5vdCB0cmFuc2Zlci4KCUVyckJhZFJhdGUgPSBlcnJvcnMuTmV3KCJ0aWVyczogZWFjaCByYXRlIG11c3QgYmUgaW4gWzAsIFJhdGVTY2FsZV0iKQoKCS8vIEVyckJhZEFtb3VudCBpcyByZXR1cm5lZCBmb3IgYSBuZWdhdGl2ZSBhbW91bnQsIGFuZCBieSB0aGUgcGVyLXRpZXIKCS8vIGFjY2Vzc29ycyBmb3IgYSBuZWdhdGl2ZSBzbGljZS4KCS8vCgkvLyBaZXJvIGlzIGxlZ2l0aW1hdGUsIHVubGlrZSBbcC9hZ2luZ10ncyBvYmxpZ2F0aW9uIGFtb3VudDogYW4gYW1vdW50IG9mCgkvLyB6ZXJvIHBhcnRpdGlvbnMgaW50byBhbGwtemVybyBzbGljZXMgYW5kIGNoYXJnZXMgMCwgd2hpY2ggaXMgdGhlIHJpZ2h0CgkvLyBhbnN3ZXIgYW5kIG5vdCBhIGNhbGxlciBidWcuIEEgcmVhbG0gcHJpY2luZyBhbiBlbXB0eSBjYXJ0IHNob3VsZCBub3QKCS8vIGhhdmUgdG8gc3BlY2lhbC1jYXNlIGl0LgoJRXJyQmFkQW1vdW50ID0gZXJyb3JzLk5ldygidGllcnM6IGFtb3VudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSIpCgoJLy8gRXJyQmFkVGllckluZGV4IGlzIHJldHVybmVkIGJ5IHRoZSBwZXItdGllciBhY2Nlc3NvcnMgZm9yIGFuIGluZGV4CgkvLyBvdXRzaWRlIFswLCBOdW1UaWVycykuCglFcnJCYWRUaWVySW5kZXggPSBlcnJvcnMuTmV3KCJ0aWVyczogdGllciBpbmRleCBvdXQgb2YgcmFuZ2UiKQoKCS8vIEVyck92ZXJmbG93IGlzIHJldHVybmVkIHdoZW4gdGhlIGFyaXRobWV0aWMgd291bGQgd3JhcC4KCS8vCgkvLyBUaHJvdWdoIHRoZSBleHBvcnRlZCBBUEkgaXQgaXMgdW5yZWFjaGFibGUsIGFuZCB0aGF0IGlzIGEgY2xhaW0gd2l0aCBhCgkvLyBwcm9vZiByYXRoZXIgdGhhbiBhbiBhYnNlbmNlIG9mIGV2aWRlbmNlOiB0aGUgc2xpY2VzIHN1bSB0byB0aGUgYW1vdW50CgkvLyBhbmQgc28gZWFjaCBpcyBhdCBtb3N0IG1heEludDY0OyBldmVyeSByYXRlIGlzIGF0IG1vc3QgUmF0ZVNjYWxlOyB0aGUKCS8vIHByb2R1Y3QgaXMgdGFrZW4gaW4gMTI4IGJpdHM7IGFuZCB0aGUgcXVvdGllbnQgaXMgYXQgbW9zdCB0aGUgc2xpY2UuIFRoZQoJLy8gZ3VhcmRzIGluIGNoYXJnZVNsaWNlIGFyZSBrZXB0IGFueXdheSwgYmVjYXVzZSB0aGUgcHJvb2YgcmVzdHMgZW50aXJlbHkKCS8vIG9uIHRoZSByYXRlIGNhcCBhbmQgd291bGQgZXhwaXJlIHNpbGVudGx5IGlmIHRoZSBjYXAgd2VyZSByYWlzZWQuIFNlZQoJLy8gdGhlIHBhY2thZ2UgZG9jLCBhbmQgVGVzdENoYXJnZVNsaWNlR3VhcmRzQVByZWNvbmRpdGlvblRoZUFQSUNhbm5vdFJlYWNoCgkvLyBmb3IgdGhlIGRpcmVjdCB1bmV4cG9ydGVkIGNhbGxzIHRoYXQgZG8gcmVhY2ggdGhlbS4KCUVyck92ZXJmbG93ID0gZXJyb3JzLk5ldygidGllcnM6IGludDY0IG92ZXJmbG93IikKKQoKLy8gbWF4SW50NjQgaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgcmF0aGVyIHRoYW4gYXMgYGludDY0KDEpPDw2MyAtIDFgLCB3aGljaAovLyBkb2VzIG5vdCBjb21waWxlOiB0aGUgc2hpZnQgaXMgZXZhbHVhdGVkIGluIHRoZSBhbHJlYWR5LXR5cGVkIGludDY0IGFuZAovLyBvdmVyZmxvd3MgYmVmb3JlIHRoZSBzdWJ0cmFjdGlvbiBicmluZ3MgaXQgYmFjay4gVGhlIHNhbWUgbm90ZSBpcyBpbgovLyBbcC9hZ2luZ10gYW5kIFtwL2RlcHJlY2lhdGlvbl07IGl0IGlzIHJlcGVhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIHNhbWUgc2hhcGUKLy8gYXMgdGhlIGFyaXRobWV0aWMgdGhpcyBwYWNrYWdlIGV4aXN0cyB0byBnZXQgcmlnaHQuCmNvbnN0IG1heEludDY0IGludDY0ID0gOTIyMzM3MjAzNjg1NDc3NTgwNwoKLy8gU2NoZWR1bGUgaXMgYSBncmFkdWF0ZWQgcmF0ZSBzY2hlZHVsZTogdGhlIGFtb3VudCBicmVha3BvaW50cyBhbmQgdGhlIHJhdGUKLy8gY2hhcmdlZCBvbiBlYWNoIHJlc3VsdGluZyBzbGljZS4KLy8KLy8gSXRzIGZpZWxkcyBhcmUgdW5leHBvcnRlZCBhbmQgdGhlIGFjY2Vzc29ycyBjb3B5LCBmb2xsb3dpbmcgW3AvYWdpbmddIGFuZAovLyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIHNjaGVkdWxlIGhvbGRpbmcgc2xpY2VzIGlzIG5vdCBzYWZlbHkgY29weWFibGUsIGFuZCBhCi8vIGNhbGxlciB0aGF0IGtlcHQgdGhlIHNsaWNlIGl0IHBhc3NlZCB0byBbTmV3XSBjb3VsZCBtdXRhdGUgdGhlIGVkZ2VzIGFmdGVyCi8vIHZhbGlkYXRpb24gc28gdGhhdCBldmVyeSBzdWJzZXF1ZW50IGNhbGwgcHJpY2VkIGFnYWluc3QgYSBzY2hlZHVsZSB0aGF0Ci8vIG5ldmVyIHBhc3NlZCBgY2hlY2tgLiBDb25zdHJ1Y3Qgd2l0aCBbTmV3XS4KdHlwZSBTY2hlZHVsZSBzdHJ1Y3QgewoJLy8gZWRnZXMgaG9sZHMgdGhlIHRpZXIgYnJlYWtwb2ludHMsIHN0cmljdGx5IGluY3JlYXNpbmcgYW5kIHBvc2l0aXZlLgoJLy8gVGllciBpIGlzIHRoZSBoYWxmLW9wZW4gYW1vdW50IHJhbmdlIFtlZGdlc1tpLTFdLCBlZGdlc1tpXSksIHdpdGggdGllcgoJLy8gMCBzdGFydGluZyBhdCAwIGFuZCB0aGUgbGFzdCB0aWVyIHVuYm91bmRlZCBhYm92ZS4gSXQgbWF5IGJlIGVtcHR5LAoJLy8gd2hpY2ggaXMgdGhlIG9uZS10aWVyIGZsYXQgc2NoZWR1bGUuCgllZGdlcyBbXWludDY0CgoJLy8gcmF0ZXMgaG9sZHMgb25lIHJhdGUgcGVyIHRpZXIgaW4gdW5pdHMgb2YgUmF0ZVNjYWxlLCBlYWNoIGluCgkvLyBbMCwgUmF0ZVNjYWxlXSBhbmQgaW4gYW55IG9yZGVyLiBsZW4ocmF0ZXMpID09IGxlbihlZGdlcykrMS4KCXJhdGVzIFtdaW50NjQKfQoKLy8gTmV3IHZhbGlkYXRlcyBhbmQgcmV0dXJucyBhIHNjaGVkdWxlLiBUaGUgZWRnZXMgYXJlIHRoZSBhbW91bnQgYnJlYWtwb2ludHMsCi8vIHBvc2l0aXZlIGFuZCBzdHJpY3RseSBpbmNyZWFzaW5nOyB0aGUgcmF0ZXMgYXJlIG9uZSBwZXIgdGllciwgc28gb25lIG1vcmUKLy8gdGhhbiB0aGVyZSBhcmUgZWRnZXMsIGVhY2ggaW4gWzAsIFJhdGVTY2FsZV0uCi8vCi8vCU5ldyhbXWludDY0ezEwMDAsIDUwMDB9LCBbXWludDY0ezEwMCwgMjUwLCA1MDB9KQovLwovLyByZWFkcyBhczogMSUgb24gdGhlIGZpcnN0IDEwMDAsIDIuNSUgb24gdGhlIG5leHQgNDAwMCwgNSUgb24gZXZlcnl0aGluZwovLyBhYm92ZSA1MDAwLgovLwovLyBFbXB0eSBlZGdlcyBhcmUgbGVnaXRpbWF0ZSBhbmQgZ2l2ZSB0aGUgb25lLXRpZXIgZmxhdCBzY2hlZHVsZToKLy8gYE5ldyhuaWwsIFtdaW50NjR7MjUwfSlgIGNoYXJnZXMgMi41JSBvZiB0aGUgd2hvbGUgYW1vdW50LiBBIGZpcnN0IGVkZ2Ugb2YgMAovLyBpcyBbRXJyQmFkRWRnZXNdIOKAlCBpdCB3b3VsZCBkZWZpbmUgYW4gZW1wdHkgdGllciAwLgovLwovLyBUaGUgcmF0ZXMgYXJlIGRlbGliZXJhdGVseSBub3QgcmVxdWlyZWQgdG8gYmUgb3JkZXJlZDsgYSBmYWxsaW5nIHNjaGVkdWxlIGlzCi8vIGEgdm9sdW1lIGRpc2NvdW50LiBTZWUgdGhlIHBhY2thZ2UgZG9jIG9uIHdoeSBbcC9hZ2luZ10gcmVmdXNlcyB3aGF0IHRoaXMKLy8gYWNjZXB0cy4KLy8KLy8gQm90aCBzbGljZXMgYXJlIGNvcGllZCwgc28gdGhlIGNhbGxlciBtYXkgcmV1c2Ugb3IgbXV0YXRlIGl0cyBvd24uCmZ1bmMgTmV3KGVkZ2VzLCByYXRlcyBbXWludDY0KSAoU2NoZWR1bGUsIGVycm9yKSB7CgllIDo9IG1ha2UoW11pbnQ2NCwgbGVuKGVkZ2VzKSkKCWNvcHkoZSwgZWRnZXMpCglyIDo9IG1ha2UoW11pbnQ2NCwgbGVuKHJhdGVzKSkKCWNvcHkociwgcmF0ZXMpCglzIDo9IFNjaGVkdWxle2VkZ2VzOiBlLCByYXRlczogcn0KCWlmIGVyciA6PSBzLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBTY2hlZHVsZXt9LCBlcnIKCX0KCXJldHVybiBzLCBuaWwKfQoKLy8gY2hlY2sgdmFsaWRhdGVzIGV2ZXJ5IGZpZWxkIGFuZCBlc3RhYmxpc2hlcyB0aGUgcHJlY29uZGl0aW9uIHRoYXQgbGV0cwovLyBjaGFyZ2VTbGljZSBkaXZpZGUgd2l0aG91dCBhIGd1YXJkIHBlciB0ZXJtLgovLwovLyBFdmVyeSBleHBvcnRlZCBtZXRob2QgdGhhdCBjYW4gcmV0dXJuIGFuIGVycm9yIGNhbGxzIGl0IHJhdGhlciB0aGFuIHRydXN0aW5nCi8vIGl0cyByZWNlaXZlciwgc28gdGhlIHplcm8gU2NoZWR1bGUgZmFpbHMgZXZlcnl3aGVyZSBpbnN0ZWFkIG9mIHByaWNpbmcKLy8gYWdhaW5zdCBuaWwgc2xpY2VzLgovLwovLyBUaGF0IHF1YWxpZmllciBpcyBhIGNvcnJlY3Rpb24uIFRoaXMgc2FpZCAiRXZlcnkgZXhwb3J0ZWQgbWV0aG9kIGNhbGxzIGl0IiwKLy8gd2hpY2ggaXMgZmFsc2U6IFtTY2hlZHVsZS5FZGdlc10gYW5kIFtTY2hlZHVsZS5SYXRlc10gZG8gbm90LCBhbmQgY2Fubm90Ci8vIHVzZWZ1bGx5IOKAlCB0aGV5IHJldHVybiBhIHNsaWNlIGFuZCBubyBlcnJvciwgc28gdGhlcmUgaXMgbm90aGluZyBmb3IgYSBmYWlsZWQKLy8gY2hlY2sgdG8gYmVjb21lLiBBbiBhdWRpdCBjYXVnaHQgdGhlIG92ZXJzdGF0ZW1lbnQsIGFuZCB0aGUgaG9uZXN0IHZlcnNpb24gb2YKLy8gdGhlIGludmFyaWFudCBuYW1lcyB3aGVyZSB0aGUgcHJvdGVjdGlvbiBhY3R1YWxseSBsaXZlczoKLy8KLy8gICAtIGBlZGdlc2AgYW5kIGByYXRlc2AgYXJlIHVuZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIGNhbiBidWlsZCBhIFNjaGVkdWxlCi8vICAgICB0aGF0IGRpZCBub3QgY29tZSBmcm9tIFtOZXddLgovLyAgIC0gW05ld10gcmVqZWN0cyBieSByZXR1cm5pbmcgYFNjaGVkdWxle31gLCBub3QgdGhlIGhhbGYtYnVpbHQgYHNgLCBzbyBhCi8vICAgICByZWZ1c2VkIHNjaGVkdWxlIGNhcnJpZXMgbm8gZWRnZXMgb3IgcmF0ZXMgdG8gaGFuZCBiYWNrLiBNZWFzdXJlZDogYQovLyAgICAgc2NoZWR1bGUgTmV3IHJlZnVzZWQgYW5zd2VycyBgRWRnZXMoKSA9PSBbXWAsIGBsZW4gMGAuCi8vCi8vIFNvIHRoZSB0d28gdW5jaGVja2VkIGFjY2Vzc29ycyBhcmUgc2FmZSBieSBDT05TVFJVQ1RJT04gcmF0aGVyIHRoYW4gYnkKLy8gdmFsaWRhdGlvbiwgYW5kIHRoZSBkaXN0aW5jdGlvbiBtYXR0ZXJzIGJlY2F1c2UgdGhlIHR3byBmYWlsIGRpZmZlcmVudGx5LiBBCi8vIGNoZWNrIHRoYXQgaXMgYWJzZW50IGZhaWxzIHdoZW4gc29tZW9uZSBhZGRzIGEgcGF0aCBhcm91bmQgaXQ7IGEgZmllbGQgdGhhdAovLyBpcyB1bmV4cG9ydGVkIGZhaWxzIG9ubHkgaWYgc29tZW9uZSBleHBvcnRzIGl0LiBXaXRoaW4gdGhpcyBwYWNrYWdlIHRoZQovLyBjb25zdHJ1Y3Rpb24gYXJndW1lbnQgZG9lcyBub3QgaG9sZCBhdCBhbGwsIGFuZCB0aGF0IGlzIG1lYXN1cmFibGUgcmF0aGVyCi8vIHRoYW4gaHlwb3RoZXRpY2FsOiBhIGhvc3RpbGUgaW4tcGFja2FnZSBzdHJ1Y3QgbGl0ZXJhbCBhbnN3ZXJzCi8vIGBFZGdlcygpID09IFstNSAtMV1gIHdoaWxlIGBWYWxpZCgpID09IGZhbHNlYC4gTm90aGluZyBpcyB3cm9uZyB3aXRoIHRoYXQKLy8gdG9kYXkgLS0gdGhlIHBhY2thZ2UncyBvd24gY29kZSBuZXZlciBidWlsZHMgb25lIC0tIGJ1dCBpdCBpcyB0aGUgc3RhdGUgYQovLyBmdXR1cmUgYE5ld2AgdmFyaWFudCB0aGF0IHJldHVybmVkIGBzYCBiZXNpZGUgaXRzIGVycm9yIHdvdWxkIGxlYWssIGFuZAovLyBFZGdlcy9SYXRlcyBhcmUgcHJlY2lzZWx5IHRoZSB0d28gbWV0aG9kcyB0aGF0IHdvdWxkIG5vdCBub3RpY2UuCi8vCi8vIE5vdGUKLy8gd2hhdCB0aGF0IGNvc3RzIGhlcmUgdGhhdCBpdCBkb2VzIG5vdCBjb3N0IFtwL2FnaW5nXTogdGhlIHplcm8gU2NoZWR1bGUgaGFzCi8vIG5vIGVkZ2VzLCB3aGljaCBpcyBhICpsZWdhbCogZWRnZSBzbGljZSBpbiB0aGlzIHBhY2thZ2UsIHNvIGl0IGlzIHRoZSByYXRlCi8vIGNvdW50IHRoYXQgcmVqZWN0cyBpdCDigJQgYGxlbihuaWwpICE9IDArMWAuIFtFcnJCYWRSYXRlQ291bnRdIGlzIHRoZXJlZm9yZQovLyB0aGUgemVybyB2YWx1ZSdzIGVycm9yLCBhbmQgVGVzdFplcm9TY2hlZHVsZUlzSW52YWxpZCBhc3NlcnRzIGV4YWN0bHkgdGhhdAovLyByYXRoZXIgdGhhbiBvbmx5IHRoYXQgc29tZSBlcnJvciBjYW1lIGJhY2suCi8vCi8vIFRoZSBjb3N0IGlzIGF0IG1vc3QgNTAgY29tcGFyaXNvbnMgcGVyIGNhbGw7IHNlZSB0aGUgcGFja2FnZSBkb2Mgb24gYm91bmRzLgpmdW5jIChzIFNjaGVkdWxlKSBjaGVjaygpIGVycm9yIHsKCWlmIGxlbihzLmVkZ2VzKSA+IE1heFRpZXJzLTEgewoJCXJldHVybiBFcnJCYWRUaWVyQ291bnQKCX0KCWlmIGxlbihzLnJhdGVzKSAhPSBsZW4ocy5lZGdlcykrMSB7CgkJcmV0dXJuIEVyckJhZFJhdGVDb3VudAoJfQoJLy8gYDw9IDBgIGFuZCBub3QgYDwgMGAsIHJlYWNoaW5nIHRoZSBGSVJTVCBlZGdlIGFuZCBub3Qgb25seSB0aGUgYWRqYWNlbnQKCS8vIHBhaXJzLiBUaWVyIDAgaXMgdGhlIGhhbGYtb3BlbiByYW5nZSBbMCwgZWRnZXNbMF0pLCBzbyBhbiBlZGdlc1swXSBvZiAwCgkvLyBtYWtlcyBpdCBbMCwwKSDigJQgb2NjdXBpYWJsZSBieSBub3RoaW5nLCBmb3JldmVyIOKAlCB3aGlsZSBOdW1UaWVycyBzdGlsbAoJLy8gY291bnRzIGl0IGFuZCBNYXJnaW5hbFJhdGUgc3RpbGwgcmV0dXJucyBpdHMgcmF0ZS4gVGhhdCBpcyBwcmVjaXNlbHkgdGhlCgkvLyBjb25kaXRpb24gdGhlIGxvb3AgYmVsb3cgcmVmdXNlcyBiZXR3ZWVuIGFkamFjZW50IGVkZ2VzLCBhbmQgdGhlIGZpcnN0CgkvLyBlZGdlIGlzIHRoZSBvbmUgcGxhY2UgdGhlIHJ1bGUgd291bGQgbm90IHJlYWNoIGlmIGl0IHdlcmUgd3JpdHRlbiBhcyBhCgkvLyBwYWlyd2lzZSBsb29wIGFsb25lLiBJdCBpcyBbcC9hZ2luZ10ncyBhdWRpdCBmaW5kaW5nIFkyLCB3aGljaCBpcyB3aHkgaXQKCS8vIGlzIGEgc2VwYXJhdGUgc3RhdGVtZW50IHdpdGggaXRzIG93biBzYWJvdGFnZSBjYXNlLgoJaWYgbGVuKHMuZWRnZXMpID4gMCAmJiBzLmVkZ2VzWzBdIDw9IDAgewoJCXJldHVybiBFcnJCYWRFZGdlcwoJfQoJZm9yIGkgOj0gMTsgaSA8IGxlbihzLmVkZ2VzKTsgaSsrIHsKCQlpZiBzLmVkZ2VzW2ldIDw9IHMuZWRnZXNbaS0xXSB7CgkJCXJldHVybiBFcnJCYWRFZGdlcwoJCX0KCX0KCWZvciBfLCByYXRlIDo9IHJhbmdlIHMucmF0ZXMgewoJCWlmIHJhdGUgPCAwIHx8IHJhdGUgPiBSYXRlU2NhbGUgewoJCQlyZXR1cm4gRXJyQmFkUmF0ZQoJCX0KCX0KCXJldHVybiBuaWwKfQoKLy8gVmFsaWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBzY2hlZHVsZSBpcyB3ZWxsLWZvcm1lZC4gQSB6ZXJvIFNjaGVkdWxlIGlzIG5vdC4KZnVuYyAocyBTY2hlZHVsZSkgVmFsaWQoKSBib29sIHsgcmV0dXJuIHMuY2hlY2soKSA9PSBuaWwgfQoKLy8gTnVtVGllcnMgaXMgdGhlIG51bWJlciBvZiB0aWVycywgd2hpY2ggaXMgb25lIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVkZ2VzLgovLyBJdCByZXR1cm5zIDAgZm9yIGFuIGludmFsaWQgc2NoZWR1bGUsIGluY2x1ZGluZyB0aGUgemVybyB2YWx1ZSwgc28gYSBjYWxsZXIKLy8gdGhhdCBza2lwcGVkIFtTY2hlZHVsZS5WYWxpZF0gZ2V0cyBhIG51bWJlciB0aGF0IHJlYWRzIGFzIHdyb25nIHJhdGhlciB0aGFuCi8vIG9uZSB0aGF0IHJlYWRzIGFzIGEgbGVnaXRpbWF0ZSBvbmUtdGllciBzY2hlZHVsZS4KLy8KLy8gVGhhdCBkaXN0aW5jdGlvbiBpcyBzaGFycGVyIGhlcmUgdGhhbiBpbiBbcC9hZ2luZ10sIHdoZXJlIDAgY291bGQgbm90IGJlCi8vIGNvbmZ1c2VkIHdpdGggYW55dGhpbmc6IGEgb25lLXRpZXIgc2NoZWR1bGUgaXMgdmFsaWQgaW4gdGhpcyBwYWNrYWdlLCBzbyBpZgovLyBOdW1UaWVycyByZXR1cm5lZCAxIGZvciB0aGUgemVybyB2YWx1ZSBhIGNhbGxlciBjb3VsZCBub3QgdGVsbCB0aGUgZmxhdAovLyBzY2hlZHVsZSBmcm9tIHRoZSBicm9rZW4gb25lLgpmdW5jIChzIFNjaGVkdWxlKSBOdW1UaWVycygpIGludCB7CglpZiBzLmNoZWNrKCkgIT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGxlbihzLmVkZ2VzKSArIDEKfQoKLy8gRWRnZXMgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHRpZXIgYnJlYWtwb2ludHMuIEl0IGlzIGVtcHR5IGZvciBhIG9uZS10aWVyCi8vIHNjaGVkdWxlLgpmdW5jIChzIFNjaGVkdWxlKSBFZGdlcygpIFtdaW50NjQgewoJb3V0IDo9IG1ha2UoW11pbnQ2NCwgbGVuKHMuZWRnZXMpKQoJY29weShvdXQsIHMuZWRnZXMpCglyZXR1cm4gb3V0Cn0KCi8vIFJhdGVzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBwZXItdGllciByYXRlcywgaW4gdW5pdHMgb2YgW1JhdGVTY2FsZV0uCmZ1bmMgKHMgU2NoZWR1bGUpIFJhdGVzKCkgW11pbnQ2NCB7CglvdXQgOj0gbWFrZShbXWludDY0LCBsZW4ocy5yYXRlcykpCgljb3B5KG91dCwgcy5yYXRlcykKCXJldHVybiBvdXQKfQoKLy8gVGllclJhbmdlIHJldHVybnMgdGhlIGhhbGYtb3BlbiBhbW91bnQgcmFuZ2Ugb2YgdGllciBpIGFzIFtsbywgaGkpLAovLyB0b2dldGhlciB3aXRoIHdoZXRoZXIgaXQgaXMgdW5ib3VuZGVkIGFib3ZlIOKAlCB3aGljaCBpcyB0cnVlIGZvciB0aGUgbGFzdAovLyB0aWVyIGFuZCBvbmx5IHRoZSBsYXN0IHRpZXIsIHdoZXJlIGhpIGlzIG1lYW5pbmdsZXNzLgovLwovLyBJdCBleGlzdHMgc28gdGhhdCBhIGNhbGxlciByZW5kZXJpbmcgbGluZSBpdGVtcyBkb2VzIG5vdCBoYXZlIHRvCi8vIHJlY29uc3RydWN0IHRoZSBoYWxmLW9wZW4gY29udmVudGlvbiBmcm9tIFtTY2hlZHVsZS5FZGdlc10uIFRoYXQKLy8gcmVjb25zdHJ1Y3Rpb24gaXMgd2hlcmUgYW4gb2ZmLWJ5LW9uZSBsaXZlcywgYW5kIFtwL2FnaW5nXSBzaGlwcGVkIG9uZSBvZgovLyB0aG9zZSBpbiBpdHMgb3duIGRpc2NvdmVyeSByZWNvcmQ7IHNlZSB0aGUgcGFja2FnZSBkb2MuCmZ1bmMgKHMgU2NoZWR1bGUpIFRpZXJSYW5nZShpIGludCkgKGxvLCBoaSBpbnQ2NCwgdW5ib3VuZGVkIGJvb2wsIGVyciBlcnJvcikgewoJaWYgZXJyIDo9IHMuY2hlY2soKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIDAsIDAsIGZhbHNlLCBlcnIKCX0KCWlmIGkgPCAwIHx8IGkgPiBsZW4ocy5lZGdlcykgewoJCXJldHVybiAwLCAwLCBmYWxzZSwgRXJyQmFkVGllckluZGV4Cgl9CglpZiBpID4gMCB7CgkJbG8gPSBzLmVkZ2VzW2ktMV0KCX0KCWlmIGkgPT0gbGVuKHMuZWRnZXMpIHsKCQlyZXR1cm4gbG8sIDAsIHRydWUsIG5pbAoJfQoJcmV0dXJuIGxvLCBzLmVkZ2VzW2ldLCBmYWxzZSwgbmlsCn0KCi8vIFRpZXJPZiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdGllciB0aGF0IHRoZSBORVhUIHVuaXQgb2YgdGhlIGFtb3VudCBmYWxscwovLyBpbjogMCBmb3IgdGhlIGxvd2VzdCwgTnVtVGllcnMtMSBmb3IgdGhlIHVuYm91bmRlZCB0b3AuCi8vCi8vIFRoZSBwYXJ0aXRpb24gaXMgaGFsZi1vcGVuLCBbbG8sIGhpKSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCBleGhhdXN0aXZlIGFuZAovLyBkaXNqb2ludCBvdmVyIGV2ZXJ5IG5vbi1uZWdhdGl2ZSBhbW91bnQgd2l0aCBubyBicmVha3BvaW50IHNoYXJlZCBieSB0d28KLy8gdGllcnMuIEFuIGFtb3VudCBlcXVhbCB0byBhbiBlZGdlIGlzIGluIHRoZSAqKnVwcGVyKiogdGllciwgc28gd2l0aCBlZGdlCi8vIDEwMDAsIGBUaWVyT2YoMTAwMClgIGlzIDE6IHRoZSBhbW91bnQgMTAwMCBleGFjdGx5IGZpbGxzIHRpZXIgMCBhbmQgdGhlIG5leHQKLy8gdW5pdCBpcyB0aGUgZmlyc3Qgb25lIGFib3ZlIHRoZSBicmVha3BvaW50LgovLwovLyBSZWFkIGl0IGFzIGEgcXVlc3Rpb24gYWJvdXQgdGhlIG5leHQgdW5pdCwgbmV2ZXIgYWJvdXQgdGhlIGxhc3Qgb25lLiBTZWUgdGhlCi8vIHBhY2thZ2UgZG9jLCB3aGljaCBzdGF0ZXMgdGhlIGNvbnZlbnRpb24gYW5kIG5hbWVzIHRoZSBvZmYtYnktb25lIGl0IGF2b2lkcy4KZnVuYyAocyBTY2hlZHVsZSkgVGllck9mKGFtb3VudCBpbnQ2NCkgKGludCwgZXJyb3IpIHsKCWlmIGVyciA6PSBzLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiAwLCBlcnIKCX0KCWlmIGFtb3VudCA8IDAgewoJCXJldHVybiAwLCBFcnJCYWRBbW91bnQKCX0KCWZvciBpLCBlZGdlIDo9IHJhbmdlIHMuZWRnZXMgewoJCWlmIGFtb3VudCA8IGVkZ2UgewoJCQlyZXR1cm4gaSwgbmlsCgkJfQoJfQoJcmV0dXJuIGxlbihzLmVkZ2VzKSwgbmlsCn0KCi8vIE1hcmdpbmFsUmF0ZSByZXR1cm5zIHRoZSByYXRlIHRoZSBuZXh0IHVuaXQgb2YgdGhlIGFtb3VudCB3aWxsIGF0dHJhY3QsIGluCi8vIHVuaXRzIG9mIFtSYXRlU2NhbGVdOiB0aGUgcmF0ZSBvZiBbU2NoZWR1bGUuVGllck9mXSdzIHRpZXIuCi8vCi8vIEl0IGlzIG5vdCB0aGUgYXZlcmFnZSByYXRlIGFuZCBub3QgdGhlIHJhdGUgdGhlIGxhc3QgdW5pdCB3YXMgY2hhcmdlZCBhdC4KLy8gYE1hcmdpbmFsUmF0ZShuKWAgcHJpY2VzIHVuaXQgbisxLCBzbyBhdCBhbiBlZGdlIGl0IHJldHVybnMgdGhlIHVwcGVyIHRpZXIncwovLyByYXRlOyB0aGUgcGFja2FnZSBkb2MgZ2l2ZXMgdGhlIHJlYXNvbiB0aGUgb3RoZXIgcmVhZGluZyBpcyBub3Qgb2ZmZXJlZC4KLy8KLy8gVGhlIGVmZmVjdGl2ZSByYXRlIG9uIHRoZSB3aG9sZSBhbW91bnQgaXMgYENoYXJnZShuKSDDlyBSYXRlU2NhbGUgLyBuYCwgd2hpY2gKLy8gaXMgdGhlIGNhbGxlcidzIGFyaXRobWV0aWM6IGl0IG5lZWRzIGEgcm91bmRpbmcgZGVjaXNpb24gdGhpcyBwYWNrYWdlIGRvZXMKLy8gbm90IG1ha2UsIGFuZCBpdCBpcyB1bmRlZmluZWQgYXQgbiA9IDAuCmZ1bmMgKHMgU2NoZWR1bGUpIE1hcmdpbmFsUmF0ZShhbW91bnQgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCWksIGVyciA6PSBzLlRpZXJPZihhbW91bnQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglyZXR1cm4gcy5yYXRlc1tpXSwgbmlsCn0KCi8vIFNsaWNlQXQgcGFydGl0aW9ucyBhbiBhbW91bnQgYWNyb3NzIHRoZSB0aWVycyBhbmQgcmV0dXJucyB0aGUgc2xpY2UgaW4gZWFjaCwKLy8gbG93ZXN0IGZpcnN0LgovLwovLyBUaGUgc2xpY2VzIHN1bSB0byBleGFjdGx5IHRoZSBhbW91bnQg4oCUIG5vIHJlbWFpbmRlciwgbm8gZHVzdCwgYnkKLy8gY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGJ5IGEgY29ycmVjdGlvbiBzdGVwIOKAlCBiZWNhdXNlIGEgc2xpY2UgaXMgdGhlCi8vIG92ZXJsYXAgb2YgYFswLCBhbW91bnQpYCB3aXRoIHRoZSB0aWVyJ3MgaGFsZi1vcGVuIHJhbmdlIGFuZCB0aGUgcmFuZ2VzCi8vIHBhcnRpdGlvbiBgWzAsIOKInilgLiBbVGVzdFNsaWNlQXRDcm9zc0Zvb3RzXSBhc3NlcnRzIHRoZSBzdW0sIGFuZCB0aGUgcGFja2FnZQovLyBkb2MgZXhwbGFpbnMgd2h5IHRoYXQgYXNzZXJ0aW9uIGFsb25lIGlzIHdlYWs6IG1vdmluZyBtYXNzIGJldHdlZW4gYWRqYWNlbnQKLy8gc2xpY2VzIHByZXNlcnZlcyBpdC4gRWFjaCBlZGdlIGNvbXBhcmlzb24gdGhlcmVmb3JlIGhhcyBpdHMgb3duIHNhYm90YWdlCi8vIGNhc2UsIGluIHRvb2xzL3Rlc3RfdGllcnNfc2Fib3RhZ2Uuc2guCi8vCi8vIEFuIGFtb3VudCBvZiAwIHJldHVybnMgYWxsLXplcm8gc2xpY2VzIGFuZCBubyBlcnJvci4gVGllcnMgYWJvdmUgdGhlIGFtb3VudAovLyBhcmUgMCwgd2hpY2ggaXMgd2h5IHRoZSByZXN1bHQgYWx3YXlzIGhhcyBbU2NoZWR1bGUuTnVtVGllcnNdIGVudHJpZXMgcmF0aGVyCi8vIHRoYW4gYmVpbmcgdHJ1bmNhdGVkIGF0IHRoZSBsYXN0IG5vbi1lbXB0eSB0aWVyOiBhIGNhbGxlciByZW5kZXJpbmcgbGluZQovLyBpdGVtcyBhZ2FpbnN0IFtTY2hlZHVsZS5SYXRlc10gaW5kZXhlcyBib3RoIGJ5IHRpZXIuCmZ1bmMgKHMgU2NoZWR1bGUpIFNsaWNlQXQoYW1vdW50IGludDY0KSAoW11pbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBzLmNoZWNrKCk7IGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgYW1vdW50IDwgMCB7CgkJcmV0dXJuIG5pbCwgRXJyQmFkQW1vdW50Cgl9CglvdXQgOj0gbWFrZShbXWludDY0LCBsZW4ocy5lZGdlcykrMSkKCWZvciBpIDo9IDA7IGkgPD0gbGVuKHMuZWRnZXMpOyBpKysgewoJCXZhciBsbyBpbnQ2NAoJCWlmIGkgPiAwIHsKCQkJbG8gPSBzLmVkZ2VzW2ktMV0KCQl9CgkJLy8gVGhlIGVkZ2VzIGluY3JlYXNlLCBzbyBvbmNlIHRoZSBhbW91bnQgZmFpbHMgdG8gcmVhY2ggdGhpcyB0aWVyJ3MKCQkvLyBmbG9vciBpdCByZWFjaGVzIG5vIGhpZ2hlciB0aWVyIGVpdGhlci4gVGhlIHJlbWFpbmluZyBlbnRyaWVzIHN0YXkKCQkvLyBhdCB0aGVpciB6ZXJvIHZhbHVlLCB3aGljaCBpcyB0aGUgY29ycmVjdCBhbnN3ZXIgYW5kIG5vdCBhbgoJCS8vIG9taXNzaW9uLgoJCWlmIGFtb3VudCA8PSBsbyB7CgkJCWJyZWFrCgkJfQoJCXRvcCA6PSBhbW91bnQKCQlpZiBpIDwgbGVuKHMuZWRnZXMpICYmIHMuZWRnZXNbaV0gPCBhbW91bnQgewoJCQl0b3AgPSBzLmVkZ2VzW2ldCgkJfQoJCS8vIE5vIG92ZXJmbG93IGlzIHBvc3NpYmxlIGluIGVpdGhlciBzdWJ0cmFjdGlvbjogbG8gaXMgbm9uLW5lZ2F0aXZlCgkJLy8gYW5kIHN0cmljdGx5IGJlbG93IHRvcCBpbiBib3RoIGJyYW5jaGVzLCBzbyB0aGUgZGlmZmVyZW5jZSBpcyBhCgkJLy8gcG9zaXRpdmUgaW50NjQuCgkJb3V0W2ldID0gdG9wIC0gbG8KCX0KCXJldHVybiBvdXQsIG5pbAp9CgovLyBDaGFyZ2VCeVRpZXIgcmV0dXJucyB0aGUgY2hhcmdlIG9uIGVhY2ggc2xpY2Ugb2YgYW4gYW1vdW50LCBsb3dlc3QgZmlyc3Q6Ci8vIHRoZSBsaW5lLWl0ZW0gY29sdW1uLgovLwovLyBFYWNoIGVudHJ5IGlzIGBmbG9vcihzbGljZeG1oiDDlyByYXRl4bWiIC8gUmF0ZVNjYWxlKWAsIHRoZSBmbG9vciB0YWtlbiBwZXIgc2xpY2UKLy8gc28gdGhhdCB0aGlzIGNvbHVtbiBzdW1zIHRvIGV4YWN0bHkgd2hhdCBbU2NoZWR1bGUuQ2hhcmdlXSByZXBvcnRzLiBTZWUgdGhlCi8vIHBhY2thZ2UgZG9jIGZvciB3aGF0IHRoYXQgY2hvaWNlIGNvc3RzLgovLwovLyBVbmxpa2UgW3AvYWdpbmddJ3MgUHJvdmlzaW9uQnlCdWNrZXQsIHRoaXMgdGFrZXMgdGhlIGFtb3VudCByYXRoZXIgdGhhbiBhCi8vIGNhbGxlci1idWlsdCByZXBvcnQsIHNvIHRoZXJlIGlzIG5vIGNyb3NzLWZvb3QgdG8gdmFsaWRhdGUgYW5kIG5vIHdheSB0bwovLyBwcmljZSBhIHBhcnRpdGlvbiB0aGF0IGNhbWUgZnJvbSBhIGRpZmZlcmVudCBzY2hlZHVsZS4gW3AvYWdpbmddIGV4cG9ydHMgaXRzCi8vIFJlcG9ydCBzbyB0aGF0IGEgcmVhbG0gY2FuIGFjY3VtdWxhdGUgYnVja2V0cyBhY3Jvc3MgY2FsbHMsIGFuZCBwYXlzIGZvciBpdAovLyB3aXRoIGZvdXIgdmFsaWRhdGlvbiBicmFuY2hlcyBhbmQgYSBkb2N1bWVudGVkIGhhemFyZC4gTm90aGluZyBoZXJlIG5lZWRzCi8vIGFjY3VtdWxhdGlvbiDigJQgb25lIGFtb3VudCBpcyBvbmUgYW1vdW50IOKAlCBzbyB0aGUgb3Bwb3J0dW5pdHkgaXMgcmVtb3ZlZAovLyBpbnN0ZWFkIG9mIGd1YXJkZWQuCmZ1bmMgKHMgU2NoZWR1bGUpIENoYXJnZUJ5VGllcihhbW91bnQgaW50NjQpIChbXWludDY0LCBlcnJvcikgewoJcGFydHMsIGVyciA6PSBzLlNsaWNlQXQoYW1vdW50KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglvdXQgOj0gbWFrZShbXWludDY0LCBsZW4ocGFydHMpKQoJZm9yIGksIHNsaWNlIDo9IHJhbmdlIHBhcnRzIHsKCQljLCBlcnIgOj0gY2hhcmdlU2xpY2Uoc2xpY2UsIHMucmF0ZXNbaV0pCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIGVycgoJCX0KCQlvdXRbaV0gPSBjCgl9CglyZXR1cm4gb3V0LCBuaWwKfQoKLy8gQ2hhcmdlIHJldHVybnMgdGhlIHRvdGFsIGNoYXJnZSBvbiBhbiBhbW91bnQ6IG9uZSBudW1iZXIgZm9yIGEgbGVkZ2VyLgovLwovLyBJdCBpcyBkZWZpbmVkIGFzIHRoZSBzdW0gb2YgW1NjaGVkdWxlLkNoYXJnZUJ5VGllcl0sIHNvIHRoZSBzaW5nbGUgZmlndXJlCi8vIGFuZCB0aGUgbGluZSBpdGVtcyBjYW4gbmV2ZXIgZGlzYWdyZWUg4oCUIHRoZSBzYW1lIGRpc2NpcGxpbmUgW3AvYWdpbmddIHVzZXMKLy8gZm9yIFByb3Zpc2lvbiBhbmQgW3AvZGVwcmVjaWF0aW9uXSBmb3IgQ2hhcmdlLgovLwovLyBUaGUgc3VtIGNhbm5vdCBvdmVyZmxvdzogZWFjaCB0ZXJtIGlzIGF0IG1vc3QgaXRzIHNsaWNlLCBiZWNhdXNlIGV2ZXJ5IHJhdGUKLy8gaXMgYXQgbW9zdCBSYXRlU2NhbGUsIGFuZCB0aGUgc2xpY2VzIHN1bSB0byB0aGUgYW1vdW50LiBUaGF0IGFsc28gZ2l2ZXMKLy8gYENoYXJnZShuKSA8PSBuYCwgc3RhdGVkIGluIHRoZSBwYWNrYWdlIGRvYy4KZnVuYyAocyBTY2hlZHVsZSkgQ2hhcmdlKGFtb3VudCBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcGFydHMsIGVyciA6PSBzLkNoYXJnZUJ5VGllcihhbW91bnQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9Cgl2YXIgc3VtIGludDY0Cglmb3IgXywgcCA6PSByYW5nZSBwYXJ0cyB7CgkJc3VtICs9IHAKCX0KCXJldHVybiBzdW0sIG5pbAp9CgovLyBjaGFyZ2VTbGljZSByZXR1cm5zIGZsb29yKHNsaWNlIMOXIHJhdGUgLyBSYXRlU2NhbGUpIHdpdGggdGhlIHByb2R1Y3QgdGFrZW4KLy8gaW4gMTI4IGJpdHMuCi8vCi8vIEl0IGlzIHVuZXhwb3J0ZWQgYW5kIGl0IGlzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgc3VpdGUsIHdoaWNoIGlzIHRoZSBvbmx5Ci8vIHdheSBhbnkgZ3VhcmQgYmVsb3cgY2FuIGJlIHJlYWNoZWQ6IGV2ZXJ5IG9uZSBvZiB0aGVtIGlzIHByb3ZhYmx5IHVucmVhY2hhYmxlCi8vIGZyb20gYSB2YWxpZGF0ZWQgU2NoZWR1bGUsIGFuZCBldmVyeSBvbmUgaXMga2VwdC4gU2VlIHRoZSBwYWNrYWdlIGRvYywgIlRoZQovLyBwZXItc2xpY2UgbXVsdGlwbHkgZ29lcyB0aHJvdWdoIDEyOCBiaXRzIiwgZm9yIHRoZSBwcm9vZiwgdGhlIGF0dHJpYnV0aW9uIHRvCi8vIFtwL2N1cnZlXSwgYW5kIHdoeSBhIHByb29mIHJlc3Rpbmcgb24gdGhlIHJhdGUgY2FwIGlzIG5vdCB0cmVhdGVkIGFzIGEKLy8gbGljZW5jZSB0byBkZWxldGUgdGhlIGNoZWNrLgovLwovLyAiZWl0aGVyIGd1YXJkIOKApiBib3RoIiBzdG9vZCBoZXJlIHVudGlsIHRoZSBZMSBmaXggYWRkZWQgYSBmb3VydGggZ3VhcmQsIGFuZAovLyBpdCB3YXMgbm90IGNhdWdodCBieSB0aGUgc3dlZXAgdGhhdCBmaXhlZCB0aGUgb3RoZXIgY291bnRzIGJlY2F1c2UgYQovLyBzaW5nbGUtbGluZSBncmVwIGRvZXMgbm90IG1hdGNoIHByb3NlIGEgY29tbWVudCB3cmFwIGhhcyBzcGxpdC4gQm90aCBvZiB0aG9zZQovLyBmYWlsdXJlIG1vZGVzIGFyZSByZWNvcmRlZCBpbiBBVURJVC5tZCDCpyA1IGl0ZW0gMS4KLy8KLy8gQm90aCBzaWduZWQgaW5wdXRzIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBhbmQgdGhlIGNhbGxlcnMgZXN0YWJsaXNoIGVhY2ggZnJvbQovLyBhIGRpZmZlcmVudCBwbGFjZTogYHNsaWNlYCBmcm9tIHRoZSBwYXJ0aXRpb24gW1NjaGVkdWxlLlNsaWNlQXRdIGJ1aWxkcywgYW5kCi8vIGByYXRlYCBmcm9tIGBjaGVja2AsIHdoaWNoIHJlamVjdHMgYHJhdGUgPCAwYCBiZWZvcmUgYW55IFNjaGVkdWxlIGV4aXN0cy4KLy8gTmFtaW5nIG9ubHkgYHNsaWNlYCBoZXJlIGlzIGhvdyB0aGUgbWlzc2luZyBgcmF0ZSA8IDBgIGd1YXJkIHdlbnQgdW5ub3RpY2VkCi8vIOKAlCB0aGUgZG9jIGRlc2NyaWJlZCBoYWxmIHRoZSBjb250cmFjdCBhbmQgdGhlIGNvZGUgZW5mb3JjZWQgZXhhY3RseSBhcyBtdWNoCi8vIGFzIHRoZSBkb2MgZGVzY3JpYmVkLgpmdW5jIGNoYXJnZVNsaWNlKHNsaWNlLCByYXRlIGludDY0KSAoaW50NjQsIGVycm9yKSB7CglpZiBzbGljZSA8IDAgewoJCXJldHVybiAwLCBFcnJCYWRBbW91bnQKCX0KCS8vIE5vdCBzeW1tZXRyaWMgd2l0aCB0aGUgZ3VhcmQgYWJvdmUsIGFuZCBkZWxpYmVyYXRlbHkgc286IGEgbmVnYXRpdmUgc2xpY2UKCS8vIGlzIGEgYnJva2VuIHBhcnRpdGlvbiAoRXJyQmFkQW1vdW50KSwgd2hpbGUgYSBuZWdhdGl2ZSByYXRlIGlzIGEgYnJva2VuCgkvLyBzY2hlZHVsZSAoRXJyQmFkUmF0ZSkg4oCUIHRoZSBlcnJvciBuYW1lcyB3aGljaCBwcmVjb25kaXRpb24gZmFpbGVkLCBhbmQKCS8vIGVhY2ggaXMgdGhlIGVycm9yIGBjaGVja2Agd291bGQgaGF2ZSByZXR1cm5lZCBmb3IgdGhlIHNhbWUgaW5wdXQuCgkvLwoJLy8gV2hhdCBpdCBtdXN0IHByZWNlZGUgaXMgdGhlIERJVklTSU9OLCBub3QgdGhlIGNvbnZlcnNpb24gLS0gc3RhdGVkCgkvLyBwcmVjaXNlbHkgYmVjYXVzZSB0aGUgbG9vc2UgdmVyc2lvbiBvZiB0aGlzIHNlbnRlbmNlIGlzIHRoZSBkZWZlY3QgYmVpbmcKCS8vIHJlcGFpcmVkLiBgdWludDY0KHJhdGUpYCBpcyBhIHZhbHVlIGNvbnZlcnNpb24gYW5kIGNhbm5vdCBmYWlsLCBzbyBhIGd1YXJkCgkvLyBzaXR0aW5nIGJldHdlZW4gaXQgYW5kIGBoaSA+PSBtYCB3b3VsZCBiZWhhdmUgaWRlbnRpY2FsbHk7IHBsYWNpbmcgaXQKCS8vIGZpcnN0IGlzIGZvciB0aGUgcmVhZGVyLCBub3QgZm9yIGNvcnJlY3RuZXNzLiBXaGF0IHdvdWxkIGJlIHdyb25nIGlzCgkvLyBwbGFjaW5nIGl0IGFmdGVyIHRoZSBkaXZpc2lvbiwgYmVjYXVzZSBgdWludDY0KC0xKWAgbXVsdGlwbGllZCBieSBhIHNtYWxsCgkvLyBzbGljZSBoYXMgYSBoaWdoIHdvcmQgb2YgemVybywgc2FpbHMgcGFzdCBgaGkgPj0gbWAsIGFuZCBkaXZpZGVzIHRvIGEKCS8vIGxhcmdlIHBvc2l0aXZlIGNoYXJnZS4gTWVhc3VyZWQgYmVmb3JlIHRoaXMgZ3VhcmQgZXhpc3RlZDoKCS8vIGBjaGFyZ2VTbGljZSgxLCAtMSkgPSAoMTg0NDY3NDQwNzM3MDk1NSwgbmlsKWAuCglpZiByYXRlIDwgMCB7CgkJcmV0dXJuIDAsIEVyckJhZFJhdGUKCX0KCW0gOj0gdWludDY0KFJhdGVTY2FsZSkKCWhpLCBsbyA6PSBiaXRzLk11bDY0KHVpbnQ2NChzbGljZSksIHVpbnQ2NChyYXRlKSkKCS8vIGJpdHMuRGl2NjQgUEFOSUNTIHdoZW4gaXRzIHByZWNvbmRpdGlvbiBoaSA8IHkgaXMgdmlvbGF0ZWQsIHNvIHRoaXMgaXMKCS8vIG5vdCBhIHBvbGl0ZW5lc3MgY2hlY2s6IHdpdGhvdXQgaXQgYSB3cmFwcGluZyBpbnB1dCB3b3VsZCBhYm9ydCB0aGUKCS8vIHRyYW5zYWN0aW9uIGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBhbmQgdGhlIGNhbGxlciBjb3VsZCBub3QgdGVsbAoJLy8gYW4gb3ZlcmZsb3cgZnJvbSBhbnkgb3RoZXIgcGFuaWMuIFRoZSBzYW1lIGFyZ3VtZW50IFtwL2N1cnZlXSBtYWtlcyBpbgoJLy8gaXRzIG93biBjb21tZW50LgoJaWYgaGkgPj0gbSB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CglxLCBfIDo9IGJpdHMuRGl2NjQoaGksIGxvLCBtKQoJLy8gQW5kIHRoZSBxdW90aWVudCBtdXN0IGZpdC4gUHJvdmFibGUgZnJvbSByYXRlIDw9IFJhdGVTY2FsZSwgd2hpY2ggZ2l2ZXMKCS8vIHEgPD0gc2xpY2UgPD0gbWF4SW50NjQg4oCUIGFuZCBjaGVja2VkIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmUuIFRoZQoJLy8gdHdvIGd1YXJkcyBhcmUgbm90IHJlZHVuZGFudDogdGhpcyBvbmUgaXMgcmVhY2hhYmxlIHdpdGggYSByYXRlIGluCgkvLyAoUmF0ZVNjYWxlLCAyw5dSYXRlU2NhbGUpLCB3aGVyZSB0aGUgcHJvZHVjdCdzIGhpZ2ggd29yZCBzdGF5cyBiZWxvdyBtCgkvLyBidXQgdGhlIHF1b3RpZW50IGV4Y2VlZHMgbWF4SW50NjQuCglpZiBxID4gdWludDY0KG1heEludDY0KSB7CgkJcmV0dXJuIDAsIEVyck92ZXJmbG93Cgl9CglyZXR1cm4gaW50NjQocSksIG5pbAp9CiINMTAwMDAwMDB1Z25vdBISCPTAgkYSCzE0Njg0MnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkAMaLLy1DIiarb/OgAEhkHgftxO2ZhF7kPhAhrQXpLxf1s4MD7IiXDClDWFEcu9oZ6g4AlnITLO0J8Awbsi3s9UGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}