LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLSAgICAgICAgICAgICAgICAgICAgICAgR05BVCBuY3Vyc2VzIEJpbmRpbmcgU2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZS5IZWFkZXJfSGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCIE8gRCBZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgIC0tCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgLS0KLS0gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgIC0tCi0tICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAtLQotLSB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgLS0KLS0gZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgIC0tCi0tIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAtLQotLSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgLS0KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAtLQotLSBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgLS0KLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAtLQotLSBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgLS0KLS0gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgIC0tCi0tIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAtLQotLSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgLS0KLS0gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgIC0tCi0tIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KLS0gRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgIC0tCi0tIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAtLQotLSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgLS0KLS0gYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSAgQXV0aG9yOiAgSnVlcmdlbiBQZmVpZmVyLCAxOTk2Ci0tICBWZXJzaW9uIENvbnRyb2wKLS0gICRSZXZpc2lvbjogMS4xNiAkCi0tICAkRGF0ZTogMjAwNi8wNi8yNSAxNDozMDoyMiAkCi0tICBCaW5kaW5nIFZlcnNpb24gMDEuMDAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpdGggQWRhLkNhbGVuZGFyOyB1c2UgQWRhLkNhbGVuZGFyOwp3aXRoIFRlcm1pbmFsX0ludGVyZmFjZS5DdXJzZXMuVGV4dF9JTy5JbnRlZ2VyX0lPOwp3aXRoIFNhbXBsZS5NYW5pZmVzdDsgdXNlIFNhbXBsZS5NYW5pZmVzdDsKCi0tICBUaGlzIHBhY2thZ2UgaGFuZGxlcyB0aGUgcGFpbnRpbmcgb2YgdGhlIGhlYWRlciBsaW5lIG9mIHRoZSBzY3JlZW4uCi0tCnBhY2thZ2UgYm9keSBTYW1wbGUuSGVhZGVyX0hhbmRsZXIgaXMKCiAgIHBhY2thZ2UgSW50X0lPIGlzIG5ldwogICAgIFRlcm1pbmFsX0ludGVyZmFjZS5DdXJzZXMuVGV4dF9JTy5JbnRlZ2VyX0lPIChJbnRlZ2VyKTsKICAgdXNlIEludF9JTzsKCiAgIEhlYWRlcl9XaW5kb3cgOiBXaW5kb3cgOj0gTnVsbF9XaW5kb3c7CgogICBEaXNwbGF5X0hvdXIgIDogSW50ZWdlciA6PSAtMTsgLS0gaG91ciBsYXN0IGRpc3BsYXllZAogICBEaXNwbGF5X01pbiAgIDogSW50ZWdlciA6PSAtMTsgLS0gbWludXRlIGxhc3QgZGlzcGxheWVkCiAgIERpc3BsYXlfRGF5ICAgOiBJbnRlZ2VyIDo9IC0xOyAtLSBkYXkgbGFzdCBkaXNwbGF5ZWQKICAgRGlzcGxheV9Nb250aCA6IEludGVnZXIgOj0gLTE7IC0tIG1vbnRoIGxhc3QgZGlzcGxheWVkCgogICAtLSAgVGhpcyBpcyB0aGUgcm91dGluZSBoYW5kZWQgb3ZlciB0byB0aGUgY3Vyc2VzIGxpYnJhcnkgdG8gYmUgY2FsbGVkCiAgIC0tICBhcyBpbml0aWFsaXphdGlvbiByb3V0aW5lIHdoZW4gcmlwcGluZyBvZiB0aGUgaGVhZGVyIGxpbmVzIGZyb20KICAgLS0gIHRoZSBzY3JlZW4uIFRoaXMgcm91dGluZSBtdXN0IGZvbGxvdyBDIGNvbnZlbnRpb25zLgogICBmdW5jdGlvbiBJbml0X0hlYWRlcl9XaW5kb3cgKFdpbiAgICAgOiBXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyA6IENvbHVtbl9Db3VudCkgcmV0dXJuIEludGVnZXI7CiAgIHByYWdtYSBDb252ZW50aW9uIChDLCBJbml0X0hlYWRlcl9XaW5kb3cpOwoKICAgcHJvY2VkdXJlIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93IChEb19VcGRhdGUgOiBpbiBCb29sZWFuKTsKCiAgIC0tICBUaGUgaW5pdGlhbGl6YXRpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEluaXRfU2NyZWVuLiBJdCBzdGVhbHMgdHdvCiAgIC0tICBsaW5lcyBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KICAgcHJvY2VkdXJlIEluaXRfSGVhZGVyX0hhbmRsZXIKICAgaXMKICAgYmVnaW4KICAgICAgUmlwX09mZl9MaW5lcyAoMiwgSW5pdF9IZWFkZXJfV2luZG93J0FjY2Vzcyk7CiAgIGVuZCBJbml0X0hlYWRlcl9IYW5kbGVyOwoKICAgcHJvY2VkdXJlIE5fT3V0IChOIDogaW4gSW50ZWdlcik7CgogICAtLSAgRW1pdCBhIHR3byBkaWdpdCBudW1iZXIgYW5kIGVuc3VyZSB0aGF0IGEgbGVhZGluZyB6ZXJvIGlzIGdlbmVyYXRlZCBpZgogICAtLSAgbmVjZXNzYXJ5LgogICBwcm9jZWR1cmUgTl9PdXQgKE4gOiBpbiBJbnRlZ2VyKQogICBpcwogICBiZWdpbgogICAgICBpZiBOIDwgMTAgdGhlbgogICAgICAgICBBZGQgKEhlYWRlcl9XaW5kb3csICcwJyk7CiAgICAgICAgIFB1dCAoSGVhZGVyX1dpbmRvdywgTiwgMSk7CiAgICAgIGVsc2UKICAgICAgICAgUHV0IChIZWFkZXJfV2luZG93LCBOLCAyKTsKICAgICAgZW5kIGlmOwogICBlbmQgTl9PdXQ7CgogICAtLSAgUGFpbnQgdGhlIGhlYWRlciB3aW5kb3cuIFRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgYSBmbGFnIGluZGljYXRpbmcKICAgLS0gIHdoZXRoZXIgb3Igbm90IHRoZSBzY3JlZW4gc2hvdWxkIGJlIHVwZGF0ZWQgcGh5c2ljYWxseSBhZnRlciBwYWludGluZy4KICAgcHJvY2VkdXJlIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93IChEb19VcGRhdGUgOiBpbiBCb29sZWFuKQogICBpcwogICAgICB0eXBlIE1vbnRoX05hbWVfQXJyYXkgaXMKICAgICAgICAgYXJyYXkgKE1vbnRoX051bWJlcidGaXJzdCAuLiBNb250aF9OdW1iZXInTGFzdCkgb2YgU3RyaW5nICgxIC4uIDkpOwoKICAgICAgTW9udGhfTmFtZXMgOiBjb25zdGFudCBNb250aF9OYW1lX0FycmF5IDo9CiAgICAgICAgKCJKYW51YXJ5ICAiLAogICAgICAgICAiRmVicnVhcnkgIiwKICAgICAgICAgIk1hcmNoICAgICIsCiAgICAgICAgICJBcHJpbCAgICAiLAogICAgICAgICAiTWF5ICAgICAgIiwKICAgICAgICAgIkp1bmUgICAgICIsCiAgICAgICAgICJKdWx5ICAgICAiLAogICAgICAgICAiQXVndXN0ICAgIiwKICAgICAgICAgIlNlcHRlbWJlciIsCiAgICAgICAgICJPY3RvYmVyICAiLAogICAgICAgICAiTm92ZW1iZXIgIiwKICAgICAgICAgIkRlY2VtYmVyICIpOwoKICAgICAgTm93ICAgIDogY29uc3RhbnQgVGltZSAgICAgICAgIDo9IENsb2NrOwogICAgICBTZWMgICAgOiBjb25zdGFudCBJbnRlZ2VyICAgICAgOj0gSW50ZWdlciAoU2Vjb25kcyAoTm93KSk7CiAgICAgIEhvdXIgICA6IGNvbnN0YW50IEludGVnZXIgICAgICA6PSBTZWMgLyAzNjAwOwogICAgICBNaW51dGUgOiBjb25zdGFudCBJbnRlZ2VyICAgICAgOj0gKFNlYyAtIEhvdXIgKiAzNjAwKSAvIDYwOwogICAgICBNb24gICAgOiBjb25zdGFudCBNb250aF9OdW1iZXIgOj0gTW9udGggKE5vdyk7CiAgICAgIEQgICAgICA6IGNvbnN0YW50IERheV9OdW1iZXIgICA6PSBEYXkgKE5vdyk7CiAgIGJlZ2luCiAgICAgIGlmIEhlYWRlcl9XaW5kb3cgLz0gTnVsbF9XaW5kb3cgdGhlbgogICAgICAgICBpZiBNaW51dGUgLz0gRGlzcGxheV9NaW4gb3IgZWxzZSBIb3VyIC89IERpc3BsYXlfSG91cgogICAgICAgICAgIG9yIGVsc2UgRGlzcGxheV9EYXkgLz0gRCBvciBlbHNlIERpc3BsYXlfTW9udGggLz0gTW9uIHRoZW4KICAgICAgICAgICAgTW92ZV9DdXJzb3IgKEhlYWRlcl9XaW5kb3csIDAsIDApOwogICAgICAgICAgICBOX091dCAoRCk7IEFkZCAoSGVhZGVyX1dpbmRvdywgJy4nKTsKICAgICAgICAgICAgQWRkIChIZWFkZXJfV2luZG93LCBNb250aF9OYW1lcyAoTW9uKSk7CiAgICAgICAgICAgIE1vdmVfQ3Vyc29yIChIZWFkZXJfV2luZG93LCAxLCAwKTsKICAgICAgICAgICAgTl9PdXQgKEhvdXIpOyBBZGQgKEhlYWRlcl9XaW5kb3csICc6Jyk7CiAgICAgICAgICAgIE5fT3V0IChNaW51dGUpOwogICAgICAgICAgICBEaXNwbGF5X01pbiAgIDo9IE1pbnV0ZTsKICAgICAgICAgICAgRGlzcGxheV9Ib3VyICA6PSBIb3VyOwogICAgICAgICAgICBEaXNwbGF5X01vbnRoIDo9IE1vbjsKICAgICAgICAgICAgRGlzcGxheV9EYXkgICA6PSBEOwogICAgICAgICAgICBSZWZyZXNoX1dpdGhvdXRfVXBkYXRlIChIZWFkZXJfV2luZG93KTsKICAgICAgICAgICAgaWYgRG9fVXBkYXRlIHRoZW4KICAgICAgICAgICAgICAgVXBkYXRlX1NjcmVlbjsKICAgICAgICAgICAgZW5kIGlmOwogICAgICAgICBlbmQgaWY7CiAgICAgIGVuZCBpZjsKICAgZW5kIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93OwoKICAgLS0gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgaW4gdGhlIGtleWJvYXJkIGlucHV0IHRpbWVvdXQgaGFuZGxlci4gU28gaXQgd2lsbAogICAtLSAgcGVyaW9kaWNhbGx5IHVwZGF0ZSB0aGUgaGVhZGVyIGxpbmUgb2YgdGhlIHNjcmVlbi4KICAgcHJvY2VkdXJlIFVwZGF0ZV9IZWFkZXJfV2luZG93CiAgIGlzCiAgIGJlZ2luCiAgICAgIEludGVybmFsX1VwZGF0ZV9IZWFkZXJfV2luZG93IChUcnVlKTsKICAgZW5kIFVwZGF0ZV9IZWFkZXJfV2luZG93OwoKICAgZnVuY3Rpb24gSW5pdF9IZWFkZXJfV2luZG93IChXaW4gICAgIDogV2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMgOiBDb2x1bW5fQ291bnQpIHJldHVybiBJbnRlZ2VyCiAgIGlzCiAgICAgIFRpdGxlICA6IGNvbnN0YW50IFN0cmluZyA6PSAiQWRhIDk1IG5jdXJzZXMgQmluZGluZyBTYW1wbGUiOwogICAgICBQb3MgICAgOiBDb2x1bW5fUG9zaXRpb247CiAgIGJlZ2luCiAgICAgIEhlYWRlcl9XaW5kb3cgOj0gV2luOwogICAgICBpZiBXaW4gLz0gTnVsbF9XaW5kb3cgdGhlbgogICAgICAgICBpZiBIYXNfQ29sb3JzIHRoZW4KICAgICAgICAgICAgU2V0X0JhY2tncm91bmQgKFdpbiA9PiBXaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaCAgPT4gKENoICAgID0+ICcgJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgPT4gSGVhZGVyX0NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyICA9PiBOb3JtYWxfVmlkZW8pKTsKICAgICAgICAgICAgU2V0X0NoYXJhY3Rlcl9BdHRyaWJ1dGVzIChXaW4gICA9PiBXaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciAgPT4gTm9ybWFsX1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yID0+IEhlYWRlcl9Db2xvcik7CiAgICAgICAgICAgIEVyYXNlIChXaW4pOwogICAgICAgICBlbmQgaWY7CiAgICAgICAgIExlYXZlX0N1cnNvcl9BZnRlcl9VcGRhdGUgKFdpbiwgVHJ1ZSk7CiAgICAgICAgIFBvcyA6PSBDb2x1bW5zIC0gQ29sdW1uX1Bvc2l0aW9uIChUaXRsZSdMZW5ndGgpOwogICAgICAgICBBZGQgKFdpbiwgMCwgUG9zIC8gMiwgVGl0bGUpOwogICAgICAgICAtLSAgSW4gdGhpcyBwaGFzZSB3ZSBtdXN0IG5vdCBhbGxvdyBhIHBoeXNpY2FsIHVwZGF0ZSwgYmVjYXVzZQogICAgICAgICAtLSAgbmN1cnNlcyBpc260dCBwcm9wZXJseSBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LgogICAgICAgICBJbnRlcm5hbF9VcGRhdGVfSGVhZGVyX1dpbmRvdyAoRmFsc2UpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgZWxzZQogICAgICAgICByZXR1cm4gLTE7CiAgICAgIGVuZCBpZjsKICAgZW5kIEluaXRfSGVhZGVyX1dpbmRvdzsKCmVuZCBTYW1wbGUuSGVhZGVyX0hhbmRsZXI7Cg==